ソフトウェア開発で英語は必須だと改めて実感したbokkoです。
- 英語の技術書を読んでいる
- 日本人の開発者が作ったソフトウェアに付属している仕様書を読んだら英語で書かれていた
- 日本人の開発者宛に英語でバグレポートを書いていることに気付く(フォーラム全体が英語だった!)
私も自分の書いたライブラリのドキュメントを書き始めましたが、
全部英語だったりします。(少し前に海外の方からライセンスに関する質問を「英語」で受けました)
そして、今日紹介するnginxも開発元はロシアですが、英語のドキュメントが充実しています。
nginxとは
nginxは高速軽量なWebサーバです。(えんじんえっくすと読みます)
基本的なHTTPとしての機能に加えてSSLやFastCGIのサポート、
リバースプロキシ、バーチャルホスト、メールプロキシといった
便利な機能も兼ね備えています。開発元はロシアですが、
ロシア語だけでなく、英語や日本語を含む複数の言語に翻訳されているWikiがあります。
インストール
ソースコードからビルドします。(ここで使用しているバージョンは0.7.61です)
$ ./configure $ make $ sudo make install
nginxが使用する外部モジュール
nginxでURI書き換えやgzip圧縮、SSLといった機能を使用するには
外部のモジュールが必要になります。例えばCentOSではそれぞれ
以下のモジュールをyum等でインストールする必要があります。
URI書き換え | pcre-devel |
gzip圧縮 | zlib-devel |
SSL | open-ssl-devel |
cofigure時に指定するオプション
nginxはconfigure時にpcreはデフォルトで使用するようになっていますが、
URI書き換え機能を使わない場合は--without-pcreを指定することで、無効にできます。
また、SSLを使用する際は--with-http_ssl_moduleを指定するのがよいでしょう。
その他のconfigure時のオプションはWikiの以下のページが参考になります。
Compile-time options
nginxの設定
ここではnginxで設定する主要なパラメータについて解説します。
worker_processesとworker_connections
worker_processesとworker_connectionsはApacheのMaxClientsに相当するパラメータです。
まず、worker_processesですが、これはnginxを起動した後に常駐し、
クライアントのアクセスを受け付けるワーカーの数です。
worker_connectionsは1つのワーカーが扱えるクライアントの最大数になります。
つまりものすごく単純化すると、nginxのmax_clientsは、
max_clients = worker_processes * worker_connections
ということになります。worker_connectionsはeventsディレクティブ内に以下のように記述します。
events { worker_connections 1024; use epoll; }
useの部分にはnginxが使用するイベントモデルを指定します。
上記のepollのほかにおなじみのselectやkqueue等があります。
また、このあたりのより詳しい設定についてはWikiにあるNginxHttpEventsModulesのページが参考になります。
リバースプロキシとして使う
nginxをリバースプロキシとして動作させる場合の設定例は以下のようになります。
プロキシの後ろにWebサーバ2台(10.0.0.11と10.0.0.12)がぶら下がってるとすると、($nameと$domain_nameは任意)
http { upstream $name { server 10.0.0.11:80 weight=3; server 10.0.0.12:80 weight=3; } server { listen 80; server_name $domain_name; location / { proxy_pass http://$name; } } }
という風になります。
プロキシにアクセスしてきたクライアントのIPアドレスをWebサーバに引き継ぐ
通常、クライアントがプロキシサーバにアクセスし、
プロキシサーバがそのリクエストをWebサーバに渡す場合、
Webサーバに記録されるIPアドレスはプロキシサーバのものとなります。
携帯向けサービスでは特にキャリアの種類やPCか携帯からのアクセスか?等によって
処理を振り分ける必要があるので、Webサーバには元のIPアドレスを渡したい
ケースがあります。これを実現するには以下の設定を記述します。
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
また、プロキシにぶら下がっているWebサーバがApacheの場合、
mod_extract_forwardedやmod_rpaf等を使うことによって
リバースプロキシ越しのIPアドレスを取得できます。
mod_extract_forwardedを使う場合、
Apacheの設定ファイルには以下のように記述します。
MEForder refuse,accept MEFrefuse all MEFaccept x.x.x.x # プロキシのIPアドレス
nginxでSSL
nginxでSSLを使うにはhttpディレクティブ内に以下のような記述をします($nameと$domain_nameは任意)。
server { listen 443; server_name $domain_name; ssl on; ssl_certificate (サーバ証明書へのパス) ssl_certificate_key (秘密鍵へのパス) ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location / { root /usr/share/nginx/html; index index.html index.htm; } }
nginxで中間CA証明書を使用する
nginxには中間CA証明書を直接指定するための方法がありません。
そのため、ちょっと面倒ですが、サーバ証明書に追記する必要があります。
サーバ証明書と中間証明書が以下のような形式だとすると、
サーバ証明書
-----BEGIN CERTIFICATE----- (サーバ証明書の内容) -----END CERTIFICATE-----
中間CA証明書
-----BEGIN CERTIFICATE----- (中間CA証明書の内容) -----END CERTIFICATE-----サーバ証明書に中間証明書を追記する形で、サーバ証明書を以下のように編集します。
-----BEGIN CERTIFICATE----- (サーバ証明書の内容) -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- (中間CA証明書の内容) -----END CERTIFICATE-----
参考
- nginx wiki
- Ruby on Rails: mongrel_clusterのフロントエンドにnginxを使用する
- nginx に中間証明書をインストールする方法(リンク切れ)