文章

nginx反向代理及负载均衡

nginx反向代理及负载均衡

反向代理

以下是一个简单的 Nginx 反向代理配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
server {
    listen 80;
    server_name 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_pass:将请求转发到指定的后端服务器。
  • proxy_set_header:设置传递给后端服务器的 HTTP 头部信息。

负载均衡

负载均衡将网络请求分发到多个服务器上,以实现系统的高可用。

负载均衡的策略:
  1. 轮询(Round Robin):依次将请求分发到每个服务器。
  2. 最少连接(Least Connections):将请求分发到当前连接数最少的服务器。
  3. IP 哈希(IP Hash):根据客户端 IP 地址的哈希值分发请求,保证同一客户端的请求被分发到同一服务器。

以下是一个 Nginx 负载均衡配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http {
    upstream backend_servers {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_servers;
            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;
        }
    }
}
  • upstream:定义一个上游服务器组。
  • server:指定上游服务器地址。
使用不同负载均衡策略:
  1. 轮询(默认)
    1
    2
    3
    4
    5
    
    upstream backend_servers {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
    
  2. 最少连接
    1
    2
    3
    4
    5
    6
    
    upstream backend_servers {
        least_conn;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
    
  3. IP 哈希
    1
    2
    3
    4
    5
    6
    
    upstream backend_servers {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
    }
    

高级配置与优化

  1. 健康检查: 使用 ngx_http_upstream_modulehealth_check 指令进行健康检查。

    1
    2
    3
    4
    5
    6
    
    upstream backend_servers {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        health_check;
    }
    
  2. 缓存配置: 使用 proxy_cache 指令缓存后端服务器的响应。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
       
    server {
        location / {
            proxy_pass http://backend_servers;
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
        }
    }
    
  3. SSL/TLS 配置: 在反向代理服务器上处理 SSL/TLS 加密。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    server {
        listen 443 ssl;
        server_name example.com;
       
        ssl_certificate /path/to/cert.pem;
        ssl_certificate_key /path/to/key.pem;
       
        location / {
            proxy_pass http://backend_servers;
            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;
        }
    }
    
本文由作者按照 CC BY 4.0 进行授权