そろそろApacheからNginxに移行したい人の、Nginx スターティング・ガイド

AV女優.com は7月1日に、 Apache から Nginx にウェブサーバを切り替えました。
理由は簡単で、少しでもパフォーマンスを上げるためです。
あまり収益も上がっていないので ( 先月の収益報告 ) 、サーバ費用を捻出出来ません。

今日は、私が ApacheからNginxにウェブサーバを移行するために、掻き集めた情報 をまとめていきます。

Nginxに移行すべき理由

Nginxはパフォーマンスが良い と言われています。

しかし、本当にパフォーマンス良いのか?
また、本当にApacheからNginxに切り替えて、問題がないのか?

blog@a2o.siApacheBenchを使ったベンチマーク が分かりやすくまとまっています。

Apache + mod_php compared to Nginx + php-fpm
NginxでPHPを走らせる場合のバックエンドサーバとなるphp-fpmとApacheのmod_phpや、静的ファイルの処理性能を比較しています。
静的ファイルに関しても、 13バイト/100kバイト/1Mバイトの3種類のファイルサイズ で比較しています。

ここで分かる結果は、

  • PHPの処理性能は、 Nginx + php-fpmがApache + mod_rewriteに劣る
  • 静的ファイルの処理性能は、 ApacheよりもNginxのほうが圧倒的に高い

ということです。
PHPの処理性能に関して、この記事では、 サーバに余分なプロセス(php-fpm)が増えるんだから、Nginxのほうが遅くて当たり前だよね とまとめられています。

また、最終的な判断基準として、以下の6点を考えるべきだと言っています。

  1. たくさんの.htaccessファイル か、あるいは、 たくさんのApacheサーバ を所有しているのなら、Nginxに移行するべきではないでしょう。これらの設定ファイルを全て、Nginx形式に書き換えるコストよりも、新しいサーバを買うコストの方が安いでしょうね。
  2. もし、単体のアプリケーションを複数のサーバで配信していて、しかも、 その大半が静的ファイルでない場合 、Nginxに移行するべきではないでしょう。
  3. 逆に、 配信するファイルの大半が、静的ファイルである場合 、Nginxに移行するべきでしょう。
  4. 新たなウェブホスティングサービスを立ち上げる場合、Nginxに移行するべきでしょう。ただし、利用するユーザが .htaccessを必要としない場合に
  5. 仮想サーバ上でウェブサービスを運用する場合 、Nginxに移行するべきでしょう。Nginxが利用するメモリが、Apacheよりも少ないためです。
  6. もし、PHPアプリケーションのパフォーマンスが悪いために、Nginxの切り替えを考えているなら、ウェブサーバでなく、まずは アプリケーション自体を見直しましょう

当たり前といえば、当たり前ですが、最後の基準が大事ですね。
Nginxは高速化のための、 銀の弾丸 ではないということです。

移行する理由はパフォーマンスだけでしょうか?
Apacheと比べた場合の、Ngixの優位性として、そのシンプルな 設定ファイル が上げられます。
私が始めに感動したのは、 NginxHttpRewriteModule (Apacheのmod_rewrite) です。

HttpRewriteModule
HttpRewriteModuleの公式ドキュメントです。
条件を指定するディレクティブが、 if文 になっており、直感的です。
Apache Module mod_rewrite
Apacheのmod_rewriteモジュールの公式ドキュメントです。
ドキュメント自体もNginxのHttpRewriteModuleと比べて長く、わかりにくいです。

例えば、ユーザエージェントを判定する場合、Apacheの設定ファイルは次のようになります:

RewriteEngine OnRewriteCond %{HTTP_USER_AGENT} Android  [NC,OR]RewriteCond %{HTTP_USER_AGENT} iPod     [NC,OR]RewriteCond %{HTTP_USER_AGENT} iPhone   [NC]RewriteRule ^(.*)$ /m/$1 [L]

Nginxの場合は次のようになります:

if ($http_user_agent ~* Android|iPod|iPhone) {    rewrite (.*) /m$1;}

設定の意図がわかりやすいのは、Nginxです。
Apacheの場合、RewriteCondやRewriteRuleの意味と挙動を完全に知っている必要があります。
しかし、Nginxの場合、if文で書かれているため、 それとなく意味が分かります

是非、Nginxの設定ファイルを覗いてみてください。
きっと、惚れてしまいます。

NginxにApacheから移行するか否かは、 始めに紹介したブログの基準 を参考にすると良いでしょう。

AV女優.com には、ページ数が7,000弱あります。
これらの8割のページを、静的キャッシュしていることから、Nginxに切り替えました。
また、画像数も多いことも、決め手の一つでした。

PHPとPythonを走らせる

NginxでPHPやPythonを走らせるためには、Apacheと異なり、 バックエンドサーバ が必要です。
PHPであれば php-fpm が、Pythonであれば uWSGI が、これにあたります。

/img/posts/008/nginx_with_php-fpm_or_uwsgi.png

また、 Apache をバックエンドサーバとして、以下の構成を取ることも出来ます。

/img/posts/008/nginx_with_apache.png

つまり、今まで通りApacheは走らせておいて、Nginxにリクエストを処理させる方法ですね。
このための設定は、このページが参考になります。

Configuring Apache and Nginx
Apacheをバックエンドサーバとして走らせるための設定がステップ・バイ・ステップでまとまっています。

php-fpmでもuWSGIでも、Apacheでも、バックエンドサーバが異なるだけで、 全て同じ構成 です。
Nginxは、 静的ファイル だけ配信し、動的ページへのリクエストは、バックエンドサーバに丸投げします。

UbuntuにNginxをインストールする

実際にNginxをインストールします。
ここでは、パッケージが公式に用意されており、インストールがとても楽な Ubuntu を使います。

Nginx/php-fpm/uWSGIは全て LaunchPad にリポジトリがあります。

Nginx
Nginxの公式リポジトリです。最新のNginxが簡単にインストール出来ます。
php-fpm
Nginxが管理しているphp-fpmのリポジトリです。php-fpmが組み込まれた、PHP5.3が簡単にインストール出来ます。
uWSGI
uWSGIのリポジトリです。恐らく公式ではありませんが、uWSGI v0.9.6をインストール出来ます。

まずは、 Nginx をインストールします:

$ sudo apt-get install -y python-software-properties$ sudo add-apt-repository ppa:nginx/stable$ sudo apt-get update$ sudo apt-get install -y nginx

次に、 php-fpm をインストールします:

$ sudo add-apt-repository ppa:nginx/php5$ apt-get update$ apt-get install -y php5-fpm

最後に、 uWSGI をインストールします:

$ add-apt-repository ppa:uwsgi/release$ apt-get update$ apt-get install -y uwsgi-python

インストールはこれだけです。
簡単ですね。

続いて設定です。
まずは、 PHP を動かしてみます。
以下のファイルを /etc/nginx/sites-available/php-default に設置します:

server {    # 8080ポートで待ち受ける。    listen      8080;    server_name localhost;    # 静的ファイルは/var/www/php-default以下に配置する。    root  /var/www/php-default;    index index.html index.htm;    access_log /var/log/nginx/php-default.access.log;    error_log  /var/log/nginx/php-default.error.log;    # PHPスクリプトは、9000ポートで待ち受けているphp-fpmに問い合わせる。    location ~ .php$ {        include       fastcgi_params;        fastcgi_pass  127.0.0.1:9000;        fastcgi_index index.php;        fastcgi_param SCRIPT_FILENAME /var/www/php-default$fastcgi_script_name;        fastcgi_intercept_errors on;    }}

設定を有効にし、 Nginxphp-fpm を起動します:

$ sudo ln -s /etc/nginx/sites-available/php-default /etc/nginx/sites-enabled$ sudo /etc/init.d/nginx start$ sudo /etc/init.d/php5-fpm start

サーバの8080ポートにアクセスすると、設置したPHPスクリプトの結果が表示されるはずです。

続いて、 Python を動かしてみます(ここではマイクロフレームワークflaskを動かします)。

始めに uWSGI を設定します。
以下のファイルを /etc/uwsgi-python/apps-available/app.xml に設置します:

<uwsgi>    <socket>127.0.0.1:9001</socket>    <env>FLASK_ENV=development</env>    <pythonpath>/srv/flask</pythonpath>    <module>app</module>    <callable>app</callable></uwsgi>

次に、 Nginx を設定します。
以下のファイルを /etc/nginx/sites-available/python-default に設置します:

server {    # 8090ポートで待ち受ける。    listen       8090;    server_name  localhost;    # 静的ファイルは/var/www/python-default以下に配置する。    root   /var/www/python-default;    index  index.html index.htm;    access_log  /var/log/nginx/python-default.access.log;    error_log   /var/log/nginx/python-default.error.log;    # uWSGIがページを提供出来るか、問い合わせる。    # 提供出来ない場合、/var/www/python-defaultから、静的ファイルを配信する。    location / {        try_files $uri @uwsgi;    }    # 静的ファイル以外は、9001ポートで待ち受けているuWSGIに問い合わせる。    location / {        include     uwsgi_params;        uwsgi_pass  127.0.0.1:9001;    }}

設定を有効にし、 uWSGI を起動します:

$ sudo ln -s /etc/nginx/sites-available/python-default /etc/nginx/sites-enabled$ sudo /etc/init.d/nginx reload$ sudo /etc/init.d/uwsgi-python start

サーバの8090ポートにアクセスすると、設置したPythonスクリプトの結果が表示されるはずです。

動かすための最小限の設定はこんなところです。
その他の設定は次にまとめたサイトを参考に、調整してください。

参考になる各種設定

以下にNginxを設定する際に 参考になる記事 をまとめます。

設定に関するTIPS

Nginx Pitfalls
公式ドキュメントの設定例です。一度、目を通しておきましょう。
悪い設定例と良い設定例を比較しながらの説明です。
nginxでメンテナンス中画面を表示する
Nginxで メンテナンスページ を表示するための設定です。
エラーページをディレクティブを使って、あっさりと設定出来ます。
nginxのHttpLimitReqModuleを試してみる
Web APIを公開すると必要となる、 アクセス制限 をNginxの標準モジュールで設定しています。
1秒間に1回のリクエストを許可する、といったことを簡単に設定出来ます。
RapidSSL 発行の SSL 証明書を Nginx で使う
NginxとApacheのSSL設定は若干、異なります。
RapidSSLを例に、Nginxの SSL設定 が解説されています。
Serving an iPhone website with nginx
Nginxで iPhoneサイト を運用するための設定集です。
ユーザエージェントはもちろんんこと、Cookieを使った振り分けから、様々な設定が解説されています。

環境構築

nginx+php-fpmをyumでインストールして、WordPress/CakePHPを動かす設定
WordPressCakePHP をNginxで動かすための設定です。
ステップ・バイ・ステップでわかりやすく書かれており、参考になります。
Nginx Logwatch Configuration
Nginxをサーバ監視ツール logwatch に対応させるための設定です。
ログはApacheと同じCombined形式であるため、簡単に対応させることが出来ます。

パフォーマンスチューニング

Optimize Nginx + PHP-FPM for faster response times (for Openx adserving)
StackOverflowで投稿された パフォーマンスチューニング に関する質問です。
Nginxのパフォーマンスチューニングの基本がわかります。
How-to: NGINX efficiency tricks
こちらも パフォーマンスチューニング の参考になります。
効果的な設定が6つ紹介されています。

全般

ハイパフォーマンスHTTPサーバ Nginx入門
日本語で書かれた唯一の書籍です。
私はまだ読んでいませんが、 サーバスペック別に書かれた設定サンプル が参考になりそうです。

Nginxの簡単な設定と、参考になる記事をまとめました。
他にも、有用な情報があればコメント欄までお願いします。
追記させて頂きます。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中