Go 程序部署架构

概述

Go 是一门编译型语言,源程序通过 go build 编译为独立的二进制可执行文件。与 Python/PHP 最大的不同是:Go 标准库自带了完整的 HTTP 服务器(net/http),因此部署时 不需要额外的应用服务器(如 uWSGI、PHP-FPM 等)。

Go 程序的构成

Go 源码 + 静态文件 + 配置文件
       ↓ (go build 编译)
Go 二进制文件(包含 HTTP 服务 + 业务逻辑)
       ↓ (直接运行)
对外提供 HTTP 服务

Go vs Python/PHP 部署对比

对比项GoPythonPHP
执行方式编译为二进制 → 直接运行解释器读取源码执行解释器读取源码执行
HTTP 服务标准库 net/http 自带需要 uWSGI/Gunicorn需要 PHP-FPM
部署产物单个二进制文件源码 + 环境 + 依赖源码 + 环境 + 扩展
运行依赖无(自包含)Python 解释器 + pip 包PHP 解释器 + 扩展
Nginx 转发指令proxy_passuwsgi_pass(推荐)fastcgi_pass
进程管理直接运行或 SupervisoruWSGI 自带进程管理PHP-FPM 自带进程管理

通信链路

浏览器
  ↕ HTTP :8111
Nginx(反向代理)
  ↕ HTTP(proxy_pass)
Go 二进制文件(监听 :8383,自带 HTTP 服务 + 业务逻辑)
  ↕ 数据库驱动
MySQL 数据库

Go 链路全程走 HTTP 协议,Nginx 用 proxy_pass 做标准反向代理。


部署流程

1️⃣ 编译环境准备

# 下载并安装 Go 编译工具
wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz
tar xf go1.22.1.linux-amd64.tar.gz
mv go /usr/local/go
 
# 配置环境变量
echo 'PATH=/usr/local/go/bin:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile
 
# 验证
go version
 
# 配置模块代理(国内加速)
go env -w GOPROXY=https://goproxy.cn,direct

2️⃣ 编译源码

# 下载源码 → 解压 → 编译
cd /go_pro/chitchat-master
go build -o chitchat          # 编译为二进制文件
ls -l chitchat                # 验证产物

编译结果是一个独立的二进制文件,可直接移植到其他同架构 Linux 系统运行(无需安装 Go 环境)。

3️⃣ 配置与初始化

# 修改配置文件
vim config.json               # 数据库连接地址、账号密码等
 
# 初始化数据库
mysql -uroot -p'密码' -e "CREATE DATABASE chitchat;"
mysql -uroot -p'密码' chitchat < all.sql

4️⃣ 启动服务

cd /go_pro/chitchat-master
./chitchat &                  # 后台运行(默认读取 config.json)
curl http://127.0.0.1:8383   # 验证

5️⃣ Nginx 反向代理

# /etc/nginx/conf.d/www.conf
server {
    listen 8111;
    server_name localhost;
 
    location / {
        proxy_pass http://127.0.0.1:8383;   # 代理到 Go 服务
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

进程管理

由于 Go 程序是直接运行的二进制,没有像 uWSGI 那样的内置进程管理器,通常会配合 Supervisor 实现:

  • 后台运行(替代 &nohup
  • 崩溃自动重启(故障自愈)
  • 日志统一管理

Nginx 转发指令选择

指令用法适用场景
proxy_passproxy_pass http://127.0.0.1:8383Go 程序、Daphne、uWSGI HTTP 模式
uwsgi_passuwsgi_pass 127.0.0.1:8080uWSGI socket 模式(Python)
fastcgi_passfastcgi_pass 127.0.0.1:9000PHP-FPM(PHP)

排错速查表

现象可能原因排查方法
go: command not foundGo 未安装或 PATH 未配置检查 go version
编译失败版本不匹配 / 依赖下载失败检查 go.mod 版本要求
配置文件格式错误JSON 格式不正确cat config.json 检查
数据库连接失败密码或库名错误检查 config.json
端口被占用:8383 已被占用lsof -i:8383

参见