1. Nginx核心命令全解析
作为一款高性能的Web服务器和反向代理工具,Nginx的命令行操作是每位运维和开发人员的必修课。我整理了实际工作中最高频使用的命令清单,并附上多年积累的实用技巧。
1.1 服务生命周期管理
启动Nginx服务时,新手常犯的错误是直接运行nginx命令而不检查配置。正确的做法应该是:
bash复制# 先测试配置(关键步骤!)
nginx -t
# 确认无误后再启动
nginx
停止服务时,根据场景选择不同方式:
bash复制# 优雅停止(处理完现有请求)
nginx -s quit
# 立即停止(紧急情况使用)
nginx -s stop
重载配置是日常高频操作,但要注意:
bash复制nginx -s reload
重要提示:reload不会中断已有连接,新连接会应用新配置。如果修改了监听端口或协议类型,必须重启服务而非reload。
1.2 运行状态诊断
查看Nginx版本及编译参数:
bash复制nginx -V # 大写V显示详细参数
nginx -v # 小写v仅显示版本号
实时监控请求处理情况(需安装stub_status模块):
bash复制watch -n 1 "curl -s http://localhost/nginx_status"
输出示例:
code复制Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
1.3 日志操作技巧
日志切割是生产环境必备技能。我推荐使用logrotate方案:
bash复制# /etc/logrotate.d/nginx 配置示例
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
实时追踪错误日志(调试时非常有用):
bash复制tail -f /var/log/nginx/error.log | grep -E 'warn|error|crit'
2. 多环境部署实战指南
2.1 原生部署(CentOS示例)
在CentOS 7上的标准部署流程:
bash复制# 添加EPEL仓库
yum install epel-release
# 安装Nginx
yum install nginx
# 设置开机启动
systemctl enable nginx
# 启动服务
systemctl start nginx
防火墙配置要点:
bash复制firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
2.2 Docker化部署方案
推荐使用官方镜像的最佳实践:
bash复制docker run -d \
--name my-nginx \
-p 80:80 \
-p 443:443 \
-v /path/to/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /path/to/html:/usr/share/nginx/html:ro \
-v /path/to/logs:/var/log/nginx \
nginx:latest
避坑指南:Docker挂载配置文件时,务必添加:ro(只读)选项,防止容器意外修改配置文件。我曾遇到过容器内进程修改配置导致与宿主机版本不一致的问题。
2.3 性能调优参数
在/etc/nginx/nginx.conf中调整核心参数:
nginx复制worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 100000; # 每个worker能打开的文件描述符数量
events {
worker_connections 4096; # 单个worker最大连接数
multi_accept on; # 同时接受多个新连接
use epoll; # Linux高性能事件模型
}
3. 经典配置案例解析
3.1 反向代理配置
处理WebSocket代理的完整示例:
nginx复制location /socket.io/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 超时设置(重要!)
proxy_connect_timeout 7d;
proxy_send_timeout 7d;
proxy_read_timeout 7d;
}
3.2 负载均衡策略
带健康检查的负载均衡配置:
nginx复制upstream backend {
least_conn; # 最少连接算法
server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
# 保持连接池设置
keepalive 32;
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
3.3 静态资源优化
前端项目部署的最佳实践:
nginx复制server {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1024;
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
# 缓存控制
expires 1y;
add_header Cache-Control "public";
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public";
access_log off;
}
}
4. 生产环境疑难排解
4.1 性能瓶颈分析
使用ngx_http_stub_status_module监控指标:
nginx复制location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
关键指标解读:
- Active connections: 当前活跃连接数
- accepts/handled/requests: 总连接数/成功处理数/总请求数
- Reading: 读取请求头的连接数
- Writing: 处理请求中的连接数
- Waiting: 空闲连接数
4.2 常见错误处理
502 Bad Gateway问题排查步骤:
- 检查后端服务是否运行
- 验证proxy_pass地址是否正确
- 查看error_log中的具体错误
- 检查防火墙/SELinux设置
- 测试网络连通性
413 Request Entity Too Large解决方案:
nginx复制client_max_body_size 100M; # 在http或server块中设置
4.3 安全加固措施
基础安全配置模板:
nginx复制server {
# 禁用server tokens
server_tokens off;
# 安全头部
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# TLS最佳实践
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
}
在实际运维中,我发现很多问题都源于配置不当。建议每次修改配置后,先用nginx -t测试语法,然后在测试环境验证功能,最后再灰度发布到生产环境。对于关键业务,可以配置双Nginx实例做热备,通过keepalived实现VIP切换。
