nginxのconfig読む

centos8でnginx使ってみる

```s
$ cat /etc/redhat-release 
CentOS Linux release 8.2.2004 (Core) 
```

## インストール
1.14.1がインストールされた。
nginxはマイナーバージョンが偶数の時は安定バージョン、奇数の時は開発バージョンとのこと。

```
$ dnf install nginx -y 
...インストール

$ nginx -v
nginx version: nginx/1.14.1
```

## 設定ファイル

/etc/nginx 以下に設定ファイルがある。
nginx.confが大元の設定ファイルになるのかな。

公式
http://nginx.org/en/docs/ngx_core_module.html#directives


```s
[root@f82608275426 nginx]# tree
.
|-- conf.d
|-- default.d
|-- fastcgi.conf
|-- fastcgi.conf.default
|-- fastcgi_params
|-- fastcgi_params.default
|-- koi-utf
|-- koi-win
|-- mime.types
|-- mime.types.default
|-- nginx.conf
|-- nginx.conf.default
|-- scgi_params
|-- scgi_params.default
|-- uwsgi_params
|-- uwsgi_params.default
`-- win-utf
```


## nginx.conf

```nginx

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

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

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}
```

## user nginx;
nginxのワーカープロセスを実行ユーザーを指定する。
nginxユーザーはnginxインストール時に自動で作成される？
(マスタープロセスの実行ユーザーはrootとかになるのかな？)

## worker_processes auto;
ワーカープロセスの数
cpu数と同じにすると良く、autoだとcpu数を自動で探して設定してくれる。

## error_log /var/log/nginx/error.log;
エラーログのファイルパス

## pid /run/nginx.pid;
メインプロセスのプロセスIDを格納するファイルを定義する
↓インストール直後だと/run/nginx.pidファイルは存在しない
```
$ cat /run/nginx.pid
cat: /run/nginx.pid: No such file or directory
```

## include /usr/share/nginx/modules/*.conf;
モジュールごとの設定を読み込む。デフォルトでこれだけconfがある。

```s
ll /usr/share/nginx/modules/    
total 28
drwxr-xr-x 2 root root 4096 Dec  9 14:39 .
drwxr-xr-x 4 root root 4096 Dec  9 14:39 ..
-rw-r--r-- 1 root root   72 Oct  7  2019 mod-http-image-filter.conf
-rw-r--r-- 1 root root   64 Oct  7  2019 mod-http-perl.conf
-rw-r--r-- 1 root root   71 Oct  7  2019 mod-http-xslt-filter.conf
-rw-r--r-- 1 root root   59 Oct  7  2019 mod-mail.conf
-rw-r--r-- 1 root root   61 Oct  7  2019 mod-stream.conf
```


## event { ... }
コンテキスト。接続処理に影響するディレクティブが指定されている設定を書く。

## worker_connections 1024;
ワーカープロセスが開くことができる同時接続の最大数を設定する。
この数には、クライアントとの接続だけでなく、すべての接続 (特にプロキシされたサーバとの接続など) が含まれていることに注意してください。

## http { ... }
コンテキスト。httpやhttps接続に関する設定を書く。

##  log_format  main ...

```nginx
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
```

ログ形式を指定します。ここではmainという名前のlogフォーマットを定義している
http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format

remote_addr : 接続元のip
remote_user : Basic認証で使用したユーザー名
time_local : リクエスト日時
request : full original request line???
status : レスポンスステータス
body_bytes_sent : クライアントに送信されたバイト数 (レスポンスヘッダはカウントされません)。
http_referer : リファラー
http_user_agent : ユーザーエージェント
http_x_forwarded_for : xff

## access_log  /var/log/nginx/access.log  main;
アクセスログの設定を行う。ここではpathとログフォーマットを指定している。

## sendfile            on;
うーん、、、なんだろう。。。sendfile関数を使うかどうかの設定を行う？

## tcp_nopush          on;
sendfileをonにしている時に使われるパラメータらしい。

> FreeBSD では TCP_NOPUSH ソケットオプション、Linux では TCP_CORK ソケットオプションの使用を有効または無効にします。これらのオプションは sendfile を使用している場合にのみ有効になります。このオプションを有効にすると
レスポンスヘッダとファイルの先頭を 1 つのパケットにまとめて送信します。
フルパケットでファイルを送信します。

## tcp_nodelay         on;

> TCP_NODELAY オプションの使用を有効または無効にします。このオプションは、接続がキープアライブ状態に移行したときに有効になります。さらに、SSL 接続、バッファなしプロキシ、および WebSocket プロキシでも有効になります。

## keepalive_timeout   65;
クライアントからのリクエスト待ち時間

## types_hash_max_size 2048;
MIME タイプハッシュテーブルのエントリの最大サイズを定義します???

## include             /etc/nginx/mime.types;
nginxが用意したMIMEタイプを読み込む。拡張子とMIMEタイプの対応表。

## default_type        application/octet-stream;
レスポンスのデフォルトのMIMEタイプを指定する。
application/octet-streamは汎用的なバイナリデータ (または本当のタイプが不明なバイナリデータ) に使用されるMIMEタイプ。

## server { ... }
サーバーの設定


## 参考
https://www.bnote.net/centos/nginx_conf01.html
http://nginx.org/en/docs/ngx_core_module.html
https://www.codeflow.site/ja/article/understanding-the-nginx-configuration-file-structure-and-configuration-contexts
http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
https://qiita.com/teco_naka/items/f42671850122ed69d0c5
http://nginx.org/en/docs/http/ngx_http_core_module.html#variables
https://qiita.com/yuse/items/fe05cec1a331306eac19