軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール このエントリをはてなブックマークに登録

2011年01月13日

amachinamachin /

nginxとは?

nginxはロシアで開発されている軽量で高速なWebサーバです。
現在シェアは 7% 近くあるようです。もちろんApacheに比べれば少ないですが、Apache 55%、IIS 25%, nginx 7%で3番目に使われているWebサーバになります。

昔は、Pound+Lighttpd+Apacheの組み合わせをよく使っていましたが、ここ数年はnginx+Apacheとかになりました。

主に、静的コンテンツをnginxが受け持ち、PHPなどの動的コンテンツはApacheに渡す形になります。Railsを使う場合は、nginx+Unicornの組み合わせが多いです。

いまさらな感じもありますが、インフラ周りの見直しも含めて紹介したいと思います。

静的コンテンツをnginxに任せる

nginx+Apacheの場合の設定は次のようになります。(nginxがport 80、Apacheが127.0.0.1:8082)
細かい設定は載せていませんので、不明な点がありましたらコメントに書いてもらえれば。

nginx

[cc]
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_max_temp_file_size 0;

location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
root /var/www/vhosts/kray.jp/htdocs;
index index.html;
ssi on;
break;
}

location / {
proxy_pass http://127.0.0.1:8082;
break;
}
[/cc]

Apache

[cc lang="apache"]

ServerName kray.jp
DocumentRoot /var/www/vhosts/kray.jp/htdocs

RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.0.0.1
RPAFheader X-Forwarded-For

[/cc]

Apacheの設定にあるRPAFは、リバースプロキシ経由の時にリモートアドレスを正しい値にするために mod_rpaf というモジュールの設定になります。
このモジュールを入れて設定しないと、全てのリモートアドレスが127.0.0.1になってしまいます。
(Amazon EC2でElastic LoadBalancerを使っている場合は多段になるため、もう少しいろいろしないといけません)

さて、これで静的コンテンツはnginx側で高速に処理されるようになりました。
もうnginxのない生活は考えられません。

「Too many open files」への対応

nginxはデフォルトの設定で1024まで同時接続できるため、ほとんどのサイトではデフォルト設定で大丈夫なのですが、規模の大きいサイトなどは必要だと思いますので書いておきます。

接続数がいっぱいになると次のようなログを出します。
[cc lang="bash"]
accept() failed (24: Too many open files) while accepting new connection on 0.0.0.0:80
[/cc]

nginxユーザのファイルディスクリプタの制限の数値を確認

[cc lang="bash"]
$ ulimit -Hn
$ ulimit -Sn
[/cc]

システム全体のファイルディスクリプタの制限をアップ

[cc lang="bash"]
# vi /etc/sysctl.conf
fs.file-max = 50000
[/cc]

nginxユーザのファイルディスクリプタの上限を変更

[cc lang="bash"]
# vi /etc/security/limits.conf
nginx soft nofile 10000
nginx hard nofile 30000
[/cc]

設定値を反映

[cc lang="bash"]
# sysctl -p
[/cc]

nginxの設定でファイルのオープン数と同時接続数を上げる

[cc lang="bash"]
# vi /etc/nginx/nginx.conf
worker_rlimit_nofile 10240;
worker_connections 10240;
[/cc]

expireヘッダをつけて、ユーザ側でキャッシュしてもらう

nginxにはキャッシュ機能があるのですが、ユーザ側のブラウザにキャッシュをしてもらって帯域を抑えたい場合として、次のような設定をしてみました。
これは静的ファイルの取得のみ、15分間のexpiresヘッダを付与して、サイト運営者(IP:10.11.12.13)のみexpiresヘッダの付与をオフにしています。

[cc lang="bash"]
location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
root /var/www/vhosts/kray.jp/htdocs;
index index.html;
ssi on;
expires 15m;
if ($remote_addr = 10.11.12.13) {
expires off;
}
break;
}
[/cc]

こんな設定はあまりしないとは思いますが、何かの参考までに。

1台のサーバの処理を如何に速くするか

最近はAmazon EC2などのクラウドコンピューティングで簡単にスケールアウトできるようになったのですが、1台のサーバの処理を速くすることで、スケールアウトしてもコストを抑えることができます。

今回は手軽なところでnginxを紹介しましたが、例えば、HTTPアクセラレータである Varnish を組み合わせたり、Googleの mod_pagespeed で最適化したり、まだまだいろいろできそうです。

弊社はインフラ周りを工夫するのが好きなので、お気軽にお問い合わせください。


  1. メモからはじめる情報共有 DocBase 無料トライアルを開始
  2. DocBase 資料をダウンロード

「いいね!」で応援よろしくお願いします!

このエントリーに対するコメント


トラックバック
  1. links for 2011-01-17 « Bloggitation2011/01/18, 3:05 PM

    […] 軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール (tags: nginx sysadmin) […]

  2. nginxメモ | ogulabs2011/02/28, 9:52 AM

    […] 軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール http://intg.kray.jp/blog/nginx/ […]

  3. さくら VPS + CentOS のチューニングや高速化もっとこうすれば良かった作業まとめ | ウェブル2011/08/14, 1:10 AM

    […] 軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール | KRAY Inc […]

  4. Nginxでリバースプロキシを設定する | 9ensanのLifeHack2012/01/18, 8:31 PM

    […] 軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール  […]

  5. さくらVPSでLAMP+Nginxの環境を作ってみた2012/04/08, 2:34 PM

    […] a href="http://intg.kray.jp/blog/nginx/" style="margin-right: 5px; target="_blank">軽量高速Webサーバのnginxで静的コンテンツ配信とキャッシュコントロール28 […]

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ