插件窝 干货文章 Nginx中的upstream模块如何使用

Nginx中的upstream模块如何使用

backend server example Upstream 851    来源:    2025-04-26

Nginx Upstream模块使用指南

upstream模块是Nginx中用于定义后端服务器组的模块,主要用于负载均衡和代理设置。以下是upstream模块的详细使用方法:

基本配置语法

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

服务器参数配置

可以为每个后端服务器指定额外参数:

upstream backend {
    server backend1.example.com weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3.sock;

    server backup1.example.com:8080 backup;
    server backup2.example.com:8080 down;
}

常用服务器参数:

  • weight=number - 设置服务器权重,默认为1
  • max_conns=number - 限制到代理服务器的最大并发连接数
  • max_fails=number - 失败尝试次数,超过后暂停服务
  • fail_timeout=time - 服务器不可用时间(与max_fails配合使用)
  • backup - 标记为备用服务器,当主服务器不可用时启用
  • down - 标记服务器永久不可用

负载均衡方法

Nginx支持多种负载均衡算法:

1. 轮询(默认)

upstream backend {
    # 默认就是轮询
    server backend1.example.com;
    server backend2.example.com;
}

2. 加权轮询

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=2;
    server backend3.example.com;
}

3. IP哈希(保持会话)

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

4. 最少连接数

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
}

5. 基于响应时间的负载均衡(商业版Nginx Plus)

upstream backend {
    fair;
    server backend1.example.com;
    server backend2.example.com;
}

健康检查

Nginx Plus提供主动健康检查功能:

upstream backend {
    zone backend 64k;
    server backend1.example.com;
    server backend2.example.com;

    health_check interval=5s fails=3 passes=2 uri=/health;
}

开源版可通过第三方模块或被动健康检查实现:

upstream backend {
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=3 fail_timeout=30s;
}

高级配置

1. 保持连接

upstream backend {
    server backend1.example.com;
    server backend2.example.com;

    keepalive 32;  # 保持的连接数
}

2. 共享内存区

upstream backend {
    zone backend 64k;  # 为worker进程间共享配置分配内存
    server backend1.example.com;
    server backend2.example.com;
}

3. 自定义哈希键

upstream backend {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

实际应用示例

1. Web应用负载均衡

upstream web_app {
    server 10.0.0.1:8080 weight=3;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080 backup;

    keepalive 16;
}

server {
    listen 80;

    location / {
        proxy_pass http://web_app;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

2. 高可用数据库连接池

upstream mysql_servers {
    least_conn;
    server db1.example.com:3306;
    server db2.example.com:3306;
    server db3.example.com:3306 backup;
}

server {
    listen 3306;
    proxy_pass mysql_servers;
}

注意事项

  1. 当使用ip_hash时,不能使用weight参数
  2. keepalive指令需要配合proxy_http_version 1.1proxy_set_header Connection ""使用
  3. 对于HTTPS后端,需要配置适当的SSL参数
  4. 监控upstream状态可以通过ngx_http_upstream_module提供的变量实现

通过合理配置upstream模块,可以构建高性能、高可用的后端服务架构。