離してくれ。
- ロケ地
- AmazonLinux2
- Kernel5.10 じゃないほう
- Let's Encrypt (certbot)
httpd が起動しない
単体の EC2 インスタンスで、複数の VirtualHost を設定した httpd を運用していたのだけど、ここにホスト追加したので certbot certonly --apache
して証明書を追加、再起動したら起動に失敗した。
[ec2-user@static vhost.d]$ sudo systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: failed (Result: protocol) since 月 2022-01-31 08:52:23 JST; 2min 30s ago Docs: man:httpd.service(8) Process: 14573 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Process: 24419 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS) Main PID: 24419 (code=exited, status=0/SUCCESS) Status: "Reading configuration..."
Reading configuration...
で止まっている、明らかにおかしい。 実施した作業といえば、ホスト毎に分割している VirtualHost 定義ファイルをコピーして、サブドメイン部を vi で %s/before/after/gc
とかしたくらいだ。
httpd -S
apachectl -t
しても SyntaxError は検出されない、うーん?
tcp6
本題。 直前に certbot で証明書追加を行ったので、疎通用に 80/443 を利用して掴みっぱなしか? と思って netstat -an
して結果を絞り込んでみた。
[ec2-user@static vhost.d]$ netstat -an |grep LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 :::443 :::* LISTEN # snip #
あーん? なんかおる。 tcp6
ってなんだよ IPv6 かぁ〜? と思ってたけど、この状態でもウェブサイトにアクセスできて応答が帰ってくる。 こちとら httpd に IPv6 運用なんぞしとらんぞ、なんじゃこりゃあ!
なるほど? マッピングされてるのか、IPoE といいこういうの判断が辛くて困る。
httpd は、いる!
systemctl status httpd
では failed と返って来ているが、 ps ax|grep httpd
などすると、この IPv6 で port 80/443 を LISTEN しているプロセスを見つけることができた。 おめえかー!
という事で、 systemctl からは操作できないので killall
でプロセス名を指定して全部停止させる。
[ec2-user@static vhost.d]$ ps ax|grep httpd 23840 ? Ss 0:00 /usr/sbin/httpd -k graceful 24258 ? Sl 0:00 /usr/sbin/httpd -k graceful 24259 ? Sl 0:00 /usr/sbin/httpd -k graceful 24260 ? Sl 0:00 /usr/sbin/httpd -k graceful 24261 ? Sl 0:00 /usr/sbin/httpd -k graceful 24262 ? Sl 0:00 /usr/sbin/httpd -k graceful 24308 ? Sl 0:00 /usr/sbin/httpd -k graceful 24343 ? Sl 0:00 /usr/sbin/httpd -k graceful 24377 ? Sl 0:00 /usr/sbin/httpd -k graceful 24383 ? Sl 0:00 /usr/sbin/httpd -k graceful 24389 ? Sl 0:00 /usr/sbin/httpd -k graceful 24436 pts/0 S+ 0:00 grep --color=auto httpd [ec2-user@static vhost.d]$ sudo killall httpd
とまった。
httpd やりなおし
ということで改めて httpd を起動する。
[ec2-user@static vhost.d]$ sudo systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) Active: active (running) since 月 2022-01-31 08:56:59 JST; 1s ago Docs: man:httpd.service(8) Process: 14573 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Main PID: 24456 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service ├─24456 /usr/sbin/httpd -DFOREGROUND ├─24458 /usr/sbin/httpd -DFOREGROUND ├─24459 /usr/sbin/httpd -DFOREGROUND ├─24460 /usr/sbin/httpd -DFOREGROUND ├─24461 /usr/sbin/httpd -DFOREGROUND └─24462 /usr/sbin/httpd -DFOREGROUND [ec2-user@static vhost.d]$ netstat -an |grep LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::80 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 :::443 :::* LISTEN #snip#
起動したので netstat してみたら、 IPv4 向けの LISTEN が存在するわけではなく、 tcp6
が LISTEN していた。
冷静に考えたらポートは常にひとつ専有されるので、 tcp
tcp6
と同時に 80 を LISTEN していると表示されるわけではないのだな。
tcp6(ipv4 もマッピングしてますよ)
ということか、難しい。
とりあえずこれで問題は解決、無事 systemctl からまた httpd プロセスを操作できるようになった。