local-web-server配置API代理后不转发请求、直接返回504网关超时求助
反向代理不发起后端连接直接返回504的排查方向
优先排查本地应用层配置问题(完全匹配抓不到SYN握手包的现象)
- 环境变量注入校验:你的代理配置完全依赖
SERVER环境变量拼接代理目标,首先要排除环境变量没传对、格式非法的问题。很多时候测试代码里明明写了传值,实际容器启动后进程根本没读到,导致rewrite的to字段拼出来是不合法的相对路径——这种情况下local-web-server根本不会进入出站代理逻辑,只会把请求当作本地静态资源路由处理,找不到对应文件时就直接挂起请求返回504,全程不会产生任何对外的SYN网络包。
验证方式:进入运行中的web-server容器,执行cat /proc/1/environ查看web-server进程实际持有的所有环境变量,确认SERVER的值存在、且是带http:///https://协议头的完整可访问地址(比如不能是裸的host:port格式,否则会被判定为本地相对路径)。 - local-web-server版本兼容问题:你在Dockerfile里全局安装local-web-server时没有锁版本,在Node.js 10.16.0这种老环境下很可能拉到了不兼容的新版本。新版本的local-web-server已经拆分了「路径重写」和「反向代理」的功能,原来靠
rewrite字段直接配置代理到外部URL的写法,在新版里已经不会触发出站代理逻辑,只会做本地路径的重写,最终因为找不到本地文件触发504超时。
验证方式:在容器内执行ws --version查看实际运行的版本,临时把配置里的日志格式从tiny改成最详细的开发级日志格式,重启服务后再发/api请求,看控制台日志的路由决策记录,确认请求是被当作静态资源处理,还是真的进入了代理流程。
容易被忽略的基础校验项
- 别默认网络不通就一定抓不到SYN包:哪怕网络连通性有问题,只要web-server判定需要出站代理,就一定会先发起SYN握手。你现在完全看不到SYN包,说明web-server根本没走到出站那一步,但还是建议做基础连通性校验:进入web-server容器,用
nc -vz <SERVER_HOST> <SERVER_PORT>手动测试到模拟API的网络通路,避免因为Testcontainers网络模式配置错误、SERVER地址填成了容器内回环地址导致的判断偏差。 - 不要只靠宿主机上的Wireshark抓包下结论:很多容器网络的出站流量在宿主机的抓包点是观测不到的,应该在web-server容器内部部署轻量抓包工具,直接观察容器视角的流量情况,排除抓包位置错位导致的判断偏差。
快速定位的验证步骤
- 临时把配置文件里的
SERVER值硬编码成一个确定可访问的代理地址,重新构建镜像启动,再发API请求观察是否有出站流量,快速排除环境变量注入链路的问题 - 临时把原来靠rewrite实现的代理规则,改成local-web-server原生代理配置块的写法,验证是否是老的rewrite代理写法在当前运行版本里已经不生效
内容的提问来源于stack exchange,提问作者EthanCJ
相关产品推荐
相关产品推荐

