CentOS上部署Golang应用的完整流程
wget https://golang.org/dl/go1.20.5.linux-amd64.tar.gz/usr/local(系统级安装路径):sudo tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz~/.bashrc),添加以下内容:export GOROOT=/usr/local/go # Go安装路径
export GOPATH=$HOME/go # 工作目录(存放项目及依赖)
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin # 将Go命令加入全局路径
export GO111MODULE=on # 启用Go Modules(依赖管理)
执行source ~/.bashrc使配置生效。sudo dnf install golang -ysudo yum install golang -ygo version(显示版本号则成功)。本地开发与交叉编译:在项目根目录(含main.go)下,使用以下命令生成Linux系统的可执行文件(避免依赖目标服务器的Go环境):
GOOS=linux GOARCH=amd64 go build -o myapp
(GOOS指定操作系统,GOARCH指定架构,-o指定输出文件名)。
使用Go Modules管理依赖:若项目需第三方库,进入项目目录初始化模块:
go mod init <项目名>(如go mod init myproject)
安装依赖:go get <依赖包路径>(如go get github.com/gin-gonic/gin)。
scp命令将编译好的myapp上传至服务器(替换user、server_ip、/deploy为实际值):scp myapp user@server_ip:/deploy。chmod +x /deploy/myappapp.log):nohup /deploy/myapp > /deploy/app.log 2>&1 &nohup防止进程因终端关闭终止,2>&1将标准错误合并至标准输出)。/etc/systemd/system/下新建myapp.service(替换/deploy/myapp、user为实际路径和用户):[Unit]
Description=My Golang Application
After=network.target # 确保网络就绪后启动
[Service]
Type=simple # 简单服务类型(适用于前台运行的应用)
User=user # 运行服务的用户(避免使用root)
WorkingDirectory=/deploy # 应用工作目录
ExecStart=/deploy/myapp # 启动命令
Restart=always # 进程退出时自动重启
Environment=GO_ENV=production # 设置环境变量(如生产环境)
[Install]
WantedBy=multi-user.target # 多用户模式下启动
sudo systemctl daemon-reload # 重新加载systemd配置
sudo systemctl start myapp # 启动服务
sudo systemctl status myapp # 查看服务状态(确认是否运行)
sudo systemctl enable myapp。sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp # 永久添加端口规则
sudo firewall-cmd --reload # 重新加载防火墙配置
sudo firewall-cmd --zone=public --query-port=8080/tcp(返回yes则成功)。Dockerfile(简化部署流程):FROM golang:1.20-alpine # 使用轻量级Alpine镜像
WORKDIR /app
COPY . . # 复制项目文件至容器
RUN go build -o myapp . # 编译项目
EXPOSE 8080 # 暴露端口
CMD ["./myapp"] # 启动命令
docker build -t myapp . # 构建镜像(标签为myapp)
docker run -d -p 8080:8080 --name myapp_container myapp # 运行容器(映射端口)
docker ps(查看容器是否运行)。GOROOT、GOPATH与开发环境一致,避免依赖问题。nohup输出的日志文件(如app.log)需定期清理,或使用logrotate工具管理。netstat -tulnp | grep <端口>查找占用进程,或更换端口。