天天看点

Nginx重启时丢失nginx.pid文件

nginx被停止(nginx -s stop)或者直接杀掉了进程(kill -9 nginx的进程号)后,调用命令(nginx -s reload 或者 nginx -s reopen)会报错:无法找到"/opt/nginx/logs/nginx.pid"文件。

这句话中,有好几个知识点,也包含了一些错误,错误得把reload或者reopen当做了启动的命令。来依次总结一下:

1、nginx的常用命令

停止:

直接杀nginx进程
ps aux|grep nginx 查看nginx的主进程号,调用kill -9 nginx的进程号来强制停止nginx(还有
“kill -quit nginx的进程号”来从容停止nginx,“kill -term nginx的进程号”来快速的停止nginx)

调用 nginx -s stop 快速停止nginx
调用 nginx -s quit 完整有序的停止nginx      

启动:

进入nginx安装目录/sbin/下执行
nginx或者nginx -c 特定位置的nginx.conf(一般默认是nginx -c ./logs/nginx.conf)      

重启:

nginx -s reload 平滑的重启,配置重载。      

nginx工作中,包括一个master进程,多个worker进程。worker进程负责具体的http等相关工作,master进程主要是进行控制等控制。

nginx -s  reload 命令加载修改后的配置文件,命令下达后发生如下事件:

1. Nginx的master进程检查配置文件的正确性,若是错误则返回错误信息,nginx继续采用原
配置文件进行工作(因为worker未受到影响)

2. Nginx启动新的worker进程,采用新的配置文件

3. Nginx将新的请求分配新的worker进程

4. Nginx等待以前的worker进程的全部请求已经都返回后,关闭相关worker进程

5. 重复上面过程,知道全部旧的worker进程都被关闭掉。      

所以,重启之后,master的进程号不变,worker的进程号会改变。

日志分割:   

nginx -s reopen  重新打开日志文件。

为什么要切割日志?一般Nginx安装好后有些人会打开日志记录,有些人会关闭日志记录,打开日志记录的人一般都会把架设在Nginx上的所有网站日志都存在同一个文件里(比如我存在access.log日志文件里),这样日积月累所有网站的访问记录就会把日志文件越积越大,当需要查看日志文件的时候一看就是一大串,不方便查找。现在,如果我把每天的日志文件分割开来用相应的日期标识出来这样就大大方便查找了。

我是建议打开日志记录,日志记录里面存放着很多有用的东西。比如:浏览器名称,可以方便你对网站的排版做出调整;IP地址,如果网站收到×××,你就可以查到那个IP地址。

Linux下我们可以简单的把日志文件mv走,但是你会发现mv走后新的日志文件没有重新生成,一般linux下用的文件句柄,文件被打开情况下你mv走文件,但是原来操作这个文件的进程还是有这个文件的inode等信息,

原进程还是读写原来的文件,因此简单的mv是无法生效的。

因此建议过程如下:

1. mv原文件到新文件目录中,这个时候nginx还写这个文件(写入新位置文件中了)

2. 调用nginx -s reopen用来打开日志文件,这样nginx会把新日志信息写入这个新的文件中

这样完成了日志的切割工作, 同时切割过程中没有日志的丢失。

测试当前配置文件是否正确: nginx -t
测试指定配置文件是否正确: nginx -t 指定配置文件路径      

注意:修改了配置文件后最好先检查一下修改过的配置文件是否正确,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命令代码如下: 

nginx -t -c /opt/nginx/conf/nginx.conf 

或者 

/opt/nginx/sbin/nginx -t

2、/opt/nginx/logs/nginx.pid文件

首先/opt/nginx/是我的nginx安装路径的,若在nginx.conf配置了pid文件存放路径,则该文件存放的就是Nginx主进程号,如果没指定则放在nginx的logs目录下。有了pid文件,就不用先查询Nginx的主进程号,而直接向Nginx发送信号了,命令代码如下: 

kill -信号类型 ‘/opt/nginx/logs/nginx.pid’

kill -USR1 等于 nginx -s reopen     这个信号量本来就是用于重新读取日志文件的

kill -USR2 等于 nginx -s reload

reload 和 reopen 的行为相差很大,reopen 仅仅检查日志文件,reload 会重载配置,并启动新 worker,关闭旧 worker

nginx.pid存放的是nginx的master进程的进程号。

3.为什么会报错

nginx被停止时,/opt/nginx/logs/nginx.pid被删除了。  而 reopen和 reload命令需要通过nginx.pid获取进程号,会去找/opt/nginx/logs/nginx.pid ,如果不存在,就报错了。

4.总结

reopen是在nginx启动的情况给做分割日志用的,  reload也是在nginx启动的情况下做平滑重启的,他们都依赖于nginx进程存在的情况下。 并不是字面上启动或打开的意思。

继续阅读