在分布式架构和微服务盛行的今天,反向代理已成为现代Web架构的标配组件。与传统正向代理不同,反向代理位于服务器端,对外隐藏真实服务器拓扑,对内实现请求分发和负载均衡。这种架构带来的核心价值体现在三个方面:
首先是安全性提升。客户端只与反向代理通信,真实服务器IP和端口得以隐藏,有效降低直接暴露带来的DDoS攻击风险。其次是扩展性增强。通过动态增减后端节点,配合健康检查机制,可以实现无缝的水平扩展。最后是运维便利性。SSL终止、缓存策略、流量控制等通用功能可以在反向代理层统一实现,避免每个后端服务重复开发。
在众多反向代理解决方案中,Nginx凭借其事件驱动架构和高效的内存管理,成为处理高并发请求的首选。官方测试数据显示,单台Nginx服务器可轻松支撑5万以上的并发连接,内存占用却只有Apache的1/10。特别是在长连接场景下,Nginx的epoll模型相比传统多线程方案具有明显的性能优势。
upstream模块通过upstream指令块定义后端服务器组,基本语法结构如下:
nginx复制upstream backend {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
每个server指令支持以下关键参数:
weight:权重配置,默认为1,数值越大分配流量越多max_fails:健康检查失败阈值,超过该次数标记为不可用fail_timeout:失败超时时间,期间不再分配请求backup:标记为备用服务器,仅当主服务器不可用时启用down:手动标记服务器为永久不可用状态Nginx upstream支持多种负载均衡策略,通过upstream指令的第二个参数指定:
轮询(默认):均匀分发请求,适合服务器配置相近的场景
nginx复制upstream backend {
server 192.168.1.100;
server 192.168.1.101;
}
加权轮询:根据服务器处理能力分配不同权重
nginx复制upstream backend {
server 192.168.1.100 weight=3;
server 192.168.1.101 weight=1;
}
IP哈希:基于客户端IP固定分配到某台服务器,解决会话保持问题
nginx复制upstream backend {
ip_hash;
server 192.168.1.100;
server 192.168.1.101;
}
最少连接:优先分配给当前连接数最少的服务器,适合长连接场景
nginx复制upstream backend {
least_conn;
server 192.168.1.100;
server 192.168.1.101;
}
Nginx通过被动健康检查机制监控后端状态。当某台服务器连续返回max_fails次错误(默认1次),该服务器将被标记为不可用,经过fail_timeout(默认10秒)后再次尝试恢复。
对于需要主动健康检查的场景,可以搭配第三方模块如nginx_upstream_check_module,该模块支持定时发送特定请求验证服务可用性:
nginx复制upstream backend {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
check interval=3000 rise=2 fall=3 timeout=1000 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
以下是一个完整的HTTP反向代理配置示例,包含常用优化参数:
nginx复制server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
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_send_timeout 60s;
proxy_read_timeout 60s;
# 缓冲区优化
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 24k;
proxy_temp_file_write_size 32k;
# 其他优化
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
upstream backend {
server 192.168.1.100:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.101:8080 weight=1 max_fails=3 fail_timeout=30s;
keepalive 32;
}
当代理HTTPS服务时,需要特别注意SSL证书的处理:
nginx复制server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass https://backend;
proxy_ssl_server_name on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_verify off; # 生产环境应设为on并配置CA证书
proxy_ssl_trusted_certificate /path/to/ca.crt;
# 保持与HTTP代理相同的其他配置
}
}
代理WebSocket连接需要特殊配置:
nginx复制server {
listen 80;
server_name ws.example.com;
location / {
proxy_pass http://ws_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400s; # 长连接超时设置
}
}
upstream ws_backend {
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
通过Nginx Plus或开源模块可以实现动态upstream管理:
DNS解析:定期更新DNS记录
nginx复制upstream backend {
zone backend 64k;
server backend.example.com resolve;
resolver 8.8.8.8 valid=30s;
}
API动态配置:使用nginx-module-vts等模块通过API动态增删节点
合理配置keepalive连接池可显著提升性能:
nginx复制upstream backend {
server 192.168.1.100;
server 192.168.1.101;
keepalive 32; # 每个worker保持的连接数
keepalive_requests 100; # 单个连接最大请求数
keepalive_timeout 60s; # 空闲连接保持时间
}
反向代理层缓存可以极大减轻后端压力:
nginx复制proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
location / {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
}
}
可能原因及解决方案:
后端服务不可用
代理超时设置过短
proxy_connect_timeout、proxy_read_timeout等参数缓冲区不足
proxy_buffer_size和proxy_buffers大小排查步骤:
weight参数配置ip_hash导致分布不均关键性能参数建议值(针对4核8G服务器):
nginx复制worker_processes auto;
worker_connections 4096;
multi_accept on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
建议日志格式包含代理相关信息:
nginx复制log_format proxy_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_addr $upstream_response_time';
access_log /var/log/nginx/proxy_access.log proxy_log;
启用stub_status模块获取基础指标:
nginx复制location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
对于更全面的监控,建议使用Prometheus + Grafana方案,配合nginx-vts-exporter采集指标。
建议设置以下告警阈值: