概要
前回:
今回はnginxをアプリケーションサーバとして利用するため、その動作の仕組みと設定方法を調査した。
nginxでアプリケーションが動く仕組み
内部/外部実行
ApacheをAppサーバとして動作させる場合、その方法は大きく2つあった。
-
- 内部実行。
mod_*
を使って、Apache自身がアプリケーションを実行する
- 内部実行。
-
- 外部実行。CGIなどのAPIを使って、別のAppサーバにアプリケーションを実行させる
nginxは、アプリケーションを__内部実行する仕組みを持たない__ため、2. 外部実行の形でアプリケーションを動かす。
つまり__nginx自体にAppサーバの機能は無く__、nginx(Webサーバ)とAppサーバを組み合わせることで、1台のWeb兼Appサーバとして動作する。
APIの種類
WebサーバとAppサーバを接続するためのAPIには復数の仕様があり、nginxはそれらに対応している。
FastCGI
- 汎用のインタフェース。CGIの改良版
- 旧来のCGIと異なり、アプリケーションプロセスが常時起動しているため低負荷、高速
- TCP通信のほか、同じOS内の場合はIPCソケットでも通信可能
Python WSGI
- Python用のWeb API
Ruby Rack
- Ruby用のWeb API
などなど。
Appサーバの種類
APIの実装であるAppサーバも、対応するAPIと言語の組み合わせにより様々ある。
php-fpm
- fpm =FastCGI Process Manager
- FastCGIのAppサーバ
- nginxでPHPを動かす場合はこれがメジャーな様子
Passenger
- 別名
mod_rails
。もともとはApacheでrails(ruby)を内部実行するためのモジュール - スタンドアロンモードを備えており、これによってRackサーバとして動作する
- Ruby on Rails標準採用
- Python / WSGIも使える
uWSGI
- WSGIのAppサーバ
- WSGI準拠であればPythonにかぎらず復数言語で利用できる(っぽい)
などなど。
設定方法
設定の詳細は選択した言語やAppサーバによりけりだが、共通した手順としては以下:
1. Appサーバをたてる
利用したい言語環境により、適切なAppサーバを選択し構築する。
構築したAppサーバはサービス(デーモン)としてサーバOS上に常駐させる。
2. nginxからAppサーバを接続する
特定のアクセスがあった場合にAppサーバが呼び出されるよう、nginxの設定ファイルを変更する。
-
設定項目はAPI単位で別のモジュールとして構成されていて、
fastcgi_*
,uwsgi_*
のように異なるディレクティブを使う。 -
またPassengerのように、nginx標準ではなく、サードパーティのnginxモジュールが提供されていることもある。
以下は、php-fpm(FastCGI)で構築したサーバに接続する設定例:
http{
server{
# .phpとつくURLにアクセスがあった場合の設定
location ~ \.php${
# FastCGIサーバのIPとポート番号
# localhost(127.0.0.1)の9000ポートを指定
# 外部サーバでもいい
fastcgi_pass 127.0.0.1:9000;
# FastCGIにおけるindexファイルの指定
fastcgi_index index.php;
# ファイル名をFastCGIサーバに変数として渡す
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# nginx標準のFastCGI用設定ファイル(/etc/nginx/fastcgi_param)の読込み
include fastcgi_params;
}
}
}
注意点
nginxはAppサーバの冗長化ができないらしい。
そもそもAppサーバが1台で間に合うような中小規模サイトであればApacheで間に合ってしまうわけなので、nginxを利用する状況においては、Appサーバをスケールさせたいケースが多いように思える。
nginxにAppサーバを直結するのではなく、webサーバ+Appサーバを1台のサーバとしてまとめておき、それをnginxでロードバランシングするやり方のほうが適切なのかもしれない。
なおRailsの設定例などを調べてみても、今回まとめたような
nginx(Webサーバ) → Passenger(Appサーバ) → Rails
の直結型ではなく、
nginx(ロードバランサ) → unicorn(Webサーバ) → Passenger(Appサーバ) → Rails
の構成例が多かった。
参考
仕組み
- Why is FastCGI /w Nginx so much faster than Apache /w mod_php?
- Qiita - Rails開発におけるwebサーバーとアプリケーションサーバーの違い(翻訳)
- Qiita - nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する
- php-fpm
- uWSGI
- Wikipedia - Phusion Passenger