解决 Nginx 启动错误 “Failed to read PID from file: Invalid argument”

By | 最新修改:2024-08-17

本文解决 CentOS 7 下 Nginx 启动时的错误“Failed to read PID from file /run/nginx.pid: Invalid argument”。

故障原因

PID 文件解析

.pid 文件是 Linux 系统用于保存应用程序进程的进程号,当应用程序启动的时候,系统的进程管理程序会随机生成一个进程号,然后写入该文件。同时读取该进程号,并与应用程序绑定。

.pid 文件还有防止多个同样的应用程序同时启动,这保证了程序进程的唯一性。

此外,对 .pid 文件的创建和读写要有一定的权限,一般是 root 权限,但是当程序有自已的运行用户时,运行用户要对此文件至少有读的权限。

故障原因

程序由 SystemD 启动时要创建 .pid,因此需要 root 权限,倘若应用程序没有权限去创建该文件,那么就会报错,程序启动失败。

故障原因是由于权限问题导致的 /run/nginx.pid 文件无法创建和读取。


解决方案

只要指定对的 PID 文件,或者创建该文件,再赋予相应的读写权限就可以了。然而一般情况下由系统的 root 用户创建该文件,然后将文件的使用权交给进程管理程序。

本文的解决方案选用由系统创建该文件,而不直接指定。

打开并编辑 Nginx 的 SystemD 配置文件 /usr/lib/systemd/system/nginx.service

我原来的配置文件是这样的:

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

解决这个问题的方案是去掉原配置文件的 PIDFile=/run/nginx.pid 一行。

然后重启 Nginx。

# 重载配置文件
systemctl daemon-reload
# 重启 Nginx 服务
systemctl restart nginx
# 重启 Nginx 服务的状态
systemctl status -l nginx

总结

致使此致命错误的根本原因是文件的权限问题,并且此错误是偶发的,不是所有这种情况都会报错。



程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com