「Django 1.5 Application Developments Starter」を読んでましたら、最後の章にDjangoで構築したWebアプリケーションをuWSGIを使ってNginxを搭載したWebサーバーにデプロイする方法が書かれていました。Nginxはロシアで開発されている高速、軽量、多機能なWebサーバーで、近年の普及度が急激に上昇しています。
これまで、開発環境を使って作ったWebアプリケーションをWebサーバーにデプロイすることで四苦八苦していましたが、NginxとuWSGI(Web Server Gateway Interface)を使って非常に簡単にデプロイできることで、感心しました。また、NginxはPHPも動作させることができるほか、簡便かつ実用的なロードバランサーが構築できます。これからは、Nginxの時代かも知れません。ということで、これらの話題を数回に分けて投稿していくことにします。
NginxとDjangoの相性は極めて宜しいようです。
また、LAMPならぬLNMP環境の構築も極めて簡単です。
最近は、WebサーバーのシェアでMicrosoftのIISを追い抜いているようです。
以下、Wikipediaでの紹介です。
======================================================
nginx自体は、静的コンテンツ(つまりサーバ上のファイル)を高速に配信するように設計されている。さらに、各種のウェブアプリケーション用インターフェース(FastCGI, uWSGI, Phusion Passengerなど)が標準で組み込まれているため、これらに対応したサーバと協調することで、動的なHTTPコンテンツをデプロイすることもできる。また、リバースプロキシの機能を持つため、ソフトウェアロードバランサ[3]やHTTPキャッシュとして使用することもできる。
Apache HTTP Serverがリクエストの処理にデフォルトでスレッドやプロセス指向のアプローチを用いている一方で、nginxは非同期のイベント駆動アプローチを用いている。イベント駆動によるアプローチは、高負荷下において、より予測可能なパフォーマンスを提供すると考えられている[4]。
======================================================
プロキシ(Proxy)という英語は「代理人」という意味ですが、サイト管理者はむしろ、「中継人」の意味のほうがより適切ではないかと思ったりしています。プロキシ・サーバー(中継サーバー)にはフォワードプロキシ・サーバー(普通のプロキシ・サーバー)とリバースプロキシ・サーバーがあります。前者は、社内/SOHOのLANのクライアントからゲートウェイを通してインターネット上のサーバーにアクセスする場合、プロキシ・サーバーが中継機能を持ち、ゲートウェイを通して外部にアクセスします。キャッシュ機能を持っていますので、クライアントが一度アクセスしたサイトのデータが蓄積されており、LAN内のクライアントは「高速」にインターネット上のサーバーにアクセスできます。
これに対して、リバースプロキシ・サーバーは、外部のクライアントから社内/SOHOのDMZ(非武装地帯)に置いたサーバーへのアクセスを中継(振り分ける)し、条件に従って該当の社内サーバーにつなぐ役割を持ちます。Webサーバーのそっくりさんを複数台設置しておけば、一台のサーバーにアクセスが集中するのを防ぐ「負荷分散システム」の要(かなめ)、つまり、「ロードバランサー」として機能します。Nginxはこのリバースプロキシ・サーバーとしても実用的に使えます。
以下はロードバランサーの概念図です。
Nginxに取り組んでみましょう。
技術評論社の月刊誌「ソフトウェアデザイン」の最新号(2014年7月号)でNginxの特集「Nginxへの移行を考えているあなたに」を行っています。非常に分かりやすく説明しています。その中でHTTPサーバーを、その処理方式によって分類し、メリット・デメリットを記載しています(26頁)ので、引用させていただきました。なお、ApacheにPHPを組み込むと、ApacheはPreforkでしか動作しないようです。
方式 | 処理主体 | メリット | デメリット | 対応例 |
プロセスベース方式 | プロセス | シンプルで実装が簡単 | 大量の物理メモリが必要 | Apache(Prefork) |
スレッド駆動方式 | プロセスとスレッドのハイブリッド | 省メモリ、設定次第でそこそこ高速 | イベント駆動方式より性能限界が早い | Apache(Worker) |
イベント駆動方式 |
マスタープロセスがクライアントを待ち受けし、ワーカープロセスが実際に応答 | マスタープロセスの実装が比較的簡単 | マスタープロセスがボトルネックになる | Lighttpd |
イベント駆動方式 (ワーカープロセスがクライアント対応) |
ワーカープロセスがクライアントの待ち受けと応答をする | 最も省メモリ。CPUコアをフルにつかいこなすとかなり高速 | 実装が非常に難しい | Nginx |
日本語の公式・関連サイト・参考文献は、
なお、ソフトウェアデザインの2014年7月号の特集「Nginxへの移行を考えているあなたに」はNginxの豊富な運用経験を蓄積している著者たちによる非常に分かりやすく、ためになる特集です。最初に読むべきはこちらでしょう。次に、上記二冊が良書だと思います。オライリー本が一番最近のものですが、原書は本国でもよく売れているようですし、翻訳者はSambaの日本の第一人者である高橋基信さんです。ASCIIの著作は、日本で最初にNginxを紹介したもので、訳者の長尾高弘さんには、敬意を表します。