在网上搜了一下关于这个主题的帖子,基本无外乎两种:
- 使用工具把Nginx注册为Windows服务
- 使用工具隐藏命令行窗口
其实根本不需要额外的工具,自己写个很简单的Windows批处理文件就能解决问题:
start /B nginx
这个/B参数就是让程序隐藏在后台不生成新的CMD窗口。至于要结束的时候,只需要调用nginx自己的stop/quit信号就可以了。
下面稍微深入一点讲一下:以前有用过nginx,尤其是在Linux下用过的前辈,都知道nginx有两个不同的信号(stop和quit)用来结束,其中”stop”信号是等待任务完成正常结束,而”quit”是强退。所以,如果喜欢鼠标双击的方式操作,只需要给他们各写一份bat文件就行;而如果更多地是在命令行下操作,可以把他们写在一个bat里,不过直接使用nginx自己的-s参数也并没麻烦到哪里去吧。
不过,在Windows下有一点需要注意的是:nginx使用pid文件来保存进程信息,如果我们不小心运行了两份nginx,后一份的pid文件会把前一份的给覆盖掉,所以用-s quit和-s stop命令就只能结束最后一份nginx进程。所以,可以在quit.bat里加入”tskill nginx”这一行,在quit结束之后,再杀一次进程。至于stop命令里,因为是需要让它干净地退出,所以就不要加这个命令了。
::start.bat
start /B nginx
::stop.bat
nginx -s stop
::quit.bat
nginx -s quit
tskill nginx
::reload.bat
nginx -s reload
::reopen.bat
nginx -s reopen
另外再附上两份命令行用的bat:
::偷懒的方式
@ECHO OFF
IF "%1"=="" (
GOTO :start
) ELSE IF "%1"=="start" (
GOTO :start
) ELSE IF "%1"=="quit" (
GOTO :quit
) ELSE (
GOTO :s
)
:start
start /B nginx
GOTO :end
:quit
nginx -s quit
tskill nginx
GOTO :end
:s
nginx -s %1
GOTO :end
:end
::方便自己起别名的方式
@ECHO OFF
IF "%1"=="" (
GOTO :start
)ELSE IF "%1"=="start" (
GOTO :start
)ELSE IF "%1"=="stop" (
GOTO :stop
)ELSE IF "%1"=="quit" (
GOTO :quit
)ELSE IF "%1"=="reload" (
GOTO :reload
)ELSE IF "%1"=="reopen" (
GOTO :reopen
) ELSE (
GOTO :end
)
:start
start /B nginx
GOTO :end
:stop
nginx -s stop
GOTO :end
:quit
nginx -s quit
tskill nginx
GOTO :end
:reload
nginx -s reload
GOTO :end
:reopen
nginx -s reopen
GOTO :end
:end