1. Nginx配置核心场景解析
作为从业十年的运维工程师,我处理过的Nginx配置案例不下千例。今天要分享的不是那些晦涩难懂的高阶玩法,而是真正经得起实战考验的常用配置模板。这些配置片段就像瑞士军刀,能解决80%的日常Web服务需求。
先看几个典型应用场景:
- 前端项目部署时的路由重定向
- API服务的负载均衡配置
- 静态资源缓存策略优化
- HTTPS安全加固方案
- 恶意请求拦截规则
这些场景下的配置看似简单,但每个参数背后都有值得深究的设计逻辑。接下来我会用生产环境验证过的配置示例,带你理解每个指令的实际作用。
2. 基础配置模板剖析
2.1 最小化安全配置
这是每个Nginx配置都应该包含的基础安全设置:
nginx复制server {
listen 80;
server_name _;
# 基础安全头
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# 隐藏版本信息
server_tokens off;
# 限制HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
location / {
return 444; # 默认丢弃请求
}
}
关键点解析:
server_tokens off防止暴露Nginx版本信息- HTTP方法限制能有效防御恶意扫描
- 默认返回444状态码直接关闭连接,比403更安全
实测建议:这些头信息应该通过单独文件引入,方便统一管理
2.2 静态资源服务配置
前端项目部署的黄金配置:
nginx复制server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
}
缓存策略设计要点:
- 静态资源设置1年超长缓存
immutable声明资源永不改变- 哈希命名的资源才适合这种策略
常见踩坑:
- 非哈希命名的资源设置immutable会导致更新失效
- 未配置try_files会导致Vue Router的history模式路由失效
3. 高级配置实战
3.1 HTTPS强化配置
现代Web必备的TLS配置模板:
nginx复制server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# TLS协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
# HSTS安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 1.1.1.1 valid=300s;
}
安全加固要点:
- 禁用TLS 1.0/1.1等不安全协议
- 精选支持前向保密的加密套件
- HSTS头预防SSL剥离攻击
- OCSP装订提升验证效率
证书管理经验:
- 使用acme.sh自动续期Let's Encrypt证书
- 证书链文件必须包含中间证书
- 私钥权限应设为600
3.2 负载均衡配置
API集群的负载均衡方案:
nginx复制upstream api_backend {
zone api_servers 64k;
server 10.0.0.1:8000 weight=5;
server 10.0.0.2:8000 weight=3;
server 10.0.0.3:8000 backup;
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超时控制
proxy_connect_timeout 3s;
proxy_read_timeout 10s;
}
}
调优关键参数:
keepalive复用TCP连接提升性能- 权重分配实现差异化流量调度
- backup节点提供故障转移能力
监控要点:
- 通过stub_status模块监控连接数
- 日志记录$upstream_addr分析分发情况
- 使用nginx-plus获取更详细监控指标
4. 实用配置片段集锦
4.1 防盗链配置
保护图片资源不被盗用:
nginx复制location ~* \.(jpg|png|gif)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
# 或者重写到警告图片
# rewrite ^ /anti-hotlink.png;
}
}
进阶方案:
- 签名URL实现临时访问授权
- 配合CDN的边缘鉴权功能
- 使用watermark模块添加动态水印
4.2 访问限流配置
防御CC攻击的基础配置:
nginx复制limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
# 正常业务配置
proxy_pass http://backend;
}
}
精细控制策略:
- 按接口路径设置不同限流阈值
- 白名单IP跳过限流检查
- 结合geo模块实现地域限流
4.3 日志优化配置
结构化日志便于分析:
nginx复制log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"request_time":"$request_time",'
'"upstream_response_time":"$upstream_response_time"'
'}';
access_log /var/log/nginx/access.log json_combined;
日志分析技巧:
- 使用ELK栈实现可视化分析
- 重点监控$request_time异常值
- 定期日志轮转防止磁盘写满
5. 调试与问题排查
5.1 配置检查流程
每次修改配置后的必做检查:
bash复制# 测试配置语法
nginx -t
# 逐步重载配置
nginx -s reload
# 监控错误日志
tail -f /var/log/nginx/error.log
常见错误:
- 缺失分号导致语法错误
- 权限问题导致静态资源403
- worker_connections超出限制
5.2 性能调优参数
关键性能参数参考:
nginx复制worker_processes auto; # 匹配CPU核心数
worker_connections 1024; # 每个worker最大连接数
keepalive_timeout 65; # TCP连接保持时间
client_max_body_size 50m; # 文件上传大小限制
# 启用gzip压缩
gzip on;
gzip_types text/plain text/css application/json;
调优经验:
- 使用
worker_rlimit_nofile提升文件描述符限制 - 调整
multi_accept优化连接处理模式 - 在高并发场景下需要优化内核参数
5.3 常见故障处理
典型问题解决方案:
- 502 Bad Gateway
- 检查后端服务是否存活
- 调整proxy_read_timeout值
- 验证防火墙规则
- 地址重写循环
- 检查rewrite规则是否有终止标志
- 使用
rewrite_log调试
- CPU占用过高
- 限制worker_processes数量
- 检查是否存在大量正则匹配
- 使用strace跟踪进程状态