部署:nginx 反代、supervisor、Docker
面试问法:GoFrame 服务怎么部署上线?nginx、supervisor、Docker 各是什么角色? 一句话结论:Go 编译产物是单文件,部署核心是三件事——谁收流量(nginx 反代并透传真实来源头)、谁拉起进程(supervisor/systemd 守护、异常自动重启)、怎么打包(Docker 多阶段构建出最小镜像)。再叠加统一时区与优雅退出即可稳定上线。
nginx 反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1:8199; # 应用监听内网端口
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;
}
location /ws { # WebSocket 需额外转发升级头
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:8199;
}
}
静态资源可交给 nginx 直接处理,应用只服务 API;HTTPS 在 nginx 层终结。
supervisor 进程守护
[program:gf-app]
user = root
directory = /var/www ; 工作目录与 command 顺序有讲究
command = /var/www/main ; 绝对路径
environment = GF_GCFG_FILE="config.prod.yaml"
stdout_logfile = /var/log/gf-app-out.log
stderr_logfile = /var/log/gf-app-err.log
autostart = true
autorestart = true
配置放 /etc/supervisor/conf.d/,supervisorctl reload/status 管理;systemd 方案等价(Restart=always + WorkingDirectory)。
Docker 多阶段构建
FROM golang:1.22 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /out/main main.go
FROM alpine:3.20
COPY --from=build /out/main /app/main
COPY manifest/config /app/manifest/config
WORKDIR /app
EXPOSE 8000
ENTRYPOINT ["/app/main"]
注意点
- 配置文件与二进制分离部署;容器/守护进程的工作目录必须与应用预期一致(gcfg 默认检索 manifest/config 等目录)。
- 发布流程:编译 → 备份旧版 → 覆盖 → 优雅重启(见优雅退出章节),把中断降到最低。
- Docker stop 会发 SIGTERM,应用按优雅退出收尾;容器内时区与宿主机统一。
常见追问
- 追问:nginx 反代后用户 IP 全变成 127.0.0.1 怎么办?——用 X-Real-IP/X-Forwarded-For 头透传真实来源,应用记录与鉴权据此取。
- 追问:K8s 里还需要 supervisor 吗?——不需要,Pod 重启策略替代进程守护;Dockerfile 直接作为镜像即可。
记忆点
- 三板斧:nginx 收流量、supervisor/systemd 保进程、Docker 出镜像;细节以官方文档为准。