Nginx作为高性能的Web服务器和反向代理服务器,提供了多种信号控制机制来管理其运行状态。以下是对Nginx信号控制的详细分析及实例说明。
信号 | 作用 | 示例 |
---|---|---|
TERM, INT | 快速关闭Nginx | kill -TERM <master_pid> |
QUIT | 优雅关闭Nginx | kill -QUIT <master_pid> |
HUP | 重载配置 | kill -HUP <master_pid> |
USR1 | 重新打开日志文件 | kill -USR1 <master_pid> |
USR2 | 热升级可执行文件 | kill -USR2 <master_pid> |
WINCH | 优雅关闭worker进程(配合USR2使用) | kill -WINCH <master_pid> |
nginx
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
# 或
kill -INT `cat /usr/local/nginx/logs/nginx.pid`
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`
特点:等待worker进程完成当前请求后再关闭
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
工作流程: 1. 检查配置文件语法 2. 尝试应用新配置 3. 如果成功,启动新worker进程 4. 优雅关闭旧worker进程
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
应用场景:日志切割后通知Nginx重新打开日志文件
# 1. 备份旧二进制文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
# 2. 替换新二进制文件
cp nginx-new /usr/local/nginx/sbin/nginx
# 3. 发送USR2信号
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# 4. 发送WINCH信号优雅关闭旧worker进程
kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# 5. 确认新版本运行正常后,关闭旧master进程
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
Master-Worker架构:只有master进程接收和处理信号,worker进程不直接处理信号
信号队列:Nginx使用异步信号处理机制,避免信号丢失
原子操作:关键操作使用原子变量保证线程安全
事件驱动:信号处理与事件循环紧密结合
# 修改nginx.conf后
nginx -t # 先测试配置语法
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
#!/bin/bash
# 日志切割脚本
LOG_PATH=/var/log/nginx
DATE=`date -d yesterday +%Y%m%d`
# 重命名日志文件
mv ${LOG_PATH}/access.log ${LOG_PATH}/access_${DATE}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error_${DATE}.log
# 通知Nginx重新打开日志文件
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
# 压缩旧日志
gzip ${LOG_PATH}/access_${DATE}.log
gzip ${LOG_PATH}/error_${DATE}.log
nginx -t
测试配置语法正确性后再重载通过合理使用这些信号控制机制,可以实现Nginx的无缝配置更新、日志管理和版本升级,保证服务的高可用性。