502错误主因是Go后端未监听0.0.0.0:8080或SELinux/防火墙拦截,需改router.Run("0.0.0.0:8080")、确认ss -tuln输出*:8080,并配置proxy_pass http://127.0.0.1:8080/及必要header。

直接跑 go run main.go 能访问,但一断开 SSH 就挂 —— 这不是项目问题,是进程没守护;Nginx 反代后页面能打开,但 /api 接口 502 —— 大概率是 Go 后端没监听 127.0.0.1:8080 或防火墙/SELinux 拦了;前端静态资源 404,location / 配得再对也没用 —— 根本原因是 dist 目录路径写错了,Nginx 找不到文件。
确认 Go 后端监听地址和端口
Gin 默认只监听 localhost:8080,这个地址外部不可达,Nginx 从本机反代时也会失败。
- 检查
main.go中的启动代码:必须是router.Run(":8080")或router.Run("0.0.0.0:8080"),不能是"localhost:8080" - 运行后执行
ss -tuln | grep :8080,确认输出里有*:8080(表示监听所有接口),而不是127.0.0.1:8080 - 如果用了自定义配置,确保
app.ini或环境变量没覆盖掉监听地址
Nginx location 配置必须匹配前后端分离结构
Ginblog 这类前后端分离项目,前端是纯静态文件,API 是 Go 提供的动态接口,Nginx 必须明确区分处理逻辑,不能全扔给 try_files。
-
location /块负责前端首页和路由(SPA),必须配try_files $uri $uri/ /index.html; -
location /admin是另一个 SPA 子应用,同样需要try_files,且root路径要指向web/admin/dist,不是项目根目录 -
location /api必须用proxy_pass http://127.0.0.1:8080/(注意末尾斜杠),否则路径会多拼一层/api - 别漏掉
proxy_set_header Host $host;和proxy_set_header X-Real-IP $remote_addr;,否则 Gin 的c.ClientIP()会拿到127.0.0.1
用 systemd 守护 Go 进程,别依赖 nohup
nohup ./ginblog & 看似能后台运行,但进程退出后不会自动拉起,日志也不集中,故障排查困难。
- 新建
/etc/systemd/system/ginblog.service,内容包含:[Unit] Description=Ginblog Backend After=network.target <p>[Service] Type=simple User=root WorkingDirectory=/data/Ginblog ExecStart=/data/Ginblog/ginblog Restart=always RestartSec=5 StandardOutput=journal StandardError=journal</p><p>[Install] WantedBy=multi-user.target
- 执行
systemctl daemon-reload && systemctl enable ginblog && systemctl start ginblog - 查状态用
systemctl status ginblog,看日志用journalctl -u ginblog -f - 别把
ExecStart写成sh -c "cd ... && ./ginblog"—— systemd 不支持 shell 语法,路径要用WorkingDirectory控制
MySQL 和静态文件路径权限常被忽略
部署后登录页打不开、上传失败、数据库连不上,八成是权限或路径写死了。
- MySQL 如果报
Access denied for user 'root'@'localhost',不是密码错,而是 root 默认只允许127.0.0.1连,需执行CREATE USER 'root'@'%' IDENTIFIED BY 'xxx'; GRANT ALL ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; - 前端 dist 目录路径在 Nginx 配置里写绝对路径,比如
/data/Ginblog/web/front/dist,但实际项目 clone 到了/root/Ginblog—— 路径不一致就 404 - Go 编译出的二进制默认读取当前目录下的
config/app.ini,如果用 systemd 启动,WorkingDirectory必须设对,否则配置加载失败,连数据库都连不上 - 上传文件到服务器后,用
ls -l确认dist目录属主是nginx或至少有读权限,CentOS 7 上 SELinux 默认阻止 Nginx 访问非标准路径,临时关可用setenforce 0,长期方案是chcon -R -t httpd_sys_content_t /data/Ginblog/web


















