使用GOOS和GOARCH环境变量指定目标系统为Linux(linux)和64位架构(amd64,若为ARM架构则需调整),确保生成的可执行文件能在CentOS上运行。例如:
GOOS=linux GOARCH=amd64 go build -o myapp
需确认目标CentOS系统的架构(通过uname -m查看),避免因架构不匹配导致“exec格式错误”。
设置CGO_ENABLED=0禁用CGO,生成纯静态二进制文件,不依赖目标系统的C库(如glibc)。若开启CGO,需确保目标系统安装对应版本的C编译器(如gcc),否则会因缺少依赖无法运行。
通过-ldflags参数去除符号表和调试信息,进一步减小二进制体积并增强静态性:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o myapp
若仍需静态链接(如避免glibc版本冲突),可添加-extldflags "-static"(部分标准库可能不支持,需测试验证)。
通过go mod init初始化模块,go mod tidy整理依赖,确保所有依赖项版本明确且可复现。避免直接使用go get安装依赖,防止因依赖版本不一致导致打包或运行错误。
上传到CentOS服务器后,使用chmod +x myapp为二进制文件添加执行权限。若需共享给其他用户,可设置为chmod 755 myapp(谨慎使用777,存在安全风险)。
配置文件(如.env、config.ini)不应打包到二进制中,需单独存放。建议将配置文件路径作为环境变量传入(如APP_CONFIG=./config.ini),或在代码中设置默认路径(如./config目录)。修改配置文件后需重启服务生效。
nohup ./myapp &将进程放到后台,避免终端关闭导致进程终止。nohup ./myapp > app.log 2>&1 &),便于排查问题。systemd创建服务(如myapp.service),实现开机自动启动。示例服务文件:[Unit]
Description=My Golang App
After=network.target
[Service]
ExecStart=/path/to/myapp
Restart=always
User=root
[Install]
WantedBy=multi-user.target
使用systemctl enable myapp设置开机自启,systemctl start myapp启动服务。若目标CentOS版本较旧(如CentOS 7),而编译环境较新(如使用Go 1.21+),可能因glibc版本不匹配导致运行错误。解决方法:
centos:7)编译,确保glibc版本兼容。-ldflags="-extldflags '-static'"生成静态二进制文件,避免依赖系统glibc。-ldflags="-s -w"去除调试信息,或用upx工具压缩(如upx --best myapp),可减少20%-50%体积。go clean -cache清理构建缓存,加快后续编译速度。-p参数指定并行编译数(如go build -p 4),利用多核CPU提升编译效率。