apacheの起動,停止,再起動に関するまとめ

ある日のServer StatusでGracefully finishing状態のプロセスを発見した際の原因調べてる時にやたらややこしかったので個人的なまとめ（まとまってない）。
実際自分で見たときにほんとにまとまって無かったのでCentOS7の7.5辺りで再確認＆手直し。(2018/09/21)

# apachectlについて
まずapachectlコマンドから整理する。このコマンドには次のサブコマンドを指定できる。

1. status,start,restart,stop,graceful,graceful-stop
2. configtest
3. その他(上記以外)

※厳密には他にも
fullstatus(lynxブラウザで決めうちserver-statusページへアクセス),
startssl, sslstart, start-SSL(エラー文吐いて終わるだけ)があるみたいだが省略。
「その他」の中に含んでないので使ってる人は注意。

## サブコマンドたち
\$OPTIONSは/etc/sysconfig/httpdに書いてあるもの
\${MAINPID}はhttpdの親プロセスのPID

| $1(第一引数)  | 実際に実行されるコマンド その1  | その2                                 | 結果                          |
|:--------------|:--------------------------------|:--------------------------------------|-------------------------------|
| status        | systemctl status httpd.service  | -                                     | ステータス表示                |
| start         | systemctl start httpd.service   | /usr/sbin/httpd $OPTIONS -DFOREGROUND | httpd起動                     |
| stop          | systemctl stop httpd.service    | kill -WINCH ${MAINPID}                | 緩やかな停止[^2]              |
| restart       | systemctl restart httpd.service | stop -> start[^1]                     | 緩やかな停止[^2]の後httpd起動 |
| graceful      | systemctl reload httpd.service  | /usr/sbin/httpd $OPTIONS -k graceful  | 緩やかな再起動 [^2]           |
| graceful-stop | (stopと同じ)                    | (stopと同じ)                          | 緩やかな停止[^2]              |

[^1]: http://equj65.net/tech/systemd-manage/

| $1(第一引数) | 実際に実行されるコマンド    | 結果                             | 備考                                      |
|:-------------|:----------------------------|----------------------------------|-------------------------------------------|
| configtest   | /usr/sbin/httpd \$OPTIONS -t | コンフィグのシンタックスチェック | SELinuxが有効になっていると多少違うが同様 |

その他の場合何を入れても同様のコマンドの引数に渡されるためいくつか利用されそうな例を挙げる。

| 引数             | 実際に実行されるコマンド その1                 | その2               | 結果                                       |
|:-----------------|:------------------------------------------|--------------------|--------------------------------------------|
| その他           | /usr/sbin/httpd \$OPTIONS "$@"             | -                  |                                            |
| reload           | /usr/sbin/httpd \$OPTIONS reload           | -                  | 対応してないサブコマンドなのでヘルプが出る |
| -k stop          | /usr/sbin/httpd \$OPTIONS -k stop          | kill -TERM ${MAINPID}  | 急な停止[^2]                               |
| -k graceful      | /usr/sbin/httpd \$OPTIONS -k graceful      | kill -USR1 ${MAINPID}  | 緩やかな再起動 [^2]                        |
| -k restart       | /usr/sbin/httpd \$OPTIONS -k restart       | kill -HUP ${MAINPID}   | 急な再起動[^2]                             |
| -k graceful-stop | /usr/sbin/httpd \$OPTIONS -k graceful-stop | kill -WINCH ${MAINPID} | 緩やかな停止[^2]                           |

[^2]: https://httpd.apache.org/docs/2.4/stopping.html

# 止めたい（即座に）
デフォルトのhttpd.service用設定ではsystemctl経由では不可

```bash
apachectl -k stop
#又は
/usr/sbin/httpd -k stop
#又は
kill -TERM ${ROOT_HTTPD_PID}
```

# 止めたい（通信中のものは終わり次第）
```bash
apachectl stop (-k stopだと↑の通り即座に止まっちゃうので注意)
#又は
apachectl graceful-stop (-k graceful-stopでも実質同じ)
#又は
systemctl stop httpd
#又は
/usr/sbin/httpd -k graceful-stop
#又は
kill -WINCH ${ROOT_HTTPD_PID}
```

# 再起動(コンフィグ再読み込み)
子プロセス順次停止と並列に新設定読み込み。構文エラー時は処理しない。

```bash
apachectl graceful　(-k gracefulでも実質同じ)
#又は
systemctl reload httpd
#又は
/usr/sbin/httpd -k graceful
#又は
kill -USR1 ${ROOT_HTTPD_PID}
```

# CentOS6以前の`service httpd reload`仕様
即座に子プロセス停止&新設定読み込み。
構文エラー時は停止したまま。

```bash
apachectl -k restart
#又は
/usr/sbin/httpd -k restart
#又は
kill -HUP ${ROOT_HTTPD_PID}
```