前面两节我们学习了Nginx的安装,以及如何配置php-fpm模块进行PHP网页脚本的解析,接下来我们再来看一看nginx二进制参数有哪些。现在网络上很多关于Nginx的讲解,一上来就是以一套庞大的编译命令,冗长的配置讲解,再辅以高大上的架构图,瞬间把你以万伏的高压电击晕。我写这个系列的文章只是让大家能感觉到以玩的心态来进行学习,每一条命令,每一条配置我都会亲自进行实验,确定正确无误后再贴出来,有些比较复杂的配置以及脚本,我就先提前写好,让大家能迅速体验到成就感,我觉得这样学习才有乐趣。
1、Nginx默认启动时都做了些什么
前面我们已经把nginx二进制安装到/usr/local/nginx/sbin中了,当我们直接运行/usr/local/nginx/sbin/nginx时,会发生什么呢?
答:什么也没有发生,也没有任何输出。
那么它在后台默默的做了什么事情呢?
这里果子将教你使用一个神器:strace命令,我们执行如下命令:
strace /usr/local/nginx/sbin/nginx > nginx.strace 2>&1
接下来,我们再用vim打开,我截取了部分内容,如下图,可以发现,它默认加载了/usr/local/nginx/nginx.conf配置,以及打开了/usr/local/nginx/error.log日志:
那么有童鞋就会问了,果子你到底想说明什么?
如果细心的朋友可能会发现了,这两个路径其实分别就是我们--config-path 和--error-log-path两个选项指定的文件路径,还有些其它选项我们就不一一列举了,有兴趣的朋友可自行查阅。
到这里,我们可以得出结论:直接运行nginx二进制文件时,它根据配置选项来作为默认参数执行。
为了方便我们下文讲解,我们再来看下其它参数:
[root@localhost tmp]# /usr/local/nginx/sbin/nginx -h nginx version: nginx/1.8.0 Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives] Options: -?,-h : this help -v : show version and exit #显示版本信息后退出 -V : show version and configure options then exit #显示编译选项,这个很有用,当下次编译时就可以直接复制过来配置并编译了。 -t : test configuration and exit #测试配置文件是否正确 -T : test configuration, dump it and exit -q : suppress non-error messages during configuration testing #测试配置文件时不显示错误信息到终端 -s signal : send signal to a master process: stop, quit, reopen, reload #向nginx发送信号 -p prefix : set prefix path (default: /usr/local/nginx/) #指定安装路径 -c filename : set configuration file (default: /usr/local/nginx/nginx.conf) #指定配置文件路径 -g directives : set global directives out of configuration file #设置全局选项
2、指定配置文件运行
我们可以通过-c选项来指定一个自定义的配置文件,比如/etc/nginx.conf文件时,我们可以这样运行:
/usr/local/nginx/sbin/nginx -c /etc/nginx.conf
其它选项请大家自行测试。
3、有用的参数选项
接下来我们说一些生产环境中经常用到的选项。
1) 强制停止服务
-s stop可以强制停止nginx服务。-s选项其实是告诉nginx程序向正在运行的Nginx服务发送停止的信号量。nginx程序通过nginx.pid文件中得到的master主进程ID,再向这个进程ID发送TERM信号来快速地关闭服务。
2) “优雅”的停止服务
何谓“优雅”?就是告诉Nginx,请你正常处理完手上现有的请求后,再停止主进程。为什么可以这样做到呢?因为nginx是一个主进程程序用来负责调度、分发配置,然后有N个子进程在向外提供服务,当主进程接收到要“优雅”停止服务后,它对于新的连接请求不再接收,而是专心把当前的服务处理完毕,然后打卡下班走人。
我们可以使用-s quit来进行“优雅”地停止服务。这种方式显得很温和,且会正常处理完客户端已经连接的请求,上一种强制停止的话有可能会丢失一些客户端已经上报上来的数据,所以在生产环境中这种方式比较必要的。
3) 我修改配置了,不想停止服务怎么办
别急,nginx也为我们提供了方式,我们可以使用 -s reload选项重新让nginx的master进程加载一下指定的配置文件nginx.conf。事实上,nginx在执行这个选项之前,做了几个事情,它全首先检查配置是否正确,如果正确就以“优雅”的方式关闭,再重新启动nginx来实现这个目的。
4) 我把nginx日志删除了,它不会生成了怎么办
当我们把nginx的日志文件删除后,正在运行的进程打开的还是之前文件的句柄,这个句柄已然无效,帮不会生成日志文件了,我们可以使用-s reopen参数可以重新打开日志文件,这样我们可以先把当前日志文件改名或转移到其它目录中进行备份,再重新打开时就会生成新的日志文件。
5) 我的nginx重新编译了,能不能平滑升级
答案是可以的。这种情况常见于密集的互联网服务请求,你想一下,当某抢购网站用户正在热火朝天的进行抢购时,你突然间停止几秒钟服务,那样会造成多大的流量损失。
我们可以这样发送命令:
kill -s SIGUSER2 PID #其中PID为nginx的master进程ID,如下命令可以查看到master进程ID为8183 [root@localhost tmp]# ps aux | grep nginx root 8183 0.0 0.0 44756 960 ? Ss 04:55 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf www 8184 0.0 0.0 45128 1680 ? S 04:55 0:00 nginx: worker process root 8186 0.0 0.0 103244 844 pts/0 S+ 04:55 0:00 grep nginx
当发送这个命令后,nginx主进程会将nginx.pid文件重命名为nginx.pid.oldbin,此时我们再将新的nginx文件替换掉旧的二进制文件,再以“优雅”的方式结束进程,再启动新版本程序即可。
4、总结
本节介绍了Nginx命令行参数的作用以及在什么场景下使用这些参数,在学习参数的同时,我们也可以思考下,如果是让我们写这么一个程序,我们如何做到这些强大的功能呢?
- 微信扫码赞助
- 支付宝赞助