在 CentOS 上打包 Golang 应用的标准流程
一 准备环境
- 安装 Go(两种常用方式,二选一)
- 使用 yum 安装发行版包:sudo yum install -y golang
- 或下载官方二进制包并解压到 /usr/local:
- wget https://dl.google.com/go/go1.23.3.linux-amd64.tar.gz
- sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
- 配置环境变量(写入 /etc/profile 或 ~/.bashrc)
- export GOROOT=/usr/local/go
- export GOPATH=$HOME/go
- export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
- 使配置生效:source /etc/profile 或 source ~/.bashrc
- 验证安装:go version 应输出版本号
二 编译与本地打包
- 使用 Go Modules 管理依赖
- go mod init example.com/myapp
- go mod tidy
- 交叉编译为 Linux 目标(在 CentOS 上构建 Linux amd64 常用)
- GOOS=linux GOARCH=amd64 go build -o myapp main.go
- 常用编译优化
- 减小体积:go build -ldflags “-s -w” -o myapp
- 完全静态链接(避免外部 C 库依赖):CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o myapp
- 产物打包为压缩归档(便于传输与备份)
- tar -czvf myapp-linux-amd64.tar.gz myapp config/ 或 upx --best myapp(需安装 UPX)
三 制作 RPM 包便于分发与安装(可选)
- 安装构建工具
- sudo yum install -y rpm-build rpmdevtools
- 初始化 rpmbuild 目录结构
- rpmdev-setuptree(生成 ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS})
- 准备源码与 spec
- 将可执行文件与配置放入 ~/rpmbuild/SOURCES/myapp-1.0.tar.gz
- 编辑 ~/rpmbuild/SPECS/myapp.spec(示例要点)
- Name: myapp
- Version: 1.0
- Release: 1%{?dist}
- Summary/License/URL 按需填写
- Source0: %{name}-%{version}.tar.gz
- BuildRequires: golang
- Requires: golang
- %description、%prep、%build、%install、%files、%changelog 按需填写
- 构建 RPM
- rpmbuild -ba ~/rpmbuild/SPECS/myapp.spec
- 产物位于:~/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm(路径随系统和版本变化)
- 使用 go-srpm-macros 与 Mock(CentOS 7/8 推荐)
- 安装 go-srpm-macros 并在 .spec 中使用相关宏
- 生成 SRPM:rpmbuild -bs SPECS/myapp.spec
- 用 Mock 在隔离环境构建:mock -r centos-7-x86_64 --rebuild SPECS/myapp.src.rpm
四 部署与运行
- 上传与权限
- scp myapp-linux-amd64 user@host:/opt/myapp/
- ssh user@host “chmod +x /opt/myapp/myapp”
- 运行与守护
- 前台:/opt/myapp/myapp
- 后台:nohup ./myapp > app.log 2>&1 &
- 进程守护示例脚本(循环检测并拉起):
- PROGRAM=“/opt/myapp/myapp”
- LOG=“/opt/myapp/app.log”
- start() { nohup “$PROGRAM” >> “$LOG” 2>&1 & }
- check() { pgrep -f “$PROGRAM” >/dev/null || start; }
- while true; do sleep 120; check; done
- 前端静态资源与反向代理(如 Go + Vue)
- Vue 先打包:npm run build,将产物放到 Nginx/宝塔静态站点
- Go 二进制作为后端服务,通过域名反向代理到后端端口
五 常见问题与优化建议
- 静态编译更通用:在目标服务器缺少 C 库时,使用 CGO_ENABLED=0 静态构建可显著降低运行失败概率
- 构建参数建议:生产构建常用 -ldflags “-s -w” 去除符号与调试信息,必要时再配合 UPX 压缩
- 多架构交付:同一代码库可批量交叉编译(GOOS=linux, windows, darwin;GOARCH=amd64, arm64 等),分别产出产物
- 自动化交付:结合 GitHub Actions 或 Jenkins,在 CI 中完成构建、制品归档与 SSH 发布,缩短发布链路