Golang 应用打包为 CentOS 服务的常用方法
一 编译与打包要点
- 交叉编译为 Linux 可执行文件:在 macOS 或 Windows 开发机上设置环境变量后构建,常用命令为:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app main.go;Windows 下使用 set 设置环境变量。这样可在无需安装 Go 的 CentOS 服务器直接运行。为减少依赖、提升可移植性,优先采用静态编译:CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o app main.go。二进制体积可进一步用 UPX 压缩:upx --best --lzma app。以上做法适用于绝大多数基于 glibc 的 CentOS 7/8/Stream 环境。
二 部署为 systemd 服务
- 将二进制与配置放入目录(如 /opt/myapp),创建服务单元文件 /etc/systemd/system/myapp.service,示例:
- [Unit]
- Description=My Go Application
- After=network.target
- [Service]
- Type=simple
- User=www
- Group=www
- ExecStart=/opt/myapp/app
- Restart=always
- Environment=PORT=8080
- WorkingDirectory=/opt/myapp
- [Install]
- WantedBy=multi-user.target
- 启用与运维:执行 systemctl daemon-reload;systemctl start myapp;systemctl enable myapp;查看日志 journalctl -u myapp -f。该方式具备进程守护、自动重启、开机自启与集中日志等优势,是 CentOS 7+ 的推荐做法。
三 容器化打包与运行
- 使用 Docker 多阶段构建减小镜像体积:第一阶段 golang:1.23-alpine 编译,第二阶段 alpine 仅拷贝二进制并运行,EXPOSE 指定端口,CMD 启动应用;运行容器时映射端口(如 -p 8080:8080)。此方式环境一致、交付标准化,便于在 CentOS 的 Podman 或 Docker 环境中部署与回滚。
四 简单后台运行与临时部署
- 无 systemd 或快速验证时,可用 nohup 后台运行并重定向日志:nohup ./app > app.log 2>&1 &;查看端口占用与结束进程可用 netstat -tlnp 或 ss -ltnp 配合 lsof -i:端口 与 kill PID。该方式适合调试或过渡环境,不建议长期生产使用。
五 CI/CD 自动构建与发布
- 使用 GitHub Actions 自动构建与部署:在 CI 中设置 GOOS=linux GOARCH=amd64 静态构建,借助 ssh-action/scp-action 将二进制上传至服务器,先停止旧进程再启动新版本;注意脚本工作目录与 .env 路径,避免找不到配置;也可采用蓝绿/时间戳二进制实现更平滑的发布。该流程适合持续交付到 CentOS 生产环境。