生产部署:编译、Nginx 反代与进程托管
Go 应用编译后是单一可执行文件,部署本身不复杂;生产上真正要设计的是:产物怎么编、谁来收流量、进程挂了谁拉起。GoFrame 官方文档把部署分为独立部署、代理部署、容器部署三类,本章讲前两类(容器部署见下一章)。
编译产物
官方容器部署章节给出静态编译标准姿势;对服务端目标平台交叉编译时同样适用:
# 编译 Linux amd64 静态可执行文件,无运行依赖、便于分发
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go
# 或使用官方 CLI 提供的编译命令(默认按目标环境编译,细节见 gf build 帮助)
gf build main.go
编译产物是单文件,只需连同配置文件、静态资源目录一起发布到服务器。注意 gf build 与手写 go build 二选一,交叉编译参数以官方文档为准。
Nginx 反向代理
官方推荐用 Nginx 作为前端接入层:静态文件交给 Nginx,动态请求转发给 Go 应用。要点是把真实来源头透传过去,供应用记录日志与鉴权:
server {
listen 80;
server_name api.example.com;
location ~ .*\.(gif|jpg|jpeg|png|js|css)$ {
root /var/www/app/public; # 静态资源目录由 Nginx 直接处理
expires 1d;
}
location / {
proxy_pass http://127.0.0.1:8199;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 应用监听内网端口(如
127.0.0.1:8199),不要直接暴露公网。 - 若同时要 HTTPS,在 Nginx 层终结 TLS(证书配置于 Nginx)即可,应用无需 HTTPS。
- 静态/动态拆分可按文件后缀,也可按目录(如
location ^~ /public),官方文档两种写法都有。 - WebSocket 场景需要额外配置
Upgrade相关头,nginx 官方代理示例可参考(应用侧见 WebSocket 章节)。
进程托管:supervisor 与 systemd
官方独立部署章节用 supervisor 做进程守护:异常退出自动重启、开机自启、日志落盘。最小配置:
[program:gf-app]
user = root
directory = /var/www ; 工作目录必须配置,且放在 command 之前
command = /var/www/main ; 使用绝对路径
stdout_logfile = /var/log/gf-app-stdout.log
stderr_logfile = /var/log/gf-app-stderr.log
autostart = true
autorestart = true
sudo service supervisor start # 启动 supervisor
# 配置文件放到 /etc/supervisor/conf.d/gf-app.conf
sudo supervisorctl reload # 配置变更后 reload
sudo supervisorctl status # 查看托管进程状态
发行版标配的 systemd 也可(官方文档同样给出示例):ExecStart=/data/server/gfapp、Restart=always、RestartSec=5,用 systemctl enable gfapp 加入开机自启。简单场景临时用 nohup ./main & 也能跑,但不具备自动拉起能力。
注意点
- 配置文件与可执行文件分离部署:应用通过默认配置路径读取
config.yaml,发布时注意工作目录(supervisor 的directory、systemd 的WorkingDirectory)必须与应用预期一致。 - 日志:应用日志落文件并轮转,或直接对接日志采集;Nginx access/error 日志单独配置。
- 时区:容器/服务器统一时区,避免定时任务与时间字段偏差(见 gtime 章节)。
- 发布流程建议:编译 → 备份旧版本 → 覆盖 → 平滑重启(见优雅退出章节),把中断降到最低。
小结
生产部署三板斧:静态编译出单文件、Nginx 收流量并透传真实来源头、supervisor/systemd 保证进程活着。再叠加优雅退出与统一时区,一套 API 服务即可稳定上线。细节以官方文档 goframe.org 为准。