AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

httpd が起動失敗しているのに tcp6 とかいうやつが port 80 と 443 と君の手を掴んで離さない

離してくれ。

  • ロケ地
    • 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 かぁ〜? と思ってたけど、この状態でもウェブサイトにアクセスできて応答が帰ってくる。 こちとら httpdIPv6 運用なんぞしとらんぞ、なんじゃこりゃあ!

qiita.com

ryuichi1208.hateblo.jp

なるほど? マッピングされてるのか、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 プロセスを操作できるようになった。