在Windows上做开发环境中的nginx服务器。为了使nginx在后台运行,使用如下命令来启停nginx:
cd <nginx安装目录>
# 开启nginx并在后台运行
start nginx.exe
# 关闭nginx
./nginx.exe -s stop
# 重启nginx:先关闭再开启
./nginx.exe -s stop; start nginx.exe
但是某次修改配置文件后,重启nginx,却发现根本没有生效。比如,把一个server
的root
直接删了,重启后居然还能正常响应。
接着发现,执行nginx -s stop
时已经提示没有nginx.pid
了(这意味着nginx应该已经关闭了),但网页仍然能打开,这说明nginx实际上还在运行。
打开任务管理器查看进程,发现居然还有4个正在运行的nginx进程。正常情况下,nginx运行时应该只有2个nginx进程(1个master进程,1个worker进程(默认配置是1个)),而关闭时则没有nginx进程。
所以原因很明显,是因为加载了旧配置的那批nginx进程一直都在运行,请求和响应一直都是被这批进程在处理,而加载了新配置的nginx进程虽然也运行起来了,但并没有得到处理请求的机会。
经过实验发现,每执行一次start nginx
,都会创建新的nginx进程,同时创建新的nginx.pid
文件,但只有最先启动的nginx进程才会处理到请求。
而如果多次使用./nginx.exe -s stop; start nginx.exe
命令来重启,则总是会在某一次报出nginx.pid
的错误,然后就看到nginx进程就变多了。猜想这是因为nginx -s stop
命令并不是等到nginx关闭完成之后才执行结束,而仅仅是发送了一个系统信号,那么start nginx
就会紧接着立即执行,创建新的nginx进程(会占用nginx.pid
文件),而此时旧进程可能还没来得及关闭,然后就可能因为nginx.pid
文件或其他某些因素导致旧进程没有关闭成功,于是就继续运行下去了。
所以,鉴于可能会出现此种问题,应该调整对nginx的启停管理的操作方式:
cd <nginx安装目录>
# 开启nginx并在后台运行
start nginx.exe
# 关闭nginx
nginx.exe -s stop
# 重载配置文件(不需要重启进程)
nginx.exe -s reload
# 重启nginx(仅在必须重启时才重启,再次启动前先确认已经关闭)
nginx.exe -s stop
start nginx.exe