go服务需监听0.0.0.0:8080确保nginx可达,proxy_pass末尾斜杠决定路径重写方式,必须配置proxy_set_header传递host、x-forwarded-for等头,且超时参数需nginx与go梯度对齐,静态资源应由nginx托管并严防路径穿越。

Go服务暴露端口后,Nginx反向代理配置写不对会直接502
Go程序默认绑定localhost:8080,但Nginx从外部访问时若没配对proxy_pass目标地址,或Go没监听0.0.0.0,就会报502 Bad Gateway。这不是Nginx问题,是网络可达性断在第一跳。
实操要点:
- Go启动时必须用
http.ListenAndServe("0.0.0.0:8080", handler),不能写"127.0.0.1:8080"——容器或远程Nginx根本连不上127.0.0.1 - Nginx配置里
proxy_pass末尾加不加/影响路径重写:proxy_pass http://127.0.0.1:8080/;会剥离前缀;proxy_pass http://127.0.0.1:8080;则原样透传 - 务必加
proxy_set_header Host $host;,否则Go里r.Host可能为空,依赖Host做路由的框架(如Gin的router.Host)会失效
Gin/Echo等框架里获取真实IP总拿不到,其实是Nginx没传X-Forwarded-For
Go代码里用r.RemoteAddr只能拿到Nginx本机IP(比如127.0.0.1:34212),用户真实IP被丢弃了。这不是框架bug,是Nginx默认不转发客户端地址头。
解决方式很简单,但漏一条就白配:
- 在Nginx
location块里加:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - Go中读取时别只看
r.Header.Get("X-Forwarded-For")——它可能是逗号分隔的链式IP(如"203.0.113.195, 198.51.100.10"),要取第一个非私有IP;可借助net.ParseIP()过滤10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 - 如果Nginx前面还有CDN或LB,需额外配
X-Real-IP或自定义头,且Go侧要约定优先级,比如先查X-Real-IP,再 fallback 到X-Forwarded-For首段
长连接和超时参数不匹配,请求卡住30秒才断
Go HTTP server默认ReadTimeout是0(不限时),但Nginx的proxy_read_timeout默认60秒。如果Go接口响应慢,而Nginx先超时,就会中断连接并返回504 Gateway Timeout——这时Go还在继续处理,造成资源浪费甚至并发堆积。
关键对齐点:
- Nginx侧:设
proxy_connect_timeout 5s;、proxy_send_timeout 30s;、proxy_read_timeout 30s;,避免过长等待 - Go侧:显式设置
http.Server的ReadTimeout、WriteTimeout、IdleTimeout,值略小于Nginx对应项(比如Nginx设30s,Go设25s),让Go主动断开更可控 - 特别注意
IdleTimeout:它控制keep-alive空闲时间,若Nginx的keepalive_timeout比Go的IdleTimeout长,连接会被Nginx单方面关闭,Go日志里出现write: broken pipe
静态文件交给Nginx托管,但Go的FileServer路径没关严
把/static/这类路径甩给Nginx处理能省下Go的goroutine和磁盘I/O,但如果Go里还留着http.FileServer且没限制目录,反而会因路径穿越(如../../../etc/passwd)导致敏感文件泄露。
安全做法:
- Nginx配置静态路径时用
alias而非root,避免路径拼接风险:location /static/ { alias /var/www/static/; } - Go中若仍需内置FileServer(如开发环境),必须用
http.Dir配合http.StripPrefix,且禁止向上遍历:fs := http.FileServer(http.Dir("/app/static")),不要用os.Chdir或相对路径 - 上线前检查Go路由是否还注册了
"/static/"——Nginx已接管,Go再处理就是冗余+潜在漏洞
最常被忽略的是Nginx与Go之间超时参数的梯度差,以及X-Forwarded-For里私有IP未过滤导致的真实IP误判。这两个点不细调,监控看着正常,线上一压测就出幻觉。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











