「nginx実践ガイド」のコマンドのメモ

[「nginx実践ガイド impress top gearシリーズ」](https://www.amazon.co.jp/nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%B8%A1%E8%BE%BA%E9%AB%98%E5%BF%97-ebook/dp/B01N183E3H/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1524609268&sr=1-1&keywords=nginx%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89)のコマンド用のメモです。
環境はCentOS7です。

#systemctlでの操作

- 開始
    - `systemctl start nginx`
    - nginxを開始します。
- 終了
    - `systemctl stop nginx`
    - nginxを停止します。
- 再起動
    - `systemctl restart nginx`
    - nginxを再起動します。一度nginxを停止させるため、リクエストを受け付けできない時間が一瞬発生します。
- 設定の再読み込み
    - `systemctl reload nginx`
    - 設定を再度読み込みます。新たなworkerプロセスを新たな設定で起動してから、古い設定のworkerプロセスでリクエスト処理中でないものを順次終了させるため、リクエストを受け付けできない時間が発生しません。
- バイナリ入れ替え
    - `/sbin/service nginx upgrade`
    - nginxを再起動します。これはバイナリ入れ替え時のためのコマンドで、新たなmaster/workerプロセスを、新たなバイナリを使って起動してから、古いmaster/workerプロセスでリクエスト処理中でないものを順次終了させるため、リクエストを受け付けできない時間は発生しません。
パッケージのアップデート時に自動的に実行されます。
- 状態表示
    - `systemctl status nginx`
    - nginxがコンソールに出力したログや起動状態を表示します。デフォルトでは長い行が省略されますが、-lオプションを付けると表示されます。

#停止動作の種類
一般的に、処理が終わるのを待ってから終了することを**graceful shutdown**、
処理の終了を待って再起動することを**graceful restart**と表現します。
逆に、処理が終わるのを待たずに終了することを**fast shutdown**や**force shutdown**と呼びます。

「systemctl stop nginx」や「systemctl restart nginx」は、処理中のリクエストを打ち切るため、fast shutdownに分類できます。
graceful shutdownをするには、後述のシグナルやnginxコマンドを使う必要があります。

#nginxコマンドでの操作
nginxのデーモンの実行ファイルは、何もオプションを指定しないとデーモンが起動します。

| コマンド | 内容 |
|:--|:--|
| nginx -h | nginxコマンドのオプションなどを説明したヘルプを表示する |
| nginx -v | バージョン情報を表示する |
| nginx -t | 設定ファイルをテストし、エラーの内容を表示する |
| nginx -T | 設定ファイルをテストし、設定ファイルの内容を表示する。includeされたファイルは展開され、１本の設定ファイルとして表示される |
| nginx -V | バージョン情報、コンパイラのバージョンやコンパイルフラグを表示する。コンパイルフラグを見ることで、組み込まれているモジュールも確認できる |
| nginx -s stop | 実行中のnginxデーモンを停止する。fast shutdown |
| nginx -s quit | 実行中のnginxデーモンを停止する。graceful shutdown |
| nginx -s reopen | 実行中のnginxデーモンにログファイルを開き直させる |
| nginx -s reload | 実行中のnginxデーモンに設定ファイルを再読み込みさせる |

#シグナル送信での操作
systemctlやnginxコマンドによるnginxデーモンの制御は、実際はシグナルを送信して実現しています。
nginxデーモンはmasterプロセスとworkerプロセスに分かれていますが、それぞれのプロセスが処理できるシグナルには違いがあります。

##masterプロセスで処理するシグナル

| シグナル | 内容 |
|:--|:--|
| TERM/INT | masterおよぴworkerを終了する。fast shutdown |
| QUIT | masterおよびworkerを終了する。graceful shutdown |
| HUP | 設定ファイルの再読み込み。新たなworkerを新たな設定で起動してから、古いworkerをgraceful shutdownさせる。タイムゾーンの変更にも対応している |
| USR1 | ログファイルを開き直す |
| USR2 | 新たな実行ファイルで再起動する |
| WINCH | workerをgraceful shutdownさせる |

##workerプロセスで処理するシグナル

| シグナル | 内容 |
|:--|:--|
| TERM/INT | 終了する。fast shutdown。workerに直接送られた場合は、masterが新たなworkerを立ち上げる |
| QUIT | 終了する。graceful shutdown |
| USR1 | ログファイルを開き直す |
| WINCH | 異常終了。デバッグのための機能 |

例えば、`systemctl stop nginx`はmasterプロセスにQUITシグナルとTERMシグナルを送る。
また、`nginx -s reopen`は、masterプロセスにUSR1シグナルを送る。
**しかし、シグナルと処理内容は必ずしも直感的に対応付けられるものではなく、systemctlやnginxコマンドは、より直感的な操作といえる。**

###シグナルでの処理の仕方の例

```shell
# ps aux | grep nginx
root      3575  0.0  0.0  46364   964 ?        Ss   08:29   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx     3576  0.0  0.1  46764  1924 ?        S    08:29   0:00 nginx: worker process
root      3584  0.0  0.0 112660   972 pts/1    R+   08:55   0:00 grep --color=auto nginx`
# kill -QUIT 3575
# ps aux | grep nginx
root      3589  0.0  0.0 112660   976 pts/1    S+   08:56   0:00 grep --color=auto nginx
```