一步一步深入理解Nginx(三)解读Nginx命令行参数

2015/12/2920:26:11 发表评论

 

前面两节我们学习了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日志:

1

 

那么有童鞋就会问了,果子你到底想说明什么?

如果细心的朋友可能会发现了,这两个路径其实分别就是我们--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命令行参数的作用以及在什么场景下使用这些参数,在学习参数的同时,我们也可以思考下,如果是让我们写这么一个程序,我们如何做到这些强大的功能呢?

 

  • 微信扫码赞助
  • weinxin
  • 支付宝赞助
  • weinxin

发表评论

您必须才能发表评论!