Appearance
最少连接配置
最少连接算法将请求分配到当前连接数最少的服务器,适合请求处理时间差异较大的场景。
基本配置
启用最少连接
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提高性能
- 适用场景:请求处理时间差异大
- 监控:查看连接数状态
最少连接算法适合请求处理时间差异较大的场景,能更好地平衡服务器负载。