🚀

[SadServers] 解説 "Cape Town": Borked Nginx

2022/11/17に公開

"Cape Town": Borked Nginx

SadServersの "Cape Town": Borked Nginx の解説です。

SadServers って何? って人は、 SadServers解説 を見てください。
一言でいうと、LeetCode (コーディング問題集) の Linuxサーバ設定版のようなものです。

問題

Level: Medium

Description: There's an Nginx web server installed and managed by systemd. Running curl -I 127.0.0.1:80 returns curl: (7) Failed to connect to localhost port 80: Connection refused , fix it so when you curl you get the default Nginx page.

Nginxのウェブサーバーがインストールされていて、systemdで管理されています。curl -I 127.0.0.1:80 を実行すると curl: (7) Failed to connect to localhost port 80: Connection refused , curl すると Nginx のデフォルトページが表示されるように直します。

Test: curl -Is 127.0.0.1:80|head -1 returns HTTP/1.1 200 OK

Time to Solve: 15 minutes.

OS: Debian 11

解き方

まず、 curl -I 127.0.0.1:80 を実行し、失敗することを確認します。

admin@ip-172-31-36-219:/$ curl -I 127.0.0.1:80
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

たしかに、Descriptionに記述され問題が発生しています。

Nginxは、systemdで管理されているということなので、 systemctlでステータスを確認します。

admin@ip-172-31-35-104:/$ systemctl status nginx
● nginx.service - The NGINX HTTP and reverse proxy server
     Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2022-11-17 13:40:12 UTC; 1min 11s ago
    Process: 585 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=1/FAILURE)
        CPU: 30ms

Nov 17 13:40:12 ip-172-31-35-104 nginx[585]: nginx: [emerg] unexpected ";" in /etc/nginx/sites-enabled/default:1
Nov 17 13:40:12 ip-172-31-35-104 nginx[585]: nginx: configuration file /etc/nginx/nginx.conf test failed
Nov 17 13:40:11 ip-172-31-35-104 systemd[1]: Starting The NGINX HTTP and reverse proxy server...
Nov 17 13:40:12 ip-172-31-35-104 systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Nov 17 13:40:12 ip-172-31-35-104 systemd[1]: nginx.service: Failed with result 'exit-code'.
Nov 17 13:40:12 ip-172-31-35-104 systemd[1]: Failed to start The NGINX HTTP and reverse proxy server.

unexpected ";" in /etc/nginx/sites-enabled/default:1 とあるので、どうやら、Nginxの設定ファイル (/etc/nginx/sites-enabled/default)の1行目に 意図しない;があるようです。
/etc/nginx/sites-enabled/defaultを見てみます。

admin@ip-172-31-36-219:/var/log/nginx$ cat /etc/nginx/sites-enabled/default 
;
##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure

確かに、1行目に、不要な ;があります。 なので、この行を削除します。

# vi で、一行目の ; を削除する。
admin@ip-172-31-36-219:/var/log/nginx$ sudo vi /etc/nginx/sites-enabled/default 

# 確認する。
admin@ip-172-31-36-219:/var/log/nginx$ cat /etc/nginx/sites-enabled/default 

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure

修正したので、systemctlで、 Nginxを再起動します。

# 再起動
admin@ip-172-31-36-219:/var/log/nginx$ sudo systemctl restart nginx

# ステータス確認
admin@ip-172-31-36-219:/var/log/nginx$ systemctl status nginx 
● nginx.service - The NGINX HTTP and reverse proxy server
     Loaded: loaded (/etc/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-11-17 13:26:57 UTC; 8s ago
    Process: 863 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
    Process: 864 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
   Main PID: 865 (nginx)
      Tasks: 2 (limit: 524)
     Memory: 2.4M
        CPU: 42ms
     CGroup: /system.slice/nginx.service
             ├─865 nginx: master process /usr/sbin/nginx
             └─866 nginx: worker process

正常に起動していることが確認できたので、curlを実行します。

admin@ip-172-31-36-219:/var/log/nginx$ curl -I 127.0.0.1:80
HTTP/1.1 500 Internal Server Error
Server: nginx/1.18.0
Date: Thu, 17 Nov 2022 13:27:15 GMT
Content-Type: text/html
Content-Length: 177
Connection: close

HTTP/1.1 500 Internal Server Error と、エラーが発生しています。
Nginxのログ(/var/log/nginx/error.log)を確認します。

admin@ip-172-31-36-219:/var/log/nginx$ tail /var/log/nginx/error.log 
2022/11/17 13:26:57 [alert] 865#865: socketpair() failed while spawning "worker process" (24: Too many open files)
2022/11/17 13:26:57 [emerg] 866#866: eventfd() failed (24: Too many open files)
2022/11/17 13:26:57 [alert] 866#866: socketpair() failed (24: Too many open files)
2022/11/17 13:27:15 [crit] 866#866: *1 open() "/var/www/html/index.nginx-debian.html" failed (24: Too many open files), client: 127.0.0.1, server: _, request: "HEAD / HTTP/1.1", host: "127.0.0.1"

Too many open files というエラーログがあります。ファイル(ファイルディスクリプタ)のオープンできる最大数に達しているようです。systemd の Nginx の設定(/etc/systemd/system/nginx.service)を確認します。

admin@ip-172-31-36-219:/etc/systemd/system$ cat nginx.service 
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
LimitNOFILE=10

[Install]

LimitNOFILE=10 という記述があります。これにより、systemdで起動プロセスでの最大ファイル数が10に抑えられているようです。ですので、この記述をコメントアウトします。 (大きな値をセットしてもいいです)

# LimitNOFILE=10 をコメントアウトする
admin@ip-172-31-36-219:/etc/systemd/system$ sudo vi nginx.service 

# 確認
admin@ip-172-31-36-219:/etc/systemd/system$ cat nginx.service 
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
# LimitNOFILE=10

[Install]

systemctl で Nginx を再起動

# Nginxの再起動する。
admin@ip-172-31-36-219:/etc/systemd/system$ sudo systemctl restart nginx 
Warning: The unit file, source configuration file or drop-ins of nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.

# 'systemctl daemon-reload' を実行しろとエラーが出たので、それに従う。
admin@ip-172-31-36-219:/etc/systemd/system$ sudo systemctl daemon-reload

# 改めてNginxの再起動
admin@ip-172-31-36-219:/etc/systemd/system$ sudo systemctl restart nginx 

# curl で動作確認。 正しく 200 OK が返る。
admin@ip-172-31-36-219:/etc/systemd/system$ curl -I 127.0.0.1:80
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 17 Nov 2022 13:30:29 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Sun, 11 Sep 2022 15:58:42 GMT
Connection: keep-alive
ETag: "631e05b2-264"
Accept-Ranges: bytes

# Testを実行
admin@ip-172-31-36-219:/etc/systemd/system$ curl -Is 127.0.0.1:80|head -1
HTTP/1.1 200 OK

Discussion