生产环境必须用nginx反向代理绑定域名,gin需监听127.0.0.1:8888而非0.0.0.0:8080;nginx配置须含server_name、proxy_pass末尾加/、proxy_set_header host和x-real-ip,并由nginx终止https。

直接绑定域名前必须关掉 Gin 的默认调试端口暴露
Gin 默认调用 r.Run() 会监听 0.0.0.0:8080,这个地址不能被公网域名直接解析——它既没走反向代理,也不符合 HTTPS 要求。强行用 DNS 指向该 IP:Port 会导致浏览器拒绝连接(尤其现代浏览器对非 HTTPS 的 8080 端口有明确拦截)。生产环境必须通过 Nginx 或 Caddy 做反向代理,让域名流量先落到 Web 服务器,再转发给 Gin 进程。
Nginx 反向代理配置的关键三步
以域名 api.example.com 绑定到 Gin 服务为例(假设 Gin 监听在 127.0.0.1:8888):
- 确保 Gin 启动时不暴露公网:改用
r.Run("127.0.0.1:8888"),禁止监听 0.0.0.0 - 在 Nginx 配置中添加 server 块,
server_name api.example.com必须与你申请的 SSL 证书域名完全一致 - proxy_pass 地址末尾要带
/,否则路径重写会出错:proxy_pass http://127.0.0.1:8888/;
常见遗漏点:proxy_set_header Host $host; 和 proxy_set_header X-Real-IP $remote_addr; 必须加上,否则 Gin 的 c.Request.Host 会变成 127.0.0.1:8888,影响 JWT 签发、回调地址生成等逻辑。
HTTPS 强制跳转和证书自动续期不能靠 Gin 自己搞定
Gin 不处理 TLS 握手,所有 HTTPS 流量必须由 Nginx 终止。这意味着:
- Let’s Encrypt 证书要用
certbot申请并配置到 Nginx,不是 Gin 应用里填路径 - HTTP → HTTPS 跳转规则写在 Nginx 的 80 server 块里:
return 301 https://$server_name$request_uri; - 如果 Gin 接口里返回了硬编码的
http://地址(比如文件上传回调 URL),必须改成动态拼接c.Request.Header.Get("X-Forwarded-Proto")判断协议
宝塔面板用户注意伪静态不是万能的
宝塔的「伪静态」配置只对 Nginx 的 location / 生效,它不能替代完整的反向代理配置。如果你在宝塔里只粘贴了 Gin 的路由 rewrite 规则(比如 Laravel 风格的),Gin 依然收不到请求。正确做法是:
- 在宝塔【网站】→【设置】→【反向代理】里新建一条,目标 URL 填
http://127.0.0.1:8888 - 关闭「启用反向代理」之外的其他选项(如「缓存」、「SSL」——SSL 必须在站点设置里单独开启)
- 确认宝塔自动生成的 Nginx 配置里包含
proxy_http_version 1.1;和proxy_set_header Upgrade $http_upgrade;,否则 WebSocket 连接会失败
真正容易被忽略的是:Gin 日志里显示的客户端 IP 总是 127.0.0.1,除非你在 Nginx 里加了 proxy_set_header X-Real-IP $remote_addr; 并在 Gin 中用 c.ClientIP() 替代 c.RemoteIP()。











