AV女優.com は7月1日に、 Apache から Nginx にウェブサーバを切り替えました。
理由は簡単で、少しでもパフォーマンスを上げるためです。
あまり収益も上がっていないので ( 先月の収益報告 ) 、サーバ費用を捻出出来ません。
今日は、私が ApacheからNginxにウェブサーバを移行するために、掻き集めた情報 をまとめていきます。
Nginxに移行すべき理由
Nginxはパフォーマンスが良い と言われています。
しかし、本当にパフォーマンス良いのか?
また、本当にApacheからNginxに切り替えて、問題がないのか?
blog@a2o.si で ApacheBenchを使ったベンチマーク が分かりやすくまとまっています。
- 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点を考えるべきだと言っています。
- たくさんの.htaccessファイル か、あるいは、 たくさんのApacheサーバ を所有しているのなら、Nginxに移行するべきではないでしょう。これらの設定ファイルを全て、Nginx形式に書き換えるコストよりも、新しいサーバを買うコストの方が安いでしょうね。
- もし、単体のアプリケーションを複数のサーバで配信していて、しかも、 その大半が静的ファイルでない場合 、Nginxに移行するべきではないでしょう。
- 逆に、 配信するファイルの大半が、静的ファイルである場合 、Nginxに移行するべきでしょう。
- 新たなウェブホスティングサービスを立ち上げる場合、Nginxに移行するべきでしょう。ただし、利用するユーザが .htaccessを必要としない場合に 。
- 仮想サーバ上でウェブサービスを運用する場合 、Nginxに移行するべきでしょう。Nginxが利用するメモリが、Apacheよりも少ないためです。
- もし、PHPアプリケーションのパフォーマンスが悪いために、Nginxの切り替えを考えているなら、ウェブサーバでなく、まずは アプリケーション自体を見直しましょう 。
当たり前といえば、当たり前ですが、最後の基準が大事ですね。
Nginxは高速化のための、 銀の弾丸 ではないということです。
移行する理由はパフォーマンスだけでしょうか?
Apacheと比べた場合の、Ngixの優位性として、そのシンプルな 設定ファイル が上げられます。
私が始めに感動したのは、 NginxHttpRewriteModule (Apacheのmod_rewrite) です。
- HttpRewriteModule
- HttpRewriteModuleの公式ドキュメントです。
条件を指定するディレクティブが、 if文 になっており、直感的です。 - Apache Module mod_rewrite
- Apacheのmod_rewriteモジュールの公式ドキュメントです。
ドキュメント自体もNginxのHttpRewriteModuleと比べて長く、わかりにくいです。
例えば、ユーザエージェントを判定する場合、Apacheの設定ファイルは次のようになります:
RewriteEngine On RewriteCond %{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 が、これにあたります。
また、 Apache をバックエンドサーバとして、以下の構成を取ることも出来ます。
つまり、今まで通り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; } }
設定を有効にし、 Nginx と php-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を動かす設定
- Wordpress と CakePHP を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の簡単な設定と、参考になる記事をまとめました。
他にも、有用な情報があればコメント欄までお願いします。
追記させて頂きます。