[SadServers] 解説 "Cape Town": Borked Nginx
"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