Go 程序部署架构
概述
Go 是一门编译型语言,源程序通过 go build 编译为独立的二进制可执行文件。与 Python/PHP 最大的不同是:Go 标准库自带了完整的 HTTP 服务器(net/http),因此部署时 不需要额外的应用服务器(如 uWSGI、PHP-FPM 等)。
Go 程序的构成
Go 源码 + 静态文件 + 配置文件
↓ (go build 编译)
Go 二进制文件(包含 HTTP 服务 + 业务逻辑)
↓ (直接运行)
对外提供 HTTP 服务
Go vs Python/PHP 部署对比
| 对比项 | Go | Python | PHP |
|---|---|---|---|
| 执行方式 | 编译为二进制 → 直接运行 | 解释器读取源码执行 | 解释器读取源码执行 |
| HTTP 服务 | 标准库 net/http 自带 | 需要 uWSGI/Gunicorn | 需要 PHP-FPM |
| 部署产物 | 单个二进制文件 | 源码 + 环境 + 依赖 | 源码 + 环境 + 扩展 |
| 运行依赖 | 无(自包含) | Python 解释器 + pip 包 | PHP 解释器 + 扩展 |
| Nginx 转发指令 | proxy_pass | uwsgi_pass(推荐) | fastcgi_pass |
| 进程管理 | 直接运行或 Supervisor | uWSGI 自带进程管理 | 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,direct2️⃣ 编译源码
# 下载源码 → 解压 → 编译
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.sql4️⃣ 启动服务
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_pass | proxy_pass http://127.0.0.1:8383 | Go 程序、Daphne、uWSGI HTTP 模式 |
uwsgi_pass | uwsgi_pass 127.0.0.1:8080 | uWSGI socket 模式(Python) |
fastcgi_pass | fastcgi_pass 127.0.0.1:9000 | PHP-FPM(PHP) |
排错速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
go: command not found | Go 未安装或 PATH 未配置 | 检查 go version |
| 编译失败 | 版本不匹配 / 依赖下载失败 | 检查 go.mod 版本要求 |
| 配置文件格式错误 | JSON 格式不正确 | cat config.json 检查 |
| 数据库连接失败 | 密码或库名错误 | 检查 config.json |
| 端口被占用 | :8383 已被占用 | lsof -i:8383 |
参见
- Supervisor 进程管理 — 守护 Go 进程
- Python 体系架构 — 对比了解解释型部署
- 架构对比总结 — Go vs Python vs PHP
- Nginx — 反向代理配置
- day39 摘要 — 部署实操参考