把 Go 程序部署成 CentOS 系统服务,这件事本身并不复杂,但步骤里有些细节如果不注意,很容易踩坑。下面这份流程是经过多次验证的,跟着走基本不会出问题。

写好你的 Go 程序。假设你已经有一个 HTTP 服务器,就像下面这样:
// main.go package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, World!") }) fmt.Println("Server is running at http://localhost:8080") http.ListenAndServe(":8080", nil) }确认 CGO 状态。如果你的程序没有用到 CGO,直接编译就好。如果用了 CGO,需要额外配置环境变量确保兼容。这一步容易忽略,建议先检查代码里是否有
import "C"或依赖 cgo 的库。交叉编译。在本地开发机器上,用
GOOS和GOARCH指定目标平台。比如 CentOS 7 通常是linux amd64:GOOS=linux GOARCH=amd64 go build -o myservice main.go执行后当前目录就会生成一个叫
myservice的二进制文件。传到 CentOS 服务器。用
scp或者你习惯的文件传输工具都行:scp myservice user@centos_server:/path/to/destination给执行权限。到了服务器上,别忘了:
chmod +x /path/to/destination/myservice创建 systemd 服务文件。这是整个流程的关键——让程序能开机自启、崩溃自动恢复。用
vi或者其他编辑器新建一个文件:sudo vi /etc/systemd/system/myservice.service内容如下(记得替换用户和组):
[Unit] Description=My Go Service After=network.target [Service] ExecStart=/path/to/destination/myservice Restart=always User=Group= Environment=GO_ENV=production [Install] WantedBy=multi-user.target 启动并设置开机自启:
sudo systemctl start myservice sudo systemctl enable myservice检查状态,确认一切正常:
sudo systemctl status myservice
如果你的 Go 程序没有依赖特殊系统库或者 CGO,这八步走完,服务就已经跑起来了。需要说明的是,上面假设你的程序是纯 Go 写的,不依赖特定操作系统特性。如果涉及 CGO 或系统级依赖,那编译阶段还需要额外配置,比如设置 CGO_ENABLED=1 或指定 CC 编译器。那种情况虽然不常见,但提前了解可以避免临时抓瞎。