Keepalive 是 HTTP 协议中的一个重要特性,它允许客户端和服务器之间的 TCP 连接在完成一次请求/响应后保持打开状态,以便后续请求可以复用这个连接,从而减少 TCP 握手和慢启动的开销,提高性能。
在 Nginx 中,keepalive 相关的配置主要在以下几个指令中:
http {
keepalive_timeout 65; # 保持连接的超时时间,单位秒
keepalive_requests 100; # 一个连接上最多可以发送的请求数
server {
listen 80;
location / {
# 其他配置...
}
}
}
keepalive_timeout
:设置客户端连接保持活动的超时时间。第一个参数设置超时时间,第二个可选参数设置"Keep-Alive: timeout=time"响应头字段keepalive_requests
:设置一个 keepalive 连接上可以服务的最大请求数当 Nginx 作为反向代理时,可以配置到上游服务器的 keepalive 连接:
upstream backend {
server backend1.example.com;
server backend2.example.com;
keepalive 32; # 保持到每个上游服务器的空闲连接数
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 其他代理配置...
}
}
关键配置说明:
- keepalive
:设置每个 worker 进程与上游服务器保持的空闲 keepalive 连接的最大数量
- proxy_http_version 1.1
:强制使用 HTTP/1.1,因为 HTTP/1.0 不支持 keepalive
- proxy_set_header Connection ""
:清除 Connection 头,防止传递错误的 keepalive 信息
http {
keepalive_timeout 30s 25s; # 服务器保持30秒,告诉客户端保持25秒
}
server {
location /api/ {
keepalive_timeout 120s;
keepalive_requests 500;
}
}
可以通过 Nginx 的 stub_status 模块监控 keepalive 连接:
server {
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
访问 /nginx_status
可以看到类似如下的信息:
Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
其中: - Active connections: 当前活跃连接数 - Waiting: 保持 keepalive 状态的连接数
合理设置 keepalive_timeout:
调整 keepalive_requests:
上游服务器 keepalive:
keepalive
值应该根据上游服务器性能和负载情况调整监控和调优:
注意内存使用:
通过合理配置 keepalive,可以显著减少 TCP 连接建立的开销,提高服务器性能和响应速度。