一、Nginx介绍
nginx是一个多进程/多线程高性能web服务器,在linux系统中,nginx启动后会以后台守护进程(daemon)的方式去运行,后台进程包含一个master进程和多个worker进程(这个数量可以在nginx.conf配置文件中worker_processes这个参数设置),可以充分利用多核架构。nginx工作模式是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。nginx在启动之后会有一个master进程和多个worker进程(默认是一个),多个worker子进程将监听同一个端口,并行处理请求。
master主进程主要用来管理worker进程,主要作用是:读取并验正配置信息,管理真正提供服务的worker进程,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。master进程不会对用户请求提供服务,而用户的请求则是worker进程来响应的。
nginx是通过信号来控制,比如关闭,重启等去控制nginx进程。nginx信号是属于nginx进程间的通信的一种机制,比如master主进程控制多个worker子进程,也是通过信号控制的,如下图。
worker 进程数应该设置为等于 CPU 的核数,高流量并发场合也可以考虑将进程数提高至 CPU 核数 * 2。
二、信号量控制选项
命令选项 | 作用 |
TERM,INT | TERM:终止信号。这是kill命令默认发送的信号类型。 INT:中断信号。执行效果和在终端按下Ctrl-C键的效果一样。通常用来终止一个程序。 直接关闭进程,不管进程是否正在被请求都讲关闭(粗暴,这样对nginx有影响,一般不这么做) |
QUIT | 优雅地关闭进程,即等当前进程中请求结束后再关闭 |
HUP | 优雅的重新加载配置文件,如果修改完配置文件,需要重启的话,可以使用这个信号量。 这就意味着,当一个后台进程接收到该信号时,它将重启并且重新读取它的配置文件。 用法:kill -HUP xx(nginx master pid) |
USER1 | 重新读取日志文件,在切割日志时用途较大(停止写入老日志文件,打开新日志文件,之所以这样是因为老日志文件就算修改的文件名,由于inode的原因(nginx进程是根据文件inode来识别文件在硬盘的位置,所以改名后nginx还会一直往老的日志文件写入数据) |
USER2 | 平滑升级可执行程序 ,nginx升级时候用。 当nginx升级版本,当新版本的二进制的文件覆盖旧的后,就需要使用它来读取新的二进制文件,不然不会读取。 用法:kill -USR2 `cat nginx.pid` |
WINCH | 优雅从容的关闭worker进程 (一般配合USR2使用) |
-s | 另外信号控制也可以使用-s来处理nginx -s (reload,reopen,start,quit,stop) |
三、常用命令
运行目录/usr/local/nginx/sbin
帮助:nginx -?
nginx -h
查看nginx的版本信息:nginx -v
查看完整的nginx的配置信息:nginx -V
查看nginx是否启动:ps -ef | grep nginx
强制停止nginx:pkill -9 nginx
使用指定的配置文件:nginx -c
使用指定的配置指令:nginx -g
使用指定的运行目录:nginx -p
发送信号:nginx -s
测试配置文件是否有语法错误:-t -T
# ps aux | grep nginx
# /usr/local/nginx/sbin/nginx -s reload
# kill -QUIT [nginx主进程号]
使用语法:
kill -信号选项 nginx主进程号
如:
方式一:kill -INT 3242
方式二: kill -INT 'cat /usr/local/nginx/logs/nginx.pid'
四、命令行的应用:
首先应进入sbin目录中
4.1. 启动:./nginx
4.2. 重载配置文件:./nginx -s reload
4.3. 热部署:
a)备份原二进制文件
b)覆盖新二进制文件到原文件
注:新二进制文件是nginx源码make编译后的objs文件中nginx.sh
热部署不需要执行make install 安装命令
c)向Nginx的master进程发送信号,告诉其要开始热部署了。
命令:kill -USER2 [master进程pid]
注:接收到信号后nginx会新开一个master进程,并在新的进程中使用新的二进制可执行文件。此时新旧master进程都在运行,但是旧的master进程已经不再监听80端口了,所有新的请求都会到新的master进程中。
d)向旧的master进程发送信号,告诉其可以优雅的结束自己了。
命令:kill -WINCH 12345
注:此时旧的worker进程已经消失了,但是旧的master进程还在。这是因为一旦新二进制文件有错误,直接reload旧master,并down掉新master进程,做版本回退。
4.4. 切割日志文件
a)mv 原文件名 新文件名 (这里只能使用mv命令,linux系统会保证指向旧文件名的写入直接写入到新文件名而不会发生错误)
b)重置配置文件
命令:./nginx -s reopen