nginx.service:无法打开 PID 文件 /run/nginx

nginx.service:无法打开 PID 文件 /run/nginx

我在 Ubuntu 18.10 上,在 vmware 下运行,无法启动 nginx 服务 - 我收到错误“nginx.service:无法打开 PID 文件 /run/nginx”。

我已经使用 Passenger 从源代码编译了 nginx。它在一台机器上运行正常,但在我的虚拟机中尝试时,我无法启动 nginx 服务。它给出上述错误,因为它无法打开 PID 文件(或创建它?)。我已经执行了 systemctl enable & start,但它挂了。

我使用了 /etc/sytemd/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=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

我尝试用 /var/run 替换 /run,但仍然出现同样的错误。

nginx.conf 中没有对 PID 的引用(而且我认为不需要?)。

有人可以给我一些关于如何排除故障或修复这个问题的指点吗?

答案1

刚刚偶然发现了你的问题并想留下一个简短的回答:

Systemd 不会自行创建 PID 文件。它期望可执行文件创建它(通常在 中/run,或者专门针对 Ubuntu/var/run文件夹内)。Systemd 仅在服务启动后检查它是否已创建。它还会在终止服务时删除 PID 文件。参考

Nginx 服务器作为分叉进程确实支持创建 PID 文件。要更改其位置,您可以使用pidnginx.conf文件中的指令,该文件/etc/nginx位于标准包的文件夹中。此pid指令默认为logs/nginx.pid参考

手动创建 Nginx 服务时,您需要确保 Systemdnginx.service文件和 Nginxnginx.conf配置文件中的位置匹配。

答案2

我有一个关于如何解决这个问题的答案,但我会把它保留一段时间,以便有人可以评论为什么会这样。

我更改了 PID 行,以便将 PID 文件写入已安装 nginx 文件夹 (/opt/nginx/logs) 的日志文件夹。在其他任何地方,它都会拒绝写入 PID 文件!!!

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/opt/nginx/logs/nginx.pid
ExecStartPre=/opt/nginx/sbin/nginx -t
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

我不知道这种行为的原因是什么,如果 Ubuntu Linux 专家能告诉我为什么它不会在其他任何地方写入 PID,包括正常运行位置 /run 和 /var/run(甚至 tmp),这在该程序的所有引用启动脚本中都是正常的,那就太好了。我认为这只有在从源代码创建时才会发生。

答案3

/run 可用吗?您可以 cd 进入 /run 并触摸文件吗?

cd /run && touch hello.txt && ls -lash

如果不是,那可能意味着您希望 nginx 将 PID 文件放在不可用的位置。您可以做两件事;

  1. 弄清楚为什么 /run 不可用(可能是 tmpfs 配置)
  2. 将 PID 文件放在其他地方,例如 /tmp

答案4

我从源代码构建了 nginx,因此 pid 文件位于nginx/logs/nginx.pid(我在nginx/conf/nginx.conf) 取决于您的安装位置。

我把 nginx 安装在了 pid 文件所在的位置/usr/local//usr/local/nginx/logs/nginx.pid

相关内容