上线必须用 go build 编译二进制,禁用 CGO 并指定 GOOS/GOARCH;Nginx 需透传 X-Real-IP 等四请求头,Gin 要启用 ForwardedByClientIP 并配置可信代理段,router.Run() 应监听 0.0.0.0 或 :端口而非 127.0.0.1。

上线必须用 go build 编译二进制文件,go run 只能本地开发,不能上生产环境。
为什么不能用 go run 上线
因为 go run 本质是边编译边运行,依赖完整的 Go 工具链(go 命令、GOROOT、GOPATH、模块缓存等),而线上服务器默认不装 Go 编译器——既增加攻击面,又违反最小权限原则。
- 服务器上没装 Go?
go run main.go直接报错command not found: go - 即使装了,每次启动都要重新编译,冷启动慢,且无法保证构建一致性
-
go run不支持交叉编译,没法控制目标平台的GOOS/GOARCH
go build 的正确参数组合
直接 go build -o myapp main.go 在大多数 Linux 服务器上能跑,但容易因 libc 版本或 CGO 依赖出问题。推荐显式禁用 CGO 并指定目标平台:
- 跨平台安全编译(推荐):
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp main.go - 如需 ARM64(比如云厂商新实例):
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o myapp main.go - 别打包
go.mod、go.sum或vendor/—— 二进制已静态链接全部逻辑,多传是冗余风险
Nginx 反向代理必须透传的关键请求头
Gin 默认不信任代理,如果 Nginx 做了反向代理但没传对应头,c.ClientIP() 会拿到 127.0.0.1,c.Request.URL.Scheme 也会错判为 http(哪怕你用 HTTPS 访问)。
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
立即学习“go语言免费学习笔记(深入)”;
- Nginx 配置里必须加这四行:
proxy_set_header X-Real-IP $remote_addr、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for、proxy_set_header X-Forwarded-Proto $scheme、proxy_set_header Host $host - Gin 代码中要显式设置信任:
router.ForwardedByClientIP = true,并配置可信代理段,例如:router.SetTrustedProxies([]string{"127.0.0.1", "10.0.0.0/8"}) - 漏掉
X-Forwarded-Proto会导致重定向跳http://,HTTPS 站点变成混合内容警告
router.Run() 必须显式指定监听地址
本地开发时写 router.Run() 会默认监听 0.0.0.0:8080,但线上环境常需绑定特定 IP 或非默认端口,且必须避免监听 127.0.0.1(Nginx 无法反向代理到 localhost)。
- 线上推荐写法:
router.Run(":8080")(监听所有 IPv4/IPv6 接口)或router.Run("0.0.0.0:8080") - 千万别写成
router.Run("127.0.0.1:8080"),否则 Nginxproxy_pass http://localhost:8080会失败(取决于系统 DNS 解析和 loopback 策略) - 端口若低于 1024(如
:80),需 root 权限或用setcap 'cap_net_bind_service=+ep' ./myapp授权
最易被忽略的是 Gin 的代理信任配置和 Nginx 头透传的严格对应——少一行头、少一个 IP 段,c.ClientIP() 和 c.Request.Secure 就不可信,日志、鉴权、重定向全会出错。

















