引言
反向代理和负载均衡是Nginx的核心功能。本文详细讲解其配置和应用。
一、反向代理
1.1 基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| server { listen 80; server_name api.example.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_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 4k; } }
|
1.2 WebSocket代理
1 2 3 4 5 6 7 8
| location /ws { proxy_pass http://websocket_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400; }
|
1.3 动静分离
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| server { listen 80; server_name example.com;
location ~* \.(jpg|jpeg|png|gif|css|js)$ { root /var/www/static; expires 30d; add_header Cache-Control "public, immutable"; }
location / { proxy_pass http://backend; } }
|
二、负载均衡算法
2.1 轮询(默认)
1 2 3 4 5
| upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; }
|
2.2 加权轮询
1 2 3 4 5
| upstream backend { server 192.168.1.10:8080 weight=5; server 192.168.1.11:8080 weight=3; server 192.168.1.12:8080 weight=2; }
|
2.3 IP哈希
1 2 3 4 5
| upstream backend { ip_hash; server 192.168.1.10:8080; server 192.168.1.11:8080; }
|
2.4 最少连接
1 2 3 4 5
| upstream backend { least_conn; server 192.168.1.10:8080; server 192.168.1.11:8080; }
|
2.5 一致性哈希
1 2 3 4 5
| upstream backend { hash $request_uri consistent; server 192.168.1.10:8080; server 192.168.1.11:8080; }
|
三、健康检查
3.1 被动健康检查
1 2 3 4
| upstream backend { server 192.168.1.10:8080 max_fails=3 fail_timeout=30s; server 192.168.1.11:8080 max_fails=3 fail_timeout=30s; }
|
3.2 主动健康检查(商业版)
1 2 3 4 5 6
| upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; health_check interval=5s fails=3 passes=2; }
|
四、会话保持
4.1 IP哈希
1 2 3 4 5
| upstream backend { ip_hash; server 192.168.1.10:8080; server 192.168.1.11:8080; }
|
4.2 Cookie
1 2 3 4 5
| upstream backend { server 192.168.1.10:8080; server 192.168.1.11:8080; sticky cookie srv_id expires=1h domain=.example.com path=/; }
|
五、高可用架构
5.1 Keepalived + Nginx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| yum install keepalived
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 } }
|
5.2 完整架构示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| upstream backend_api { least_conn; server 192.168.1.10:8080 max_fails=2 fail_timeout=10s; server 192.168.1.11:8080 max_fails=2 fail_timeout=10s; server 192.168.1.12:8080 max_fails=2 fail_timeout=10s backup; }
upstream backend_web { ip_hash; server 192.168.1.20:80; server 192.168.1.21:80; }
server { listen 80; server_name example.com;
location /api { proxy_pass http://backend_api; proxy_next_upstream error timeout http_500 http_502 http_503; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
location / { proxy_pass http://backend_web; proxy_set_header Host $host; } }
|
六、监控与调试
6.1 状态监控
1 2 3 4 5 6
| location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; }
|
6.2 upstream状态
1 2 3 4
| location /upstream_status { upstream_status; access_log off; }
|
七、常见问题
7.1 502 Bad Gateway
1 2 3 4 5 6 7 8 9
| 原因: 1. 后端服务未启动 2. 网络不通 3. 超时时间过短
解决: - 检查后端服务状态 - 检查防火墙 - 增加超时时间
|
7.2 负载不均衡
1 2 3 4 5 6 7 8 9 10 11 12
|
upstream backend { least_conn; server 192.168.1.10:8080; server 192.168.1.11:8080; keepalive 32; }
|
总结
Nginx负载均衡核心:
- 算法选择:根据场景选择合适的算法
- 健康检查:及时发现故障节点
- 会话保持:保证用户请求到同一后端
- 高可用:Keepalived实现故障转移
- 监控调试:实时监控系统状态
参考资料