HTTP协议中的Keep-Alive问题主要指客户端与服务器使用持久连接(Keep-Alive)时出现的一些问题。这通常由以下原因导致:
- 连接泄露: Keep-Alive连接未被正确关闭,导致资源耗尽。
- 请求限制: Keep-Alive连接上存在请求数量限制,超出限制后导致问题。
- 分片传输: 大文件在Keep-Alive连接上分片传输,但连接在文件传输完成前关闭,导致文件损坏。
- 流水线阻塞: Keep-Alive连接上的流水线请求被前序请求长时间阻塞,影响用户体验。
- 连接复用安全: 多个请求在一个Keep-Alive连接上交叉执行,导致信息安全问题。
避免方法:
- 设置正确的超时时间,定期关闭闲置连接。
- 明确指定最大请求数量限制,避免默认限制导致的问题。
- 对分片传输文件使用连接复用 indicator 保持连接打开。
- 限制流水线中最大阻塞时间,避免请求长时间等待。
- 每次请求都包含识别会话或身份的信息,在服务端验证连接上下文。
- 安全相关请求后关闭连接,避免信息泄露风险。
代码示例:
设置超时时间关闭连接:
nginx
keepalive_timeout 60; // 60秒内无请求则关闭连接
最大请求数量:
nginx
keepalive 100; // 每个连接最多处理100个请求
连接复用 indicator:
Connection: Keep-Alive
限制流水线阻塞:
nginx
proxy_max_temp_file_size 0; // 禁用响应缓冲
会话标识:
php
session_start();
关闭连接:
nginx
location ~* ^/auth$ {
...
proxy_http_version 1.1;
proxy_set_header Connection "";
}