生产部署:编译、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/gfappRestart=alwaysRestartSec=5,用 systemctl enable gfapp 加入开机自启。简单场景临时用 nohup ./main & 也能跑,但不具备自动拉起能力。

注意点

  • 配置文件与可执行文件分离部署:应用通过默认配置路径读取 config.yaml,发布时注意工作目录(supervisor 的 directory、systemd 的 WorkingDirectory)必须与应用预期一致。
  • 日志:应用日志落文件并轮转,或直接对接日志采集;Nginx access/error 日志单独配置。
  • 时区:容器/服务器统一时区,避免定时任务与时间字段偏差(见 gtime 章节)。
  • 发布流程建议:编译 → 备份旧版本 → 覆盖 → 平滑重启(见优雅退出章节),把中断降到最低。

小结

生产部署三板斧:静态编译出单文件、Nginx 收流量并透传真实来源头、supervisor/systemd 保证进程活着。再叠加优雅退出与统一时区,一套 API 服务即可稳定上线。细节以官方文档 goframe.org 为准。

笔记加载中…