引言

反向代理和负载均衡是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;
}
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
# 安装Keepalived
yum install keepalived

# /etc/keepalived/keepalived.conf
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
# 主Nginx配置
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;

# API请求
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;
}

# Web请求
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
# 可能原因:
# 1. 使用ip_hash但客户端IP相同
# 2. 长连接导致连接不释放

# 解决:
upstream backend {
least_conn; # 使用最少连接算法
server 192.168.1.10:8080;
server 192.168.1.11:8080;

keepalive 32; # 启用长连接池
}

总结

Nginx负载均衡核心:

  1. 算法选择:根据场景选择合适的算法
  2. 健康检查:及时发现故障节点
  3. 会话保持:保证用户请求到同一后端
  4. 高可用:Keepalived实现故障转移
  5. 监控调试:实时监控系统状态

参考资料