nginx
memo

Nginx 設定めも

More than 3 years have passed since last update.

必要な範囲で


リファレンス

http://nginx.org/ja/docs/

http://nginx.com/resources/admin-guide/

http://www.atmarkit.co.jp/ait/articles/1407/24/news003.html

http://heartbeats.jp/hbblog/2012/02/nginx03.html

http://shim0mura.hatenadiary.jp/entry/20120110/1326198429

その他いっぱい。


基本


名前ベースの仮想サーバ

server {

listen 80;
server_name hogehoge.com www.hogehoge.com;
}

server {
listen 80;
server_name hogehoge.net;
}

HTTPリクエストの "Host"ヘッダを考査して、リクエストをどのサーバに振り分けるか決定する。どれにもマッチしない場合はデフォルト(最初のもの)


単純なPHPサーバ

server {

listen 80;
server_name example.org www.example.org;
root /data/www;

location / {
index index.html index.php;
}

location ~* \.(gif|jpg|png)$ {
expires 30d;
}

location ~ \.php$ {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
}
}

URIパスごとの設定は

location [prefix] [URI] {

....
}

で、記述できる。

nginx は、まずリストの順序には関係なくリテラルな文字列によって指定されているもっとも限定されたロケーションを検索する。上記の設定では唯一のリテラルなロケーションは / であり、したがってどのリクエストでもマッチして最終的にこのロケーションが使われる。

次に nginx は、設定ファイルにリストされている順番で正規表現のロケーションをチェックする。最初にマッチした正規表現で検索はストップし、そのロケーションが使用される。

もしどの正規表現もリクエストにマッチしない場合は、nginx はその前に見つかったもっとも限定されたリテラルなロケーションを使用する。

プレフィクスの意味は、

prefix
説明

なし
前方一致

^~
前方一致。一致したら、正規表現の条件を評価しない

=
完全一致。パスが等しい場合

~
正規表現(大文字・小文字を区別する)

~*
正規表現(大文字・小文字を区別しない)

すべてのタイプのロケーションはクエリー部分を除いたリクエスト URI 部分のみを考査する。


ディレクティブ・ブロック

# [ディレクティブ名] [設定値]

worker_processes 1; # 必ずセミコロンで終わる

# ディレクティブ・ブロック
events {
worker_connections 1024;
}

# このブロックは「http」モジュールが有効な場合に適用される。プロトコル的な意味ではない。
http {
# ....
}


アクセス制限

http {

...
server {
...
location / {
allow 127.0.0.1; # ←ローカルホストを許可
allow 192.168.0.0/24; # ←ネットワーク単位で許可
deny all; # ←指定以外のIP/ネットワークからのアクセスを全て遮断


設定ファイルの場所

本来の nginx.conf はネスト構造で

http {

...
server {
...
}
}

となっているが、普通に公式パッケージでインストールすると、

/etc/nginx/nginx.conf

/etc/nginx/conf.d/default.conf

とファイルが分かれており、server{} ディレクティブに関する設定は default.conf の方に書かれる。


リバースプロキシ/ロードバランサ

http {

...
upstream mycluster { <--クラスター「mycluster」を定義
server 192.168.0.2 weight=3; <--クラスターメンバー(重み3)
server 192.168.0.3; <--クラスターメンバー(重みなし)
}

server {

location /foo { <--ロードバランシングされる対象URL(各サーバーに「/foo」を用意しておく)
proxy_set_header X-Real-IP $remote_addr; <--ヘッダー情報の書き換え(必要に応じて)
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header Host $host;
proxy_pass http://mycluster; <--「mycluster」を指定
}
}
...

192.168.0.2に対し「weight」(重み)を指定し、4リクエストのうち、3リクエストが192.168.0.2に、1リクエストだけが192.168.0.3に割り振られるようにしている。


各ディレクティブ

わかったやつから埋めていく。


  • user


    • 実行ユーザ




  • worker_processes


    • 概ねCPUのコア数と同じにする

    • 最大同時クライアントは worker_processes * worker_connections となる。




  • worker_cnnections


    • 1つのworkerプロセスが同時に処理できる最大接続数

    • システム上限は $ ulimit -n で確認できる。




  • server_tokens


    • "off" でバージョン非表示にする




  • sendfile


    • コンテンツのファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかを設定する

    • sendfile()を使うとカーネル空間内でファイルの読み込みと送信が完了するため、効率良くファイルの内容をクライアントに送信できる

    • システムによっては問題あるらしいがデフォルトonだった




  • tcp_nopush


    • sendfile が有効なときに、TCP_CORK ソケットオプションを使うかどうかを設定する

    • onにするとレスポンスヘッダとファイルの内容をまとめて送るようになり、少ないパケット数で効率が上がる

    • デフォルトOFF




  • keepalive


    • デフォルトは65秒。無通信状態が一定時間続いてもキープアライブパケットが届かない場合は、接続を切る