« PHPでTokyoTyrantのストリームラッパーを書く | メイン | PubSubHubbubとは »

Tips for nginx
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

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

参考

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/1668

この一覧は、次のエントリーを参照しています: Tips for nginx:

» まちつく! やってみた。 nginxってどうですか? from hiroki.jp
ウノウ株式会社がサービスを提供している「まちつく!」をここ数日やっている。 はじめて見たときは、あっシムシティかぁ。という感じ。 でも、今の若い世代(特に... [詳しくはこちら]

コメントを投稿


画像の中に見える文字を入力してください。

  [PR] 転職
ウノウラボはウノウ株式会社のエンジニア/デザイナーによる大小のアウトプットを行っていく場です。

現在ウノウは絶賛人材募集中です。詳細は求人ページへ。

About

2009年8月18日 13:00に投稿されたエントリーのページです。

ひとつ前の投稿は「PHPでTokyoTyrantのストリームラッパーを書く」です。

次の投稿は「PubSubHubbubとは」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

ウノウサービス