Nginx如何处理长连接?

Nginx可以通过keepalive模块处理长连接。长连接允许客户端在同一个TCP连接上发送多个请求,以减少连接握手的开销,提高网站性能。

keepalive_timeout指令用于设置长连接超时时间:
keepalive_timeout timeout [header_timeout];

  • timeout:长连接的超时时间,单位为秒,超过该时间长连接自动关闭。
  • header_timeout:可选,用于设置接收客户端请求报文头部的超时时间,如果在该时间内没有接收到请求头部,长连接自动关闭,默认为0,不设置超时。

配置示例:

keepalive_timeout 5 60;  

server {
    listen 80;
    keepalive_requests 100; # 长连接上允许的最大请求数

    ...
}

上例设置了长连接总超时时间为60秒,接收客户端请求头部的超时时间为5秒。一个长连接上最多允许100个请求,超过自动关闭长连接。

长连接的工作原理:

  1. 客户端发起第一个请求,请求头部的Connection字段值为keepalive,表示要求启用长连接。
  2. Nginx根据配置判断是否启用长连接,如果允许则在响应报文头部添加”Connection: keepalive”。
  3. 客户端可以在同一个连接上继续发送请求,Nginx会根据配置的keepalive_timeout及keepalive_requests限制连接的超时时间和最大请求数。
  4. 如果客户端超过限制或者主动关闭连接,Nginx会自动关闭长连接。

keepalive模块的主要优点是:

  1. 降低连接创建和关闭的开销,提高网站性能。
  2. 避免TIME_WAIT状态的产生,减少端口的消耗。