跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / BashNode.jsjava

Nginx Keepalive 配置详解

Nginx Keepalive 配置涉及客户端与后端上游连接优化。通过设置 keepalive_timeout 和 keepalive_requests 控制客户端空闲超时与请求数。Upstream 模块配合 proxy_http_version 1.1 实现反向代理长连接复用。需根据后端支持情况及系统资源合理调整参数,避免文件描述符耗尽或会话失效。排查时可结合 curl 响应头与 nginx_status 监控连接状态。

板砖工程师发布于 2026/2/22更新于 2026/7/2450 浏览
Nginx Keepalive 配置详解

Nginx Keepalive 配置详解

什么是 Keepalive?

在 HTTP 协议中,keepalive(长连接)允许客户端和服务器在同一个 TCP 连接上进行多次请求和响应,避免频繁建立和断开连接,提高性能。

在 Nginx 里,keepalive 通常分为两类:

  1. 客户端 keepalive(即 HTTP keep-alive)
  2. 后端 upstream keepalive(nginx 作为反向代理,跟后端服务器之间的长连接)

一、客户端 Keepalive 配置

这是指客户端(浏览器/请求工具)与 Nginx 之间的长连接。

相关配置参数
http {
    keepalive_timeout 75s 75s;
    keepalive_requests 100;
    ...
}
参数说明
  • keepalive_timeout
    设置客户端空闲连接的超时时间(单位秒,默认为 75s)。
    • 第一个参数是超时时间;
    • 第二个参数可选,指定 Keep-Alive: timeout=<N> 响应头的值(设置给客户端的建议时间)。
    • 例:keepalive_timeout 60s 60s;
  • keepalive_requests
    控制每个长连接上允许的最大请求次数。到达这个数量后,连接会关闭。默认是 100。
    • 例:keepalive_requests 100;

二、Upstream Keepalive 配置

如果 Nginx 作为反向代理,需要与后端服务器(如 Tomcat、Node、Go 服务)保持连接,减少连接建立/销毁开销。

相关配置参数
upstream backend {
    server 127.0.0.1:8080;
    # 指定最多保留多少个与每个后端服务器的空闲连接
    keepalive 32;
}
参数说明
  • keepalive
    指定与每个后端服务器保持的最大空闲长连接数。超出该数会关闭连接。
    • 例:keepalive 16;

proxy_http_version
如果要使用 HTTP/1.1 的长连接,需要设置:

proxy_http_version 1.1;
proxy_set_header Connection "";

三、完整示例

http {
    keepalive_timeout 60s 60s;
    keepalive_requests 100;
    upstream backend {
        server 127.0.0.1:8080;
        keepalive 16;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
}

四、常见问题

  1. keepalive 不生效?
    • 检查浏览器或客户端是否支持 keep-alive;
  • 后端服务器是否支持长连接;
  • upstream keepalive 的坑
    • 配置 keepalive 后,Nginx 会向后端重用连接,如果后端不支持可能出错;
    • 某些场景下可能会导致 sticky session 失效。
  • 过大的 keepalive_requests 或 keepalive 数值可能带来内存压力。

  • 五、性能建议

    • 合理设置 keepalive_timeout 和 keepalive_requests;
    • upstream keepalive 只在后端支持长连接的情况下开启;
    • 评估并调整 keepalive 连接数,避免资源浪费。

    六、进一步参数说明和进阶用法

    1. keepalive_timeout 的取值建议
    • 取值过短:可能会导致频繁断开连接,无法充分利用持久连接的性能优势。
    • 取值过长:如果客户端较多而 keepalive_timeout 设置过长,Nginx 会为许多空闲连接保留资源,可能造成资源耗尽(比如文件描述符数 fd)。
    • 常见推荐值:一般可设置为 30~120 秒之间。对静态小站点可以调大一点,连接压力大的网站要适当调小。
    2. keepalive_requests 的取值建议
    • 默认值:100
    • 过小:连发 & 断开,性能和吞吐量下降
    • 过大:实际作用有限,但可能积压慢连接
    • 常用:100~1000,根据业务负载实验调优。
    3. upstream keepalive 的更多参数(高阶玩法)

    Nginx 的 upstream keepalive 只是指定空闲连接池的大小。注意以下高阶点:

    • 每 worker 进程有自己的 keepalive 空闲池。比如 keepalive 16,4 个 worker,则总共会有最多 64 个到后端的空闲连接。
    • 若 upstream 多 server,则每个 server 有自己的空闲池;如 upstream 加三台 server,keepalive 16,则每台都有独立的 16 条连接池。

    示例:

    upstream backend {
        server 10.0.0.1:8000;
        server 10.0.0.2:8000;
        keepalive 32;
        # 每台后端各 32 个连接
    }
    
    4. 代理其他协议的 keepalive

    对于 stream 模块(比如 tcp/udp 代理),也支持 keepalive,不过配置方式略有不同。

    stream {
        server {
            listen 3306;
            proxy_pass mysql_backend;
            proxy_connect_timeout 1s;
            proxy_timeout 10m;
        }
        upstream mysql_backend {
            server 192.168.0.10:3306;
            server 192.168.0.11:3306;
            # stream 模块下并无 keepalive 配置,核心还是连接超时
        }
    }
    

    stream keepalive 仅通过超时控制连接维持时间。


    七、问题排查方法

    1. 查看响应头确认连接状态
      • 使用 curl -v,请求 Nginx,看 Do you get Connection: keep-alive in response header?
    2. 查看到后端的连接复用情况
      • 然后 localhost/nginx_status 观察 Active connections 变化。
    3. 查看连接数与 fd 使用

    Linux 下可以使用以下命令

    netstat -antp | grep nginx
    lsof -p <nginx_worker_pid> | wc -l
    

    通过 Nginx 的 stub_status 模块可以查看活动连接数量:

    location /nginx_status {
        stub_status;
        allow 127.0.0.1;
        deny all;
    }
    

    示例:

    curl -I http://your.domain/
    

    结果中有

    Connection: keep-alive
    

    就 OK。


    八、常见错误和最佳实践

    错误 1:后端不支持 keepalive
    • 后端服务(如 Tomcat, PHP-FPM, Flask 等)若未开启 keepalive,会导致 Nginx 创建了连接,对端直接断开,产生 502 等错误。
    错误 2:keepalive 数值设置过大,导致 FD (文件描述符) 爆满
    • 特别是并发量大时,配置过高容易让 OS 打满连接,进而影响整个系统服务。
    最佳实践
    • 根据 worker_processes、系统 ulimit 和后端配置,测算合适的 keepalive 池大小
    • 对后端服务、Nginx 做压力测试,观察连接池是否命中,资源占用高低
    • 分时段(白天/夜晚)观察连接趋势,适当动态调整参数

    九、参考实用案例

    1. 高并发 API 服务配置
    http {
        keepalive_timeout 30 30;
        keepalive_requests 1000;
        upstream apiservers {
            server 10.0.1.2:9000;
            server 10.0.1.3:9000;
            keepalive 64;
        }
        server {
            ...
            location /v1/ {
                proxy_pass http://apiservers;
                proxy_http_version 1.1;
                proxy_set_header Connection "";
            }
        }
    }
    
    2. 低并发业务 Web 站
    http {
        keepalive_timeout 120 120;
        keepalive_requests 500;
        upstream backend {
            server 127.0.0.1:9000;
            keepalive 8;
        }
    }
    

    十、官方原文资料

    • Nginx 官方文档:http 核心模块
    • Nginx upstream keepalive 说明
    • Nginx 性能优化建议(英文)

    目录

    1. Nginx Keepalive 配置详解
    2. 什么是 Keepalive?
    3. 一、客户端 Keepalive 配置
    4. 相关配置参数
    5. 参数说明
    6. 二、Upstream Keepalive 配置
    7. 相关配置参数
    8. 参数说明
    9. 三、完整示例
    10. 四、常见问题
    11. 五、性能建议
    12. 六、进一步参数说明和进阶用法
    13. 1. keepalive_timeout 的取值建议
    14. 2. keepalive_requests 的取值建议
    15. 3. upstream keepalive 的更多参数(高阶玩法)
    16. 4. 代理其他协议的 keepalive
    17. 七、问题排查方法
    18. 八、常见错误和最佳实践
    19. 错误 1:后端不支持 keepalive
    20. 错误 2:keepalive 数值设置过大,导致 FD (文件描述符) 爆满
    21. 最佳实践
    22. 九、参考实用案例
    23. 1. 高并发 API 服务配置
    24. 2. 低并发业务 Web 站
    25. 十、官方原文资料
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • 基于 SpringBoot 和 EMQX 的物联网设备双向通讯方案
    • 从零搭建 AI 系统权限控制系统
    • MongoDB 数据备份与恢复实战指南
    • 并查集数据结构详解与实战应用
    • 宇树机器人 SDK2 开发指南:从环境搭建到 Demo 测试
    • 英伟达与 GitHub 免费获取大模型 API Key 实战指南
    • 常用正则表达式速查
    • 使用 cpolar 远程部署 Open-Lovable 实现网页克隆
    • Ubuntu 24.04 Server 系统安装及配置指南
    • C++ STL List 容器使用指南及底层模拟实现
    • SpringBoot + Docker 实现微服务容器多节点负载均衡
    • 数据结构核心:KMP 算法、Trie 树与并查集详解
    • 前端多版本发布零 404 部署方案详解
    • Stable Diffusion 风格测试实操笔记
    • 异步编程实战:构建高性能 Python 网络应用
    • Slack 机器人集成:基于 InstructPix2Pix 的快速修图协作方案
    • Stable Diffusion WebUI 云端部署实战指南
    • Elasticsearch 核心概念、Kibana 测试与 C++ 客户端封装
    • WinSCP 下载安装与服务器连接配置指南
    • Llama-3.2-3B 代码审查实战:基于 Java 面试题的评估体系

    相关免费在线工具

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online