Gin应用部署核心是编译静态二进制并交由systemd托管:需在开发机用GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build编译,scp上传后chmod +x,再通过systemd service配置ExecStart、Restart=always等实现稳定运行;Nginx仅反向代理,须配置proxy_set_header及超时参数,并开放防火墙、调整SELinux策略确保连通。

直接部署 Gin 应用到 CentOS,核心不是“把 Gin 跑起来”,而是让 Go 编译出的二进制能稳定、可管理、可恢复地长期运行 —— Nginx 只负责反向代理,不托管 Go 进程。
怎么编译 Gin 二进制并传到 CentOS
开发机(如 macOS / Windows)上必须用 GOOS=linux GOARCH=amd64 go build 交叉编译,不能直接用本地构建产物。CentOS 7/8/9 默认是 x86_64 架构,别用错 GOARCH。
常见错误现象:上传后执行报 cannot execute binary file: Exec format error,基本就是编译环境架构不匹配。
实操建议:
- 在项目根目录执行:
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o myapp .(CGO_ENABLED=0避免动态链接依赖,提升可移植性) - 生成的
myapp是纯静态二进制,直接scp传到 CentOS 的目标路径,比如/opt/myginapp/ - 传完记得加执行权限:
chmod +x /opt/myginapp/myapp
为什么不能直接 ./myapp & 后台运行
这种做法看似简单,但进程会随终端断开而退出(SIGHUP),且无崩溃自拉起、无日志重定向、无法 systemctl 管理 —— 生产环境等同于裸奔。
正确做法是写 systemd service 文件,交由系统级进程管理器接管:
- 新建
/etc/systemd/system/myginapp.service - 内容至少包含:
ExecStart=/opt/myginapp/myapp、WorkingDirectory=/opt/myginapp、Restart=always、RestartSec=5 - 启用服务:
systemctl daemon-reload && systemctl enable myginapp && systemctl start myginapp
验证是否存活:systemctl status myginapp,看是否显示 active (running) 且 Main PID 正常。
Nginx 怎么反向代理 Gin HTTP 服务
Gin 默认监听 :8080(或你代码里写的端口),Nginx 不需要改 Gin,只负责把 80/443 的请求转过去。关键点不是“配 location”,而是避免代理超时和 header 丢失。
典型配置片段(放在 /etc/nginx/conf.d/myapp.conf):
upstream gin_backend {
server 127.0.0.1:8080;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://gin_backend;
proxy_set_header Host $host;
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_read_timeout 60;
proxy_send_timeout 60;
}
}
注意两个易踩坑点:
-
proxy_read_timeout必须设大些,否则 Gin 处理耗时接口(如文件上传、AI 推理)会被 Nginx 中断连接 - 如果 Gin 用了
gin.Recovery()中间件,但 Nginx 报 502,先检查systemctl status myginapp和journalctl -u myginapp -n 50,大概率是 Gin 进程根本没起来或端口被占
防火墙和 SELinux 怎么不影响访问
CentOS 7/8 默认启用 firewalld,80/443 端口默认不放行;SELinux 则可能拦截 Nginx 访问 127.0.0.1:8080(即使本地回环也会被拦)。
快速放行端口(以 80 为例):firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload
SELinux 最小化处理方式(不推荐关):setsebool -P httpd_can_network_connect 1,允许 Nginx 发起网络连接 —— 这比 setenforce 0 安全得多。
验证通路是否打通:在 CentOS 上执行 curl -v http://127.0.0.1:8080/health(假设 Gin 提供健康检查),再执行 curl -v http://127.0.0.1/,两次都通才算链路完整。
最常被忽略的是 Gin 应用本身没监听 0.0.0.0:8080,而是只绑了 127.0.0.1:8080 或 :8080(Go 默认行为是监听所有接口,但若代码显式写了 "127.0.0.1:8080" 就只能本地访问)。务必确认 r.Run(":8080") 或 r.Run("0.0.0.0:8080") —— 后者更明确。


















