使用 NGINX 官方源安装,启动程序发现 Systemd 中存在报错:Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory
[root@runwu-restful nginx]# systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
Active: failed (Result: timeout) since Fri 2022-11-25 16:03:57 CST; 10min ago
Docs: http://nginx.org/en/docs/
Process: 30134 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Nov 25 16:02:27 runwu-restful systemd[1]: Starting nginx - high performance web server...
Nov 25 16:02:27 runwu-restful nginx[30134]: nginx: [warn] 65535 worker_connections exceed open file resource limit: 1024
Nov 25 16:02:27 runwu-restful systemd[1]: Can't open PID file /var/run/nginx.pid (yet?) after start: No such file or directory
Nov 25 16:03:57 runwu-restful systemd[1]: nginx.service start operation timed out. Terminating.
Nov 25 16:03:57 runwu-restful systemd[1]: Failed to start nginx - high performance web server.
Nov 25 16:03:57 runwu-restful systemd[1]: Unit nginx.service entered failed state.
Nov 25 16:03:57 runwu-restful systemd[1]: nginx.service failed.
原因是Nginx 启动时 PID 文件并未生成,导致文件无法读取
知道问题如何产生,自然就有了解决办法。在 /usr/lib/systemd/system/nginx.service 中添加如下语句即可,作用是在执行可执行文件前等待 0.1s 。
ExecStartPost=/bin/sleep 0.1
[root@runwu-restful nginx]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/data/var/run/nginx.pid
ExecStartPost=/bin/sleep 0.1
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /data/var/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /data/var/run/nginx.pid)"
[Install]
WantedBy=multi-user.target
顺便我把pid文件的位置放到了 /data/var/run/nginx.pid
此位置不仅要在 nginx.conf中修改还要在nginx.service中修改,不然在使用systemctl start nginx 的时候会报错 因为systemctl首先读取的是nginx.service文件 所以两个位置都要改 如果不改的话只能用 /usr/sbin/nginx -c /etc/nginx/nginx.conf 启动