Nginx 設定めも


必要な範囲で


## リファレンス
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秒。無通信状態が一定時間続いてもキープアライブパケットが届かない場合は、接続を切る