Skip to content

最少连接配置

最少连接算法将请求分配到当前连接数最少的服务器,适合请求处理时间差异较大的场景。

基本配置

启用最少连接

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

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

工作原理

选择当前活动连接数最少的服务器:

  • 服务器A:10个连接
  • 服务器B:5个连接
  • 服务器C:2个连接
  • 新请求 → 服务器C

加权最少连接

配置方法

结合权重和连接数进行分配。

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1;
}

server {
    listen 80;
    server_name lb.example.com;

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

工作原理

综合考虑权重和连接数:

  • 计算公式:连接数 / 权重
  • 选择比值最小的服务器

完整配置

生产环境配置

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:8080 weight=1 max_fails=3 fail_timeout=30s;

    keepalive 32;
}

server {
    listen 80;
    server_name lb.example.com;

    access_log /var/log/nginx/lb.access.log;
    error_log /var/log/nginx/lb.error.log;

    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_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

连接数监控

查看当前连接数

nginx
server {
    listen 80;
    server_name status.example.com;

    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

访问 /nginx_status 查看状态:

Active connections: 100
server accepts handled requests
 10000 10000 20000
Reading: 0 Writing: 100 Waiting: 0

性能优化

连接复用

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;

    keepalive 32;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

超时设置

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;

        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

适用场景

请求处理时间差异大

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

说明:

  • 适合API服务
  • 适合数据库查询
  • 适合文件处理

服务器性能不均

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1;
}

说明:

  • 结合权重使用
  • 考虑服务器性能差异
  • 考虑当前负载

与轮询对比

轮询

nginx
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

特点:

  • 简单均匀
  • 不考虑负载
  • 适合请求处理时间相似

最少连接

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

特点:

  • 考虑当前负载
  • 动态分配
  • 适合请求处理时间差异大

常见问题

负载不均

原因: 服务器性能差异或权重设置不当

解决: 调整权重

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
}

连接数不准确

原因: keepalive连接未正确关闭

解决: 调整keepalive设置

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;

    keepalive 32;
    keepalive_timeout 60s;
}

总结

最少连接配置的关键点:

  • least_conn:启用最少连接算法
  • 加权:结合权重使用
  • 连接复用:keepalive提高性能
  • 适用场景:请求处理时间差异大
  • 监控:查看连接数状态

最少连接算法适合请求处理时间差异较大的场景,能更好地平衡服务器负载。