unoh.github.com

Tips for nginx

Mon Aug 17 21:00:00 -0700 2009

何を今更と思うかもしれませんが、最近、英語圏に住んでいようがいまいが
ソフトウェア開発で英語は必須だと改めて実感した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-----

参考