軽量高速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

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;
}

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



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

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

「Too many open files」への対応

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

接続数がいっぱいになると次のようなログを出します。

accept() failed (24: Too many open files) while accepting new connection on 0.0.0.0:80


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

$ ulimit -Hn
$ ulimit -Sn

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

# vi /etc/sysctl.conf
fs.file-max = 50000

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

# vi /etc/security/limits.conf
nginx       soft    nofile   10000
nginx       hard    nofile  30000

設定値を反映

# sysctl -p

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

# vi /etc/nginx/nginx.conf
worker_rlimit_nofile 10240;
worker_connections  10240;


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

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

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;
}

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

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

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

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

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


宣伝

DocBase

DocBaseとは

小さく始める・みんなで育てる・適切に伝える・安心して伝えるをコンセプトにした情報共有サービスです。
メモという形で小さく始められる、エンジニア以外のメンバーでも使いやすい仕組み、情報をまとめて整理できる、柔軟な権限設定で様々なプロジェクトで使えるなど、積極的な情報共有と業務の効率化を実現し、チームの成長を促します。

詳しくはこちらから。
https://docbase.io

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

we use!!Ruby on RailsAmazon Web Services

このページの先頭へ