WEBKT

Nginx 高并发下的 Keepalive 优化实践:参数配置与性能调优

60 0 0 0

什么是 Keepalive?为什么要关注它?

Nginx 中 Keepalive 的相关参数

1. keepalive_timeout (http, upstream, proxy_http)

2. keepalive_requests (http, upstream, proxy_http)

3. keepalive_disable (http)

4. proxy_http_version (proxy_http)

5. proxy_keepalive_timeout (proxy_http)

6. proxy_max_conns (upstream)

最佳实践:如何配置 Keepalive 参数

1. keepalive_timeout 的配置

2. keepalive_requests 的配置

3. proxy_http_version 和 proxy_set_header Connection 的配置

4. proxy_max_conns 的配置

Keepalive 优化中的常见问题与解决方案

1. Keepalive 连接超时

2. 连接数过多

3. Keepalive 无法生效

总结

附录:Nginx 配置示例

结语

大家好,我是老码农。今天我们来聊聊 Nginx 在高并发场景下,如何通过合理配置 Keepalive 参数来提升性能。如果你是一位运维工程师或者开发人员,正在为服务器性能优化而苦恼,那么这篇文章绝对值得你花时间阅读。

什么是 Keepalive?为什么要关注它?

首先,我们得搞清楚 Keepalive 是个啥。简单来说,Keepalive 是一种保持连接的技术。在 HTTP 协议中,它允许客户端和服务器之间通过一个 TCP 连接来发送多个 HTTP 请求和响应,避免了频繁地建立和关闭连接的开销。这就像你和你的朋友约饭,如果每次都要重新打电话、确认地点、见面,那效率得多低啊!Keepalive 就好比你们约好了一起吃,之后的所有点菜和聊天都可以在一起吃的时候进行。

在高并发的场景下,频繁地创建和关闭 TCP 连接会带来巨大的开销,包括:

  • 握手开销: TCP 的三次握手需要消耗时间和资源。
  • 慢启动: 新建连接需要经历 TCP 慢启动过程,影响传输效率。
  • 系统资源消耗: 连接的建立和关闭都需要消耗服务器的 CPU、内存等资源。

而 Keepalive 通过复用已有的连接,可以显著减少这些开销,提高服务器的吞吐量和响应速度。

Nginx 中 Keepalive 的相关参数

Nginx 中与 Keepalive 相关的参数主要集中在 httpupstreamproxy_http 模块中。下面我们逐一介绍:

1. keepalive_timeout (http, upstream, proxy_http)

这个参数定义了保持连接的超时时间。如果一个连接在 keepalive_timeout 时间内没有新的请求或响应,那么 Nginx 会主动关闭这个连接。这个参数的配置需要根据实际的业务场景来调整。如果你的业务请求间隔较短,那么可以适当增加这个值;如果请求间隔较长,或者服务器的并发连接数较高,那么可以适当减小这个值。

  • 单位:
  • 默认值: 75s
  • 配置位置: http 块,upstream 块,proxy_http
  • 影响:
    • http 块中的 keepalive_timeout 参数,影响 Nginx 作为服务器端,客户端与 Nginx 之间的 Keepalive 连接。
    • upstream 块中的 keepalive_timeout 参数,影响 Nginx 作为客户端,与后端服务器之间的 Keepalive 连接。
    • proxy_http 块中的 keepalive_timeout 参数,与 upstream 块中的 keepalive_timeout 参数作用相同,主要用于代理 HTTP 请求。

2. keepalive_requests (http, upstream, proxy_http)

这个参数定义了一个 Keepalive 连接上可以处理的最大请求数。当一个连接处理的请求数达到 keepalive_requests 的值时,Nginx 会关闭这个连接,重新建立一个新的连接。这个参数可以防止单个连接占用过多的资源,避免出现连接饥饿的情况。如果你的业务请求量很大,可以适当增加这个值。

  • 单位:
  • 默认值: 100
  • 配置位置: http 块,upstream 块,proxy_http
  • 影响:
    • http 块中的 keepalive_requests 参数,影响 Nginx 作为服务器端,客户端与 Nginx 之间的 Keepalive 连接。
    • upstream 块中的 keepalive_requests 参数,影响 Nginx 作为客户端,与后端服务器之间的 Keepalive 连接。
    • proxy_http 块中的 keepalive_requests 参数,与 upstream 块中的 keepalive_requests 参数作用相同,主要用于代理 HTTP 请求。

3. keepalive_disable (http)

这个参数用于禁用 Keepalive 功能。当设置为 msie 时,禁用针对 Internet Explorer 浏览器的 Keepalive 功能;当设置为 any 时,禁用所有客户端的 Keepalive 功能。一般情况下,不建议禁用 Keepalive 功能,除非遇到特殊情况,比如某些客户端不支持 Keepalive 或者出现 Keepalive 相关的兼容性问题。

  • 配置位置: http

4. proxy_http_version (proxy_http)

这个参数定义了 Nginx 与后端服务器之间使用的 HTTP 协议版本。如果设置为 1.1,Nginx 会启用 Keepalive 功能。如果设置为 1.0,则禁用 Keepalive 功能。因此,如果你希望 Nginx 与后端服务器之间使用 Keepalive,那么务必将这个参数设置为 1.1

  • 默认值: 1.0
  • 配置位置: proxy_http
  • 影响: 影响 Nginx 作为客户端,与后端服务器之间的 Keepalive 连接。

5. proxy_keepalive_timeout (proxy_http)

这个参数定义了 Nginx 与后端服务器之间 Keepalive 连接的超时时间,作用类似于 keepalive_timeout,但仅针对代理 HTTP 请求。需要与 proxy_http_version 配合使用。

  • 单位:
  • 默认值: keepalive_timeout 的值
  • 配置位置: proxy_http
  • 影响: 影响 Nginx 作为客户端,与后端服务器之间的 Keepalive 连接。

6. proxy_max_conns (upstream)

这个参数定义了每个后端服务器的最大连接数。当 Nginx 与后端服务器之间的连接数达到 proxy_max_conns 的值时,Nginx 会拒绝新的连接请求,直到有连接被释放。这个参数可以限制 Nginx 与后端服务器之间的连接数,避免后端服务器过载。这个参数需要在 upstream 块中配置。

  • 单位:
  • 默认值: 0(表示无限制)
  • 配置位置: upstream
  • 影响: 影响 Nginx 作为客户端,与后端服务器之间的连接数量。

最佳实践:如何配置 Keepalive 参数

下面,我将结合一些实际的场景,分享一些配置 Keepalive 参数的最佳实践,帮助你更好地优化 Nginx 的性能。

1. keepalive_timeout 的配置

keepalive_timeout 的配置需要根据业务的实际情况进行调整。一般来说,可以遵循以下原则:

  • 短连接频繁的场景: 可以适当减小 keepalive_timeout 的值,例如 15s 或 30s,避免长时间占用连接。
  • 长连接为主的场景: 可以适当增加 keepalive_timeout 的值,例如 60s 或 75s,减少连接的建立和关闭次数。
  • 高并发、大量短连接的场景: 建议在 Nginx 和后端服务器之间都启用 Keepalive,并适当减小 keepalive_timeout 的值,同时增加 keepalive_requests 的值。

示例配置:

http {
    keepalive_timeout 65;
    ...
}

upstream backend {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
    keepalive_timeout 65s;
    keepalive_requests 1000;
    proxy_max_conns 256;
}

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection ""; # 重要!
    }
}

说明:

  • keepalive_timeout 65;: 设置 Nginx 与客户端之间的 Keepalive 超时时间为 65 秒。
  • keepalive_timeout 65s;: 设置 Nginx 与后端服务器之间的 Keepalive 超时时间为 65 秒。
  • keepalive_requests 1000;: 设置 Nginx 与后端服务器之间,每个 Keepalive 连接可以处理的最大请求数为 1000。
  • proxy_max_conns 256;: 设置 Nginx 与每个后端服务器的最大连接数为 256。
  • proxy_http_version 1.1;: 启用 Nginx 与后端服务器之间的 Keepalive 功能。
  • proxy_set_header Connection "";: 这个配置非常重要,用于告诉后端服务器 Nginx 已经处理了 Keepalive,避免后端服务器在 Nginx 已经关闭连接的情况下仍然尝试发送数据。这个配置的详细解释见下文。

2. keepalive_requests 的配置

keepalive_requests 的配置需要根据业务的请求量和资源消耗情况进行调整。如果你的业务请求量很大,或者单个请求的处理时间较长,那么可以适当增加 keepalive_requests 的值,减少连接的建立和关闭次数。需要注意的是,过大的 keepalive_requests 值可能会导致单个连接占用过多的资源,因此需要根据实际情况进行权衡。

示例配置:

http {
    keepalive_requests 5000;
    ...
}

upstream backend {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
    keepalive_requests 5000;
}

说明:

  • keepalive_requests 5000;: 设置 Nginx 与客户端之间,每个 Keepalive 连接可以处理的最大请求数为 5000。
  • keepalive_requests 5000;: 设置 Nginx 与后端服务器之间,每个 Keepalive 连接可以处理的最大请求数为 5000。

3. proxy_http_versionproxy_set_header Connection 的配置

这两个配置是 Nginx 作为反向代理时,实现 Keepalive 的关键。proxy_http_version 必须设置为 1.1 才能启用 Keepalive。proxy_set_header Connection ""; 的作用是告诉后端服务器,Nginx 已经处理了 Keepalive,避免后端服务器认为 Nginx 已经关闭了连接,仍然尝试发送数据。如果缺少这个配置,可能会导致连接错误或性能下降。

示例配置:

server {
    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

4. proxy_max_conns 的配置

proxy_max_conns 的配置用于限制 Nginx 与后端服务器之间的连接数,避免后端服务器过载。这个参数需要在 upstream 块中配置。可以根据后端服务器的负载能力和并发连接数进行调整。一般来说,可以根据后端服务器的 CPU、内存等资源的使用情况,以及响应时间来确定这个值。如果后端服务器的负载较高,可以适当减小 proxy_max_conns 的值;如果后端服务器的负载较低,可以适当增加 proxy_max_conns 的值。

示例配置:

upstream backend {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
    proxy_max_conns 256;
}

说明:

  • proxy_max_conns 256;: 设置 Nginx 与每个后端服务器的最大连接数为 256。

Keepalive 优化中的常见问题与解决方案

在配置 Keepalive 参数的过程中,可能会遇到一些问题,下面我将分享一些常见的问题和解决方案:

1. Keepalive 连接超时

Keepalive 连接超时是指客户端或 Nginx 在 keepalive_timeout 时间内没有新的请求或响应,导致连接被关闭。这可能是由于以下原因造成的:

  • keepalive_timeout 设置过短: 如果 keepalive_timeout 设置过短,客户端或 Nginx 可能会在请求或响应完成之前就关闭连接。
  • 网络延迟: 网络延迟可能导致请求或响应的传输时间超过 keepalive_timeout,从而导致连接超时。
  • 后端服务器处理时间过长: 后端服务器处理请求的时间过长,导致响应时间超过 keepalive_timeout,从而导致连接超时。

解决方案:

  • 调整 keepalive_timeout 根据业务的实际情况,适当增加 keepalive_timeout 的值。
  • 优化网络: 优化网络环境,减少网络延迟。
  • 优化后端服务器: 优化后端服务器的性能,减少请求处理时间。

2. 连接数过多

在高并发场景下,如果 Keepalive 参数配置不当,可能会导致连接数过多,从而消耗服务器的资源。这可能是由于以下原因造成的:

  • keepalive_timeout 设置过长: 如果 keepalive_timeout 设置过长,那么连接的存活时间就会变长,从而导致连接数过多。
  • keepalive_requests 设置过大: 如果 keepalive_requests 设置过大,那么单个连接可以处理的请求数就会变多,从而导致连接的存活时间变长,连接数也可能变多。
  • 后端服务器连接数限制不足: 如果后端服务器的连接数限制不足,那么 Nginx 可能会与后端服务器建立过多的连接,导致后端服务器过载。

解决方案:

  • 调整 keepalive_timeout 根据业务的实际情况,适当减小 keepalive_timeout 的值。
  • 调整 keepalive_requests 根据业务的请求量和资源消耗情况,适当调整 keepalive_requests 的值。
  • 配置 proxy_max_connsupstream 块中配置 proxy_max_conns,限制 Nginx 与后端服务器的连接数。

3. Keepalive 无法生效

Keepalive 无法生效是指 Nginx 无法复用已有的连接,导致每次请求都需要重新建立连接。这可能是由于以下原因造成的:

  • 未启用 Keepalive: 没有在 Nginx 中启用 Keepalive 功能,比如 proxy_http_version 未设置为 1.1
  • 客户端不支持 Keepalive: 某些客户端不支持 Keepalive 功能。
  • 连接被中间设备中断: 中间的防火墙、负载均衡等设备可能会中断 Keepalive 连接。

解决方案:

  • 检查 Nginx 配置: 确保 Nginx 中已经启用了 Keepalive 功能,例如将 proxy_http_version 设置为 1.1
  • 检查客户端: 确认客户端是否支持 Keepalive 功能。
  • 检查中间设备: 检查中间的防火墙、负载均衡等设备是否会中断 Keepalive 连接,并进行相应的配置调整。

总结

Nginx 的 Keepalive 功能在高并发场景下至关重要。通过合理配置 keepalive_timeoutkeepalive_requestsproxy_http_versionproxy_max_conns 等参数,可以显著提升 Nginx 的性能,降低服务器的资源消耗,提高用户体验。在实际应用中,需要根据业务的实际情况,结合监控和测试,不断优化 Keepalive 参数的配置,以达到最佳的性能表现。希望这篇文章能帮助你更好地理解和应用 Nginx Keepalive 优化。加油!

附录:Nginx 配置示例

为了方便大家理解,这里提供一个完整的 Nginx 配置示例,供大家参考:

# 全局配置
events {
    worker_connections  1024;  # 每个 worker 进程的最大连接数,根据实际情况调整
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush      on;  # 开启 TCP_CORK 选项,减少网络包的发送次数
    tcp_nodelay     on;  # 开启 TCP_NODELAY 选项,立即发送数据

    keepalive_timeout  65;  # Nginx 与客户端之间的 Keepalive 超时时间
    keepalive_requests 1000;  # Nginx 与客户端之间的 Keepalive 连接的最大请求数

    gzip on;  # 开启 gzip 压缩,减少传输数据量
    gzip_min_length 1k;  # 启用 gzip 的最小响应长度
    gzip_buffers 4 16k;  # 设置 gzip 压缩缓冲区大小
    gzip_http_version 1.1;  # 启用 gzip 压缩的 HTTP 版本
    gzip_comp_level 6;  # 设置 gzip 压缩级别,1-9,数值越高压缩比越高,但 CPU 消耗也越高
    gzip_types text/plain application/javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;  # 发送 Vary: Accept-Encoding 头部,让缓存服务器缓存不同压缩方式的资源

    # 后端服务器配置
    upstream backend {
        server 192.168.1.100:8080;
        server 192.168.1.101:8080;
        keepalive_timeout 65s;  # Nginx 与后端服务器之间的 Keepalive 超时时间
        keepalive_requests 1000; # Nginx 与后端服务器之间的 Keepalive 连接的最大请求数
        proxy_max_conns 256; # Nginx 与后端服务器的最大连接数
    }

    # Server 配置
    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";  # 告诉后端服务器 Nginx 已经处理了 Keepalive
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置说明:

  • events 块: 配置 Nginx 的事件模型和连接数。
    • worker_connections 1024;: 设置每个 worker 进程的最大连接数,根据实际情况调整。这个值需要根据服务器的资源情况进行调整,通常情况下,可以设置为 1024 或 2048,甚至更高。
  • http 块: 全局 HTTP 配置。
    • keepalive_timeout 65;: 设置 Nginx 与客户端之间的 Keepalive 超时时间为 65 秒。
    • keepalive_requests 1000;: 设置 Nginx 与客户端之间,每个 Keepalive 连接可以处理的最大请求数为 1000。
    • gzip on;: 开启 gzip 压缩,减少传输数据量。
    • upstream backend { ... }: 定义后端服务器组。
      • server 192.168.1.100:8080;: 定义后端服务器地址。
      • keepalive_timeout 65s;: Nginx 与后端服务器之间的 Keepalive 超时时间。
      • keepalive_requests 1000;: Nginx 与后端服务器之间,每个 Keepalive 连接可以处理的最大请求数。
      • proxy_max_conns 256;: Nginx 与后端服务器的最大连接数。
    • server { ... }: 定义一个虚拟主机。
      • listen 80;: 监听 80 端口。
      • location / { ... }: 定义根路径的代理配置。
        • proxy_pass http://backend;: 将请求代理到后端服务器组。
        • proxy_http_version 1.1;: 使用 HTTP/1.1 协议,启用 Keepalive。
        • proxy_set_header Connection "";: 告诉后端服务器 Nginx 已经处理了 Keepalive。
        • proxy_set_header Host $host;: 设置 Host 头部。
        • proxy_set_header X-Real-IP $remote_addr;: 设置客户端的真实 IP 地址。
        • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;: 设置 X-Forwarded-For 头部。
  • tcp_nopush on;tcp_nodelay on;: 开启 TCP_CORK 和 TCP_NODELAY 选项,可以提高性能,但可能需要根据实际情况进行调整。tcp_nopush 选项用于减少网络包的发送次数,将多个小包合并成一个大包发送;tcp_nodelay 选项用于立即发送数据,避免等待缓冲区满后再发送。

重要提示:

  • 上述配置只是一个示例,你需要根据自己的实际业务场景和服务器环境进行调整。
  • 在修改 Nginx 配置后,需要重新加载或重启 Nginx 服务才能使配置生效。
  • 建议在生产环境配置之前,先在测试环境进行测试,确保配置的正确性。使用 nginx -t 命令来检查配置文件的语法是否正确。

希望这个配置示例能帮助你更好地理解 Nginx 的配置,并应用于实际的生产环境中。

结语

Keepalive 优化是 Nginx 性能优化的重要组成部分。通过合理配置 Keepalive 参数,可以有效提升服务器的吞吐量和响应速度,提高用户体验。希望这篇文章能帮助你更好地理解 Nginx Keepalive 的工作原理和配置方法。如果你有任何问题或者想法,欢迎在评论区留言,我们一起交流讨论。祝你工作顺利,编程愉快!

老码农 NginxKeepalive性能优化高并发

评论点评

打赏赞助
sponsor

感谢您的支持让我们更好的前行

分享

QRcode

https://www.webkt.com/article/8511