# 长连接配置
http {
# 客户端到Nginx的连接
keepalive_timeout 65s; # 长连接保持时间
keepalive_requests 100; # 单个连接最大请求数
# Nginx到上游服务器的连接
upstream backend {
server 192.168.1.10:8080;
keepalive 32; # 连接池大小
keepalive_timeout 60s; # 连接保持时间
}
# 启用长连接
location / {
proxy_http_version 1.1; # 使用HTTP/1.1
proxy_set_header Connection "";
proxy_pass http://backend;
}
}
| 指标 | 短连接 | 长连接 | 优势方 |
|---|---|---|---|
| 连接建立开销 | 每次请求都需要TCP三次握手 | 一次连接,多次请求 | 长连接 |
| 系统资源消耗 | 高(频繁创建/销毁连接) | 低(连接复用) | 长连接 |
| 网络延迟 | 高(每次握手+RTT) | 低(避免握手开销) | 长连接 |
| 服务器并发能力 | 受限于最大连接数 | 更高(连接复用) | 长连接 |
| 内存占用 | 连接频繁创建/释放,内存碎片多 | 连接池稳定,内存利用率高 | 长连接 |
| 实时性 | 每次都是新连接 | 可能受之前请求影响 | 短连接 |
| 故障恢复 | 天然隔离故障 | 需要额外机制处理故障连接 | 短连接 |
场景:1000个并发用户,每个用户10个请求
短连接:
- QPS: 1200 requests/sec
- 平均响应时间: 85ms
- 服务器连接数峰值: 9500
- CPU使用率: 65%
长连接:
- QPS: 2800 requests/sec
- 平均响应时间: 35ms
- 服务器连接数峰值: 180
- CPU使用率: 45%
http {
# 优化长连接参数
keepalive_timeout 75s; # 根据业务调整
keepalive_requests 500; # 提高复用次数
# 连接池优化
upstream backend {
keepalive 100; # 根据后端容量调整
keepalive_timeout 120s;
keepalive_requests 1000;
}
# TCP优化
tcp_nodelay on; # 禁用Nagle算法
tcp_nopush on; # 优化数据包发送
}
# 监控连接状态
netstat -an | grep :80 | wc -l
ss -s | grep -i total
# Nginx状态监控
# 在nginx.conf中添加
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
# 根据请求类型选择
map $uri $use_keepalive {
default "on";
"~*\.(jpg|png|css|js)$" "on"; # 静态资源用长连接
"/api/transaction" "off"; # 关键交易用短连接
}
# 使用ab测试
# 短连接测试
ab -n 10000 -c 100 -H "Connection: close" http://example.com/
# 长连接测试
ab -n 10000 -c 100 -k http://example.com/
# 使用wrk测试(更好的长连接支持)
wrk -t4 -c100 -d30s --latency http://example.com/
最终结论:在大多数生产环境中,合理配置的长连接相比短连接能带来 2-5倍的性能提升,特别是在高并发、小请求场景下效果尤为显著。但需要根据具体业务特点进行精细调优。