Golang 打包的 CentOS 环境搭建与部署
一 目标与准备
- 目标:在 CentOS 上搭建可重复使用的 Go 打包与部署环境,支持本地或 CI 构建、生成 Linux 可执行文件、可选 systemd 托管与 RPM 分发。
- 准备:一台 CentOS 7/8/Stream 服务器或虚拟机,具备 sudo 权限;安装基础工具(如 wget、tar);选择 Go 版本(建议 1.18+)。
二 在 CentOS 上安装 Go 与基础环境
- 安装方式一(推荐,版本可控):
- 下载并解压 Go 二进制包(示例为 go1.18.linux-amd64.tar.gz):
- wget https://dl.google.com/go/go1.18.linux-amd64.tar.gz
- sudo tar -C /usr/local -xzf go1.18.linux-amd64.tar.gz
- 配置环境变量(写入 ~/.bashrc 或 /etc/profile):
- echo ‘export PATH=$PATH:/usr/local/go/bin’ >> ~/.bashrc
- echo ‘export GOPATH=$HOME/go’ >> ~/.bashrc
- source ~/.bashrc
- 验证:go version
- 安装方式二(yum 可用时):
- sudo yum install -y golang
- 配置环境变量(同上),验证 go version
- 说明:Go 1.18+ 已弱化 GOPATH 要求,模块化项目可直接在任意目录构建。
三 构建与打包流程
- 本地或 CI 构建(交叉编译为 Linux amd64):
- 纯 Go 依赖(推荐,便于移植):
- CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags “-s -w” -o myapp main.go
- 如需调用 C 库(启用 CGO,需在 CentOS 安装 gcc、glibc-devel 等):
- 安装编译依赖:sudo yum -y install gcc gcc-c++ make
- 构建:CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -o myapp main.go
- 产物优化与多平台:
- 减小体积:go build -ldflags “-s -w” -o myapp main.go
- 极致静态(仅当无 C 依赖时):CGO_ENABLED=0 go build -a -installsuffix cgo -ldflags “-extldflags ‘-static’” -o myapp main.go
- 多平台打包:go install github.com/mitchellh/gox@latest,然后
- gox -osarch=“linux/amd64 windows/amd64 darwin/amd64” -output=“myapp-{{.OS}}-{{.Arch}}”
- 产物归档与分发:
- 打包:tar -czvf myapp.tar.gz myapp config/ scripts/
- 上传:scp myapp.tar.gz user@server:/opt/app
- 解压:tar -xzvf myapp.tar.gz -C /opt/app
四 在 CentOS 部署与运行
- 基本运行与后台:
- chmod +x /opt/app/myapp
- nohup /opt/app/myapp > /opt/app/log.log 2>&1 &
- systemd 托管(推荐):
- 创建服务文件:/etc/systemd/system/myapp.service
- [Unit]
- Description=My Go App
- After=network.target
- [Service]
- ExecStart=/opt/app/myapp
- Restart=always
- User=www
- Group=www
- Environment=DATABASE_URL=your_db_url
- [Install]
- WantedBy=multi-user.target
- 启用与启动:
- systemctl daemon-reload
- systemctl enable --now myapp
- systemctl status myapp
- 防火墙放行(如对外提供 80/443):
- sudo firewall-cmd --permanent --add-service=http
- sudo firewall-cmd --permanent --add-service=https
- sudo firewall-cmd --reload
五 可选分发与工程化实践
- 构建 RPM 包(便于内部分发与版本管理):
- 安装工具:sudo yum install -y rpm-build
- 准备目录:mkdir -p $HOME/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
- 拷贝二进制到 SOURCES 并编写 SPEC(示例 myapp.spec),随后
- rpmbuild -ba $HOME/rpmbuild/SPECS/myapp.spec
- 产物位于 $HOME/rpmbuild/RPMS/** 下
- 容器化交付(Docker):
- 多阶段构建示例(减小镜像体积):
- FROM golang:1.23.0-alpine AS build
- WORKDIR /src
- RUN go mod download
- GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o /bin/myapp ./cmd/myapp
- FROM alpine:latest
- COPY --from=build /bin/myapp /app/myapp
- CMD [“./myapp”]
- 构建与运行:
- docker build -t myapp .
- docker run -p 8080:8080 myapp
- 工程效率建议:
- 使用 .goreleaser.yml 或 Makefile 标准化构建与发布
- 使用 upx 压缩二进制(可选):upx --best --lzma myapp
- 清理缓存:go clean -cache;并行构建:go build -p 4