Nginx 設定テンプレート

# Nginx 設定テンプレート

以前 Nginx の設定を実施したことがあり、その際に調べた各設定項目をまとめます。

nginx.conf は Docker の Nginx 公式イメージをもとに、必要なパラメータを加えています。

各設定値はシステム要件によって異なると思いますので、数字であれば`<integer>`といった表記に変更しています。



## nginx.conf の設定

```
user  nginx;
worker_processes auto;
worker_rlimit_nofile <integer>;

error_log  /var/log/nginx/error.log error;
pid        /var/run/nginx.pid;

events {
    worker_connections  <integer>;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '<ログに出力する項目>':

    access_log  /var/log/nginx/access.log  main;

    client_max_body_size <integer>m;
    sendfile       on;
    tcp_nopush     on;
    keepalive_timeout  <integer>s;
    keepalive_requests <integer>;


    gzip  on;
    gzip_http_version 1.0 | 1.1;
    gzip_types <mime-type>;
    gzip_disable "MSIE [1-6]\.";
    gzip_disable "Mozilla/4";
    gzip_comp_level <integer>;
    gzip_vary on;
    gzip_proxied any;
    gzip_buffers <number> <size>;

    server_tokens off;
    
    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_connect_timeout <integer>s;
    proxy_read_timeout <integer>s;
    proxy_send_timeout <integer>s;

    proxy_buffering on;
    proxy_buffer_size <integer>k;
    proxy_buffers <number> <size>;

    proxy_cache_path <各種設定項目>;
    proxy_temp_path /etc/nginx/proxy_temp;

    proxy_cache_valid <http status code> <cache time>;

    charset utf8;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

}

```



| 設定                                       | 説明                                                         |
| ------------------------------------------ | ------------------------------------------------------------ |
| worker_processes auto;                     | Nginx本体のプロセス数。autoにして nginx 内部判定に任せる     |
| worker_rlimit_nofile;                      | worker プロセスが最大に開けるファイル数の制限                |
| error_log  /var/log/nginx/error.log error; | error レベル以上を error.log に出力                          |
| pid /var/run/nginx.pid;                    | プロセス ID を格納するファイル                               |
| worker_connections;                        | 一つの worker プロセスが開ける最大コネクション数             |
| include       /etc/nginx/mime.types;       | nginx がデフォルトで用意する MIME タイプと拡張子のマッピングファイル |
| log_format                                 | ログのフォーマットとフォーマットに対応する名称を指定します。([設定例](http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format)) |
| client_max_body_size;                      | Nginx が受け付けられるデータ量。デフォルトは 1MB             |
| sendfile  on;                              | [sendfile システムコール](http://nginx.org/en/docs/http/ngx_http_core_module.html#sendfile)という API を使ってレスポンス処理をおこなうかどうか |
| tcp_nopush     on;                         | 一つのデータパッケージに全てのヘッダー情報が含まれる         |
| keepalive_timeout ;                        | keep-alive のタイムアウト時間。デフォルト値は 75s            |
| keepalive_requests:                        | 1つの接続で何回のリクエストを許可するか                      |
| gzip  on;                                  | gzip 圧縮をするかどうか                                      |
| gzip_http_version 1.0 &#124; 1.1;              | gzip 圧縮を有効にする最小の http バージョン ([参考サイト](http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version)) |
| gzip_types                                 | gzip 圧縮するファイルの対象。例: `gzip_types text/html text/css;` |
| gzip_disable                               | gzip 圧縮に対応していないブラウザは gzip 圧縮をしない        |
| gzip_comp_level 2;                         | [gzip の圧縮レベル](http://www.sooota.com/gzip%E3%81%AE%E5%9C%A7%E7%B8%AE%E7%8E%87/)を指定 |
| gzip_vary on;                              | [Vary: Accept-Encoding レスポンスヘッダを付与するかどうか](https://qiita.com/cubicdaiya/items/09c8f23891bfc07b14d3) |
| gzip_proxied any;                          | [全てのプロキシされたリクエストに圧縮を有効にする。](http://mogile.web.fc2.com/nginx/http/ngx_http_gzip_module.html#gzip_proxied) |
| gzip_buffers \<number> \<size>;              | gzip 圧縮で使用するバッファサイズ。例: `gzip_buffers 32 4k;`。この場合は 32 * 4k = 128k となる。 ([参考サイト](http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_buffers)) |
| server_tokens off;                         | エラー画面のnginxバージョン番号を非表示にする                |
| proxy_http_version 1.1;                    | nginx はデフォルトで HTTP/1.0 を利用するが、Keep-Alive は HTTP/1.1 でのみ有効になるため、明示的に指定する ([参考サイト](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version)) |
| proxy_redirect off;                        | [バックエンドサーバがリダイレクトした時の Location ヘッダ。on なら proxy_pass をホスト名としてリダイレクト。off ならサーバの指示通りにリダイレクト。](https://qiita.com/syou007/items/3e2d410bbe65a364b603) |
| proxy_connect_timeout                      | frontend へ接続する際の connection timeout の値              |
| proxy_read_timeout                         | frontend へ接続する際の read timeout の値                    |
| proxy_send_timeout                         | frontend へデータを送信する際の timeout の値                 |
| proxy_buffering on;                        | [frontend からの応答をバッファするかどうか](http://mogile.web.fc2.com/nginx/admin-guide/reverse-proxy.html) |
| proxy_buffer_size;                         | プロキシされたサーバからの応答の一番最初に使われるバッファサイズ |
| proxy_buffers <number> <size>;             | proxy_buffer_size で対応できなかった場合に使うバッファ。[例えば 50 32k と設定した場合は「32Kのバッファーを50個まで追加で使う」](https://parudou3.com/nginx/785/)という設定。 |
| proxy_cache_path                           | プロキシキャッシュの設定を行う([参考サイト](https://qiita.com/hidekuro/items/c5209e31a0d20f42dccc)) |
| proxy_temp_path                            | キャッシュ作成時の一時ファイルがいったん `proxy_temp_path` ディレクティブで指定したディレクトリに書きだされてからリネームで移動されるようになる ([参考サイト](https://qiita.com/hidekuro/items/c5209e31a0d20f42dccc#use_temp_path--%E4%B8%80%E6%99%82%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E3%81%8B)) |
| proxy_cache_valid                          | 指定のステータスコードのレスポンスが有効な時間を制限することができる([参考サイト](http://mogile.web.fc2.com/nginx/admin-guide/caching.html)) |
| charset utf8;                              | HTTP レスポンスヘッダの Content_Type に付与する文字コード    |



## ログを標準出力する

利用している公式の Nginx の Docker Image では、標準出力/標準エラー出力のスペシャルファイルに対して、各種サービスで指定したログファイルのシンボリックリンクが貼られています。

アクセスログは`/var/log/nginx/access.log`、エラーログは`/var/log/nginx/error.log`に出力するよう、`nginx.conf`で指定してあります。

Nginx コンテナ内の `/var/log/nginx/`を確認すると、以下のようにスペシャルファイルに対してシンボリックリンクが貼られているため、アクセスログは標準出力、エラーログは標準エラー出力に出力されます。

```
$ docker exec -it nginx-official /bin/bash

# ls -l /var/log/nginx/

total 0
lrwxrwxrwx 1 root root 11 Apr 16 19:11 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Apr 16 19:11 error.log -> /dev/stderr
```

- 参考資料: [コンテナ内のプロセスのログ出力先を標準出力/標準エラー出力に設定する方法](https://qiita.com/sshota0809/items/a86cd3379f88fb5cd1b8)



## Virtualhost の設定

Nginx の Virtualhost を設定することで、1つの Nginx で複数のドメインを運用することができます。詳細は以下の資料を参考にしてみてください。

- 参考資料: [nginxでsites-availableとsites-enabledを用いたバーチャルホストの設定](https://yoshinorin.net/2018/04/01/nginx-virtualhost-usingby-sitesavailable/)



## 参考資料

- [公式ドキュメント(英語)](http://nginx.org/en/docs/)
- [nginx.confを書きながら内容を理解する](https://qiita.com/Anorlondo448/items/c0234b2a5bf51578c974)
- [Nginx設定のまとめ](https://qiita.com/syou007/items/3e2d410bbe65a364b603)

- [nginxでsites-availableとsites-enabledを用いたバーチャルホストの設定](https://yoshinorin.net/2018/04/01/nginx-virtualhost-usingby-sitesavailable/)

- [nginx最大パフォーマンスを出すための基本設定](https://gist.github.com/koudaiii/386eb55a29b1adc19c5e)