You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx反向代理配置普通TCP Socket连接方法及400错误排查

核心结论

Nginx原生支持非Web类普通TCP Socket反向代理,你当前遇到400错误的核心原因是配置逻辑用错了层级。

问题根因

你现有配置全部写在http {}块内,这套逻辑是为HTTP、HTTPS、WebSocket这类七层HTTP协议流量设计的,要求收到的请求必须符合HTTP协议格式(包含请求行、请求头等固定结构)。
你的Go客户端和服务端是基于原生TCP通信,传输的是自定义格式的字节流,完全没有HTTP协议封装,Nginx按HTTP规则解析流量时识别不到合法请求,自然持续返回400 Bad Request。

可行配置方案

Nginx从1.9.0版本开始内置ngx_stream_core_module四层代理模块,专门处理TCP/UDP流量透传,不需要修改任何Go业务代码,只需调整Nginx配置即可。
注意:stream {}配置块和http {}块是同级关系,不能嵌套在http块内部。

  1. 首先删除原有http块中监听8888端口的server配置,避免端口冲突。
  2. 在nginx.conf的最外层(与http块平级)添加如下stream配置:
stream {
    # 定义后端TCP服务上游地址
    upstream tcp_stream_backend {
        server 127.0.0.2:9988;
        # 适配服务端流式传输场景,调整长连接超时
        proxy_connect_timeout 10s;
        proxy_timeout 7200s; # 按需调整,需大于单条流的最长持续时间,避免连接被主动断开
        proxy_buffer_size 16k;
    }

    server {
        listen 8888;
        proxy_pass tcp_stream_backend;
        proxy_protocol off;
    }
}
  1. 原有/v1/config的HTTP接口无法和TCP代理共用8888端口——四层代理只能做IP端口维度的流量转发,没有URL路径路由能力(路径是HTTP七层协议才有的字段,原生TCP流量不包含这类信息),你需要给这个HTTP接口分配单独的监听端口,比如在http块内新增监听8080端口的server承载该接口。
注意事项
  • 部署前先执行nginx -V检查输出的编译参数中是否包含--with-stream,如果没有该参数说明当前Nginx未编译stream模块,需要替换为带stream模块的版本,官方源安装的Nginx默认已包含该模块。
  • 配置修改完成后先执行nginx -t校验语法和端口占用情况,确认无误后执行nginx -s reload重载配置生效。
  • 不要在stream块内使用proxy_set_header、proxy_http_version这类HTTP协议专属配置参数,这类参数在四层代理上下文下不生效,还会触发配置报错。
  • 该方案是字节流完全透传,和客户端直连后端服务的行为完全一致,你现有的服务端流式推送逻辑不需要做任何改造即可正常运行。

这类配置是工业界非常成熟的用法,大量开发者用Nginx stream模块代理Redis、MySQL、自定义RPC、私有TCP协议服务,不存在能力支持问题。

内容的提问来源于stack exchange,提问作者ELIPHOSIF IDHAI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:36:15