1.Nginx命令介绍及基本使用
注:通过源码安装的Nginx,要访问Nginx二进制文件也就是访问Nginx命令是要带绝对路劲的,但是由于我在安装的时候已经做了软连接: ln -s /opt/app/nginx/sbin/nginx /usr/bin/ ,所以可以在命令行正常使用它。
#查看nginx选项
$ nginx -h
nginx version: nginx/1.18.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 #指定操作, 有4个操作 stop, quit, reopen, reload 例如: nginx -s stop 就是停止Nginx
-p prefix : set prefix path (default: /opt/app/nginx/) #设置命令路劲
-c filename : set configuration file (default: conf/nginx.conf) #指定配置文件,如果有其他配置文件也可以使用它进行指定
-g directives : set global directives out of configuration file #设置全局指令
2.常见用途
获取nginx版本或编译信息: nginx -v / nginx -V
发生信号:
nginx -s stop #立刻停止运行nginx
nginx -s quit #优雅的停止nginx,就不会立即关闭nginx,而是等待nginx把现有的请求处理完成才关闭
nginx -s reload #重新加载配置文件,当修改了配置文件时需要它进行重启
nginx -s reopen #开始重新记录日志(用的不多)
指定核心配置文件:nginx -c /opt/app/nginx/conf/nginx.conf #这个也是命令启动nginx的方式
测试nginx: nginx -t #一般在修改配置文件后都需要使用它来进行测试,看下配置文件有没有报错
指定指令:nginx -g 指令 #我一般都是直接修改nginx配置文件,这参数用的不多
3.常见命令及组合:
查看编译选项:
nginx -V
修改nginx配置文件后重新加载nginx:
nginx -t
nginx -s reload
4.Nginx -s reload的真相
- 1.首先向nginx master进程发送HUB信号(linux下支持72种信号)
- 2.master会自动校验配置文件语法是否正确(如果nginx -t 这一步没有问题,在这里也就不会出现问题)
- 3.master主动会打开新的监听端口响应用户请求
- 4.master进程使用新的配置启动新的子进程
- 5.master向老的worker子进程发送OUIT信号(OUIT指的是优雅的关闭)
- 6.老的worker子进程主动关闭端口,不在接收请求,同时处理完当前连接后会自动结束进程
5.nginx优雅关闭old worker进程的真相
什么是优雅的关闭? 简单来说是当worker程序不在处理用户请求,处于空闲时间的时候,退出进程,释放空间。
优雅关闭流程:
- 1.设置定时器,也就是worker_shutdown_timeout(设置优雅关闭进程的超时时间,如果进程在这个时间内没有被关闭,nginx就会主动关闭所有当前打开的连接)
- 2.关闭监听句柄,也就是关闭端口,时当前进程不在接收用户新的请求
- 3.关闭空闲连接,默认情况下,nginx都是fork几个空闲子进程等待用户请求,如果使用优雅的关闭,这类连接是优先被关闭的。
- 4.在循环中逐渐关闭已处理完成的连接,如果还有部分连接在达到超时时间后还没有被关闭,则会被nginx强制关闭,在第4步中,只会出现2种情况,1)当前连接都会被优雅的关闭,2)当前连接只有一部分被优雅的关闭,还有一部分被强制关闭
- 5.最后退出当前的worker子进程
哪些连接会被优雅的关闭?哪些连接又不能识别?
- 可以被优雅关闭的连接?
- 当前空闲连接,普通的http/https请求
- 不能识别的请求?
- Nginx代理web socket协议,在web socket协议后进行通讯的frame帧里,Nginx是不解析它的帧的,此时是没有办法的。
- Nginx做TCP,UDP反向代理的时候,也无法识别需要经历多少报文才算结束