以下是一个关于Nginx反向代理的详细配置示例,涵盖基础功能、高级场景及安全加固方案:
一、基础反向代理配置
http {
# 定义后端服务器组(单节点示例)
upstream backend_app {
server 192.168.1.100:8080; # 应用服务器地址
keepalive 32; # 保持32个长连接(减少TCP握手开销)
}
server {
listen 80;
server_name proxy.example.com;
# HTTP强制跳转HTTPS
if ($scheme = http) {
return 301 https://$host$request_uri;
}
location / {
# 基础代理配置
proxy_pass http://backend_app;
proxy_set_header Host $host; # 传递原始Host头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链信息
proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议
# 连接超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
# 缓冲区配置(优化大文件传输)
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
}
}
}
二、高级反向代理场景
1. 多后端服务路由
http {
upstream api_gateway {
server 192.168.1.101:8080 weight=5; # 主服务(权重5)
server 192.168.1.102:8080 backup; # 备用服务(仅当主服务不可用时启用)
}
upstream static_assets {
server 10.0.0.20:8080; # 独立静态资源服务器
keepalive 16;
}
server {
listen 443 ssl http2;
server_name api.example.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/api.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/api.example.com.key;
# 路由规则
location /api/ {
proxy_pass http://api_gateway;
proxy_intercept_errors on; # 拦截后端5xx错误
error_page 502 = @fallback; # 自定义降级页面
}
location /static/ {
proxy_pass http://static_assets;
add_header Cache-Control "public, max-age=2592000"; # 30天浏览器缓存
}
# 降级处理
location @fallback {
return 503 "Service Temporarily Unavailable";
}
}
}
2. WebSocket代理
http {
upstream websocket_backend {
server 192.168.1.103:8080;
keepalive 16;
}
server {
listen 443 ssl;
server_name ws.example.com;
location /ws/ {
proxy_pass http://websocket_backend;
proxy_http_version 1.1; # 必须使用HTTP/1.1
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400; # 长连接超时时间(24小时)
}
}
}
3. 代理缓存配置
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_zone:100m inactive=7d max_size=10g; # 缓存存储配置
server {
listen 80;
server_name cache.example.com;
location / {
proxy_pass http://backend_cdn;
proxy_cache cache_zone; # 启用缓存
proxy_cache_valid 200 302 10m; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
proxy_cache_use_stale error timeout updating http_502; # 后端故障时使用过期缓存
}
}
}
三、安全加固配置
1. 请求限速
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; # 全局限速区
server {
location /api/sensitive {
limit_req zone=api_limit burst=20 nodelay; # 突发20请求,不延迟
limit_conn addr 5; # 单IP最大并发连接数
}
}
}
2. 访问控制
server {
listen 80;
server_name admin.example.com;
# 基础认证
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# IP白名单
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
# 防止恶意请求
if ($request_method !~ ^(GET|POST|HEAD)$ ) {
return 444;
}
location / {
proxy_pass http://backend_admin;
}
}
3. 敏感信息过滤
server {
listen 443 ssl;
server_name api.example.com;
# 过滤敏感头信息
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
# 禁止访问敏感路径
location ~ /(\.git|\.env|\.sql) {
deny all;
return 404;
}
}
四、监控与调试配置
1. 实时状态监控
http {
server {
listen 8080;
server_name status.example.com;
location /nginx_status {
stub_status on; # 基础状态页
allow 192.168.1.0/24; # 仅允许内网访问
deny all;
}
location /upstream_status {
upstream_conf; # Nginx Plus专用状态页
allow 192.168.1.0/24;
deny all;
}
}
}
2. 详细访问日志
http {
log_format proxy_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/proxy_access.log proxy_log;
}
五、配置验证与优化
-
语法检查
nginx -t -c /path/to/nginx.conf # 指定配置文件测试
-
平滑重载配置
nginx -s reload # 不中断服务加载新配置
-
性能调优建议
- 根据业务特性调整
worker_processes
和worker_connections
- 对静态资源启用
open_file_cache
提升文件读取效率 - 使用
tcp_nopush
和tcp_nodelay
优化TCP传输 - 监控
proxy_cache
命中率,定期清理过期缓存
- 根据业务特性调整
通过合理配置反向代理,可实现请求路由、负载均衡、安全防护、性能优化等核心功能。实际部署时建议通过压力测试工具(如wrk、ab)验证配置效果,并根据监控数据持续优化参数。