一、我的问题场景:(有的人可能是场景四,见最下面)
//1. nginx重启,查看lsof -i:80 有 pid进程
nginx -s reload
//2. nginx关闭,查看lsof -i:80 无 pid进程
nginx -s stop
//3. 再次nginx重启,报错
nginx -s relaod
二、报错信息:
三、思考:
- /var/run/nginx.pid 是干嘛用的?
此文件夹包含描述系统启动以来系统信息的数据。此文件夹下的文件必须在启动过程初期清除(删除或归零)。程序可以在 /var/run 下有自己的子文件夹。原先放在 /etc 下的进程标识(PID)文件必须放在 /var/run 里面。PID 文件的命名惯例是 program-name.pid。所以,nginx 的 PID 文件名为 /var/run/nginx.pid 。见引用
- 为什么会报错
reopen 是在 nginx 启动的情况给做分割日志用的, reload 也是在 nginx 启动的情况下做平滑重启的,他们都依赖于 nginx 进程存在的情况下,
nginx 被停止时,var/run/nginx.pid 被删除了。 而 reopen 和 reload 命令需要通过 nginx.pid 获取进程号,会去找 var/run.nginx.pid ,如果不存在,就报错了。
reopen 和 reload 并不是字面上启动或打开的意思。
- 解决办法
真正的启动命令是: nginx 或者 nginx -c 指定目录的配置文件 nginx.conf,
查看进程存在即表明启动成功,之后再调用 reload 和 reopen 就不会报错了。
四、我之前遇到的另外一个场景:【补充】
- 描述:重启虚拟机后,再次重启nginx会报错
- 问题描述:和 上面提到的原因一样,nginx.pid 文件被删除了
- 解决办法:
(1)在nginx执行文件目录下执行
cd /usr/local/sbin
nginx
(2)见引用(第二种方法我试过,是OK的)