Nginx 在推理链路的位置
Nginx 用作大模型服务的入口网关:对外终止 TLS、做鉴权与限流,再把请求转发给本机或内网的推理引擎。它本身不理解 token,难点全在连接行为上——流式回答是长时间保持不关闭的响应,默认的缓冲与短超时会把它截断。所以配置的重点是 upstream keepalive、关闭代理缓冲、放大读写超时,以及为每个请求打上可追踪的请求 ID。
基本信息
| 适用平台 | Linux + Nginx 1.20 及以上 / OpenResty |
|---|---|
| 配置文件 | /etc/nginx/conf.d/llm.conf 或 sites-available 下的站点文件 |
| 校验与生效 | nginx -t 校验通过后 systemctl reload nginx |
| 权限要求 | root 或具备配置目录写权限的运维账号 |
| 依赖模块 | ngx_http_proxy_module、ngx_http_limit_req_module |
典型使用场景
- 给自建推理引擎加一层公网入口:统一做 TLS、域名与访问日志
- 多引擎负载均衡:upstream 里放多个实例,配合健康检查摘除故障节点
- 限流与配额:按来源或 API Key 限制速率,保护引擎不被突发流量打满
- 流式对话转发:让 SSE 逐字返回,而不是等整段生成完才吐给客户端
- 灰度发布:用独立 server 块或 split_clients 把少量流量导向新版本引擎
配置骨架
配置骨架
upstream llm {
server 127.0.0.1:8000; # 引擎监听地址,多实例就多写几行
keepalive 32; # 与引擎保持长连接,省掉反复握手
}
limit_req_zone $binary_remote_addr zone=llm:10m rate=10r/s; # 限流区,按来源 IP
server {
listen 443 ssl;
server_name <域名>;
ssl_certificate /etc/nginx/ssl/<证书>.pem;
ssl_certificate_key /etc/nginx/ssl/<私钥>.key;
location /v1/ {
limit_req zone=llm burst=20 nodelay; # 允许 20 个突发,不排队
proxy_pass http://llm;
proxy_http_version 1.1; # keepalive 需要 1.1
proxy_buffering off; # 关键:流式必须关闭缓冲
proxy_read_timeout 600s; # 大于最长生成时长
proxy_set_header Connection ""; # 清空才能复用长连接
proxy_set_header X-Request-ID $request_id;
add_header X-Request-ID $request_id always; # 响应也带回去,便于对账
}
}关键指令逐项读法
| 指令 | 作用 | 配错的后果 |
|---|---|---|
| proxy_buffering off | 响应边收边转发 | 开着则流式变成一次性返回,用户长时间无输出后整段刷出 |
| proxy_read_timeout | 等待上游响应的上限 | 小于生成时长时连接被主动断开,表现为回答中途截断 |
| proxy_http_version 1.1 | 启用 HTTP/1.1 上游 | 停留在 1.0 时 keepalive 不生效,高并发下短连接耗尽端口 |
| limit_req / burst | 限制单位时间请求数 | 阈值低于真实峰值会误伤正常业务,返回 503 |
| X-Request-ID | 为请求打唯一标识 | 缺失时日志与客户端报告对不上,排障只能靠时间猜 |
改完按固定顺序上线:先 nginx -t 校验语法,再 reload(而不是 restart,避免中断已有连接),最后用 curl -N 请求一次,确认响应是逐块到达而不是一次性返回。
Nginx 只是链路中的一环:CDN、企业代理、负载均衡各自的空闲超时都要大于生成的静默间隔,否则超时最短的那一层决定断流时间点。