控制进程

Nginx 采用主进程(master)和工作进程(worker)的多进程架构,了解如何控制这些进程对于管理 Nginx 至关重要。

进程架构

Master 进程

  • 读取和验证配置
  • 管理工作进程
  • 监听端口
  • 接收信号

Worker 进程

  • 处理实际的请求
  • 每个工作进程是单线程的
  • 可以设置多个工作进程

信号控制

发送信号

# Linux/macOS
nginx -s signal

# Windows
nginx -s signal

可用信号

信号说明
stop快速关闭
quit优雅关闭
reload重新加载配置
reopen重新打开日志文件

快速关闭

# Linux/macOS
sudo nginx -s stop

# Windows
nginx -s stop

特点

  • 立即终止 Nginx
  • 中断所有连接
  • 不等待当前请求完成

优雅关闭

# Linux/macOS
sudo nginx -s quit

# Windows
nginx -s quit

特点

  • 等待当前请求完成
  • 不接受新请求
  • 优雅地关闭所有工作进程

重新加载配置

# Linux/macOS
sudo nginx -s reload

# Windows
nginx -s reload

特点

  • 不中断服务
  • 新配置立即生效
  • 当前请求使用旧配置完成
  • 新请求使用新配置

重新打开日志文件

# Linux/macOS
sudo nginx -s reopen

# Windows
nginx -s reopen

用途

  • 日志轮转后重新打开日志文件
  • 不需要重启 Nginx

使用 kill 命令

查找主进程 PID

ps aux | grep nginx
# 或
cat /var/run/nginx.pid

发送信号

# 优雅关闭
sudo kill -QUIT $(cat /var/run/nginx.pid)

# 快速关闭
sudo kill -TERM $(cat /var/run/nginx.pid)

# 重新加载配置
sudo kill -HUP $(cat /var/run/nginx.pid)

# 重新打开日志
sudo kill -USR1 $(cat /var/run/nginx.pid)

# 升级可执行文件
sudo kill -USR2 $(cat /var/run/nginx.pid)

系统服务管理

systemd (Linux)

# 启动
sudo systemctl start nginx

# 停止
sudo systemctl stop nginx

# 重启
sudo systemctl restart nginx

# 重新加载
sudo systemctl reload nginx

# 查看状态
sudo systemctl status nginx

# 启用开机自启
sudo systemctl enable nginx

# 禁用开机自启
sudo systemctl disable nginx

Upstart (Ubuntu 14.04 及更早版本)

# 启动
sudo start nginx

# 停止
sudo stop nginx

# 重启
sudo restart nginx

# 重新加载
sudo reload nginx

# 查看状态
sudo status nginx

SysVinit (CentOS 6 及更早版本)

# 启动
sudo service nginx start

# 停止
sudo service nginx stop

# 重启
sudo service nginx restart

# 重新加载
sudo service nginx reload

# 查看状态
sudo service nginx status

进程监控

查看进程

# 查看所有 Nginx 进程
ps aux | grep nginx

# 查看主进程
ps aux | grep "master process"

# 查看工作进程
ps aux | grep "worker process"

查看进程树

# Linux
pstree -p | grep nginx

# macOS
pstree -p $(cat /var/run/nginx.pid)

查看资源使用

# CPU 和内存使用
top -p $(cat /var/run/nginx.pid)

# 或使用 htop
htop -p $(cat /var/run/nginx.pid)

查看连接数

# 查看所有连接
sudo netstat -an | grep :80

# 查看连接状态
sudo netstat -an | grep :80 | awk '{print $6}' | sort | uniq -c | sort -nr

# 或使用 ss
sudo ss -an | grep :80

工作进程数配置

user  nginx;
worker_processes  auto;  # 自动检测 CPU 核心数

events {
    worker_connections  1024;
}

手动设置工作进程数

worker_processes  4;  # 设置为 4 个工作进程

查看当前工作进程数

ps aux | grep "worker process" | wc -l

进程限制

文件描述符限制

# 查看当前限制
ulimit -n

# 临时增加
ulimit -n 65535

# 永久增加
sudo vim /etc/security/limits.conf

# 添加以下内容
* soft nofile 65535
* hard nofile 65535

进程数限制

# 查看当前限制
ulimit -u

# 临时增加
ulimit -u 4096

# 永久增加
sudo vim /etc/security/limits.conf

# 添加以下内容
* soft nproc 4096
* hard nproc 4096

故障排查

进程无法启动

# 检查配置
sudo nginx -t

# 检查端口占用
sudo netstat -tlnp | grep :80

# 检查错误日志
sudo tail -f /var/log/nginx/error.log

进程异常退出

# 查看系统日志
sudo journalctl -u nginx -f

# 查看内核日志
sudo dmesg | grep nginx

进程僵死

# 查看僵死进程
ps aux | grep nginx | grep Z

# 强制结束
sudo kill -9 $(cat /var/run/nginx.pid)

最佳实践

  1. 使用优雅关闭:避免中断正在处理的请求
  2. 重新加载配置:不中断服务的情况下更新配置
  3. 监控进程:定期检查进程状态和资源使用
  4. 设置合适的进程数:根据 CPU 核心数设置工作进程数
  5. 日志轮转:定期轮转日志文件,使用 reopen 重新打开
  6. 自动重启:配置进程监控和自动重启机制