1. 为什么需要Nginx反向代理?
在Web服务架构中,反向代理(Reverse Proxy)扮演着流量调度员的角色。想象一下高峰期的地铁站,如果没有导流围栏和工作人员指挥,所有乘客一窝蜂挤向闸机是什么场景?反向代理就是那个维持秩序的关键角色。
我管理过多个日PV超百万的电商项目,Nginx反向代理的典型应用场景包括:
- 负载均衡:将请求分发到多个后端服务器,避免单点过载
- 安全防护:隐藏真实服务器IP,过滤恶意流量
- 缓存加速:对静态资源进行边缘缓存
- 协议转换:后端跑HTTP/1.1,前端提供HTTP/2服务
- 统一入口:多个服务共用80/443端口
注意:反向代理与正向代理的本质区别在于服务对象不同。正向代理代表客户端(如公司内网代理),反向代理代表服务端(如网站接入层)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Nginx核心配置详解
2.1 基础代理配置模板
这是经过20+生产环境验证的配置模板,保存为/etc/nginx/conf.d/proxy.conf:
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://backend_server;
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 60s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
# 启用HTTP长连接
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# 静态资源缓存
location ~* \.(jpg|png|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
}
关键参数解析:
proxy_pass:指定后端服务地址(可以是IP、域名或upstream组)X-Forwarded-For:保留原始客户端IP(重要!否则后端看到的全是Nginx IP)- 超时设置需要根据业务类型调整:API服务建议短超时(如5s),文件上传需要长超时
2.2 负载均衡实战
当需要代理多个后端时,使用upstream模块:
nginx复制upstream backend {
# 加权轮询
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080;
# 健康检查
check interval=3000 rise=2 fall=3 timeout=1000;
# 会话保持(基于cookie)
sticky cookie srv_id expires=1h domain=.yourdomain.com path=/;
}
server {
location / {
proxy_pass http://backend;
}
}
负载均衡策略对比:
| 策略类型 | 配置指令 | 适用场景 |
|---|---|---|
| 轮询(默认) | 无 | 后端服务器性能均衡 |
| 加权轮询 | weight=n | 服务器配置差异大 |
| IP哈希 | ip_hash | 需要会话保持 |
| 最少连接 | least_conn | 长连接服务(如WebSocket) |
2.3 HTTPS安全配置
现代网站必须的SSL配置(使用Let's Encrypt免费证书):
nginx复制server {
listen 443 ssl http2;
server_name yourdomain.com;
# 证书路径
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
# SSL协议优化
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;
# HSTS增强安全
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
location / {
proxy_pass http://backend;
# 传递HTTPS协议状态
proxy_set_header X-Forwarded-Proto https;
}
}
# HTTP强制跳HTTPS
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
踩坑提醒:混合内容(Mixed Content)是HTTPS常见问题。确保所有被代理的资源(CSS/JS/图片)也使用HTTPS链接。
3. 高级应用场景
3.1 前后端分离配置
现代Web项目典型架构:
nginx复制server {
location /api {
# 代理后端API
proxy_pass http://api_server;
# CORS配置
add_header 'Access-Control-Allow-Origin' '$http_origin';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,Content-Type';
}
location / {
# 前端静态资源
root /var/www/frontend;
try_files $uri $uri/ /index.html;
# 禁用缓存HTML文件
location ~* \.html$ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
}
}
}
3.2 代理WebSocket服务
实时应用配置要点:
nginx复制location /chat {
proxy_pass http://websocket_server;
# WebSocket必须的头部
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 长连接保持
proxy_read_timeout 3600s;
}
3.3 访问控制与限流
防护恶意请求的配置:
nginx复制# 限制单个IP并发连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_conn conn_limit 20;
# 请求速率限制
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
limit_req zone=req_limit burst=20 nodelay;
# 基础认证
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
生成密码文件命令:
bash复制printf "username:$(openssl passwd -crypt password)\n" >> /etc/nginx/.htpasswd
4. 性能调优与故障排查
4.1 内核参数优化
高并发场景需要调整系统参数(/etc/sysctl.conf):
bash复制# 最大文件描述符
fs.file-max = 655350
# 端口范围
net.ipv4.ip_local_port_range = 1024 65000
# 连接跟踪
net.netfilter.nf_conntrack_max = 655350
net.ipv4.netfilter.ip_conntrack_max = 655350
# TCP缓冲区
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
应用配置:sysctl -p
4.2 Nginx性能参数
关键配置项(nginx.conf的events模块):
nginx复制worker_processes auto; # 通常设为CPU核心数
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll; # Linux高性能模式
multi_accept on;
}
4.3 常见问题排查
问题1:502 Bad Gateway
- 检查后端服务是否存活:
curl -v http://backend - 查看Nginx错误日志:
tail -f /var/log/nginx/error.log - 可能是权限问题:确保Nginx用户(通常是www-data或nginx)有权限访问代理目标
问题2:上传大文件失败
- 调整客户端最大body大小:
client_max_body_size 100M; - 增加超时时间:
nginx复制proxy_connect_timeout 300s; proxy_read_timeout 300s;
问题3:性能瓶颈
- 启用状态监控:
nginx复制location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } - 使用
top -H查看Nginx worker进程CPU占用
5. 生产环境最佳实践
5.1 配置管理建议
-
模块化配置:
code复制/etc/nginx/ ├── nginx.conf # 主配置 ├── conf.d/ # 通用配置片段 │ ├── proxy.conf # 反向代理配置 │ ├── ssl.conf # SSL通用配置 ├── sites-available/ # 虚拟主机配置 ├── sites-enabled/ # 启用的虚拟主机(软链接) -
版本控制:
bash复制# 将配置纳入Git管理 cd /etc/nginx git init git add . git commit -m "Initial nginx config"
5.2 安全加固措施
- 禁用server tokens(隐藏Nginx版本信息):
nginx复制server_tokens off; - 限制HTTP方法:
nginx复制if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 405; } - 防护常见攻击:
nginx复制# 禁止iframe嵌套 add_header X-Frame-Options "SAMEORIGIN"; # XSS防护 add_header X-XSS-Protection "1; mode=block"; # 禁用内容类型嗅探 add_header X-Content-Type-Options "nosniff";
5.3 日志分析技巧
推荐日志格式:
nginx复制log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
常用分析命令:
bash复制# 统计HTTP状态码
awk '{print $9}' access.log | sort | uniq -c
# 响应时间TOP10
awk '{print $1, $NF}' access.log | sort -k2 -rn | head
# 实时监控异常请求
tail -f access.log | grep -E '50[0-9]'
