第27讲 Gin的打包部署注意点
本讲基于视频实际讲解内容整理
一、本讲概述
本地用 go run main.go 能跑起来,但要把项目部署到服务器(通常是 Linux)上对外服务,还有很多注意事项。本讲讲解 Gin 项目的编译打包与部署要点:交叉编译、静态资源与模板的携带、运行模式、以及后台运行。
二、编译打包
2.1 普通编译
Shell
# 在项目根目录
go build -o bbs main.go
编译后会生成名为 bbs 的可执行文件,直接 ./bbs 即可运行,不再依赖 Go 环境。
2.2 交叉编译(在 Windows 上编译 Linux 程序)
我们开发常在 Windows,服务器多是 Linux,需要交叉编译:
Shell
# Windows 的 cmd / PowerShell 中
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o bbs main.go
| 环境变量 | 含义 |
|---|---|
CGO_ENABLED=0 |
禁用 CGO,生成纯静态二进制,避免依赖系统 C 库 |
GOOS=linux |
目标操作系统为 Linux |
GOARCH=amd64 |
目标 CPU 架构为 64 位 x86 |
老师强调:
CGO_ENABLED=0很关键。如果项目用到 SQLite 这类依赖 C 库的组件,没关 CGO 会导致编译出的程序在目标机上缺少动态库而跑不起来。纯静态编译最省心。
2.3 在 Git Bash / Linux 下的写法
Shell
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bbs main.go
三、模板与静态资源的携带
3.1 模板目录要一起部署
r.LoadHTMLGlob("templates/*") 用的是相对路径,所以部署时必须把 templates 目录和可执行文件放在同一级:
TEXT
部署包/
├── bbs ← 可执行文件
├── templates/ ← 模板目录(必须带)
│ ├── base.html
│ ├── index.html
│ └── login.html
└── static/ ← 静态资源(如果有)
└── css/
老师指出:最常见部署翻车就是"只传了可执行文件,忘了传 templates",一访问页面就报模板找不到。模板、静态资源要和可执行文件一起打包。
3.2 静态文件服务
如果项目有 css/js/图片,记得注册静态目录:
Go
r.Static("/static", "./static")
这样模板里 <link href="/static/css/style.css"> 才能正常加载。
四、运行模式
4.1 设置为 Release 模式
Gin 默认是 debug 模式(有热重载提示、打印多余日志)。生产环境应切到 release:
Go
func main() {
gin.SetMode(gin.ReleaseMode) // 放在最前面
r := gin.Default()
// ...
r.Run(":8080")
}
| 模式 | 特点 |
|---|---|
gin.DebugMode |
开发用,输出详细日志 |
gin.ReleaseMode |
生产用,性能更好、日志更少 |
gin.TestMode |
测试用 |
老师提醒:生产环境一定要设 Release,否则不仅日志刷屏,还会暴露调试信息。
4.2 端口与防火墙
- 代码里
r.Run(":8080")监听 8080,部署时确保服务器防火墙/安全组放开了该端口 - 若用 80 端口,Linux 下可能需要权限或以反向代理(Nginx)转发
五、在服务器上后台运行
5.1 用 nohup 后台运行
Shell
nohup ./bbs > bbs.log 2>&1 &
nohup ... &让程序在后台持续运行,退出终端也不中断,日志写入bbs.log。
5.2 更稳妥:用 systemd / supervisor(了解)
生产环境推荐用进程守护工具(如 systemd、supervisor)管理,宕机自动重启。本讲老师以 nohup 演示为主,进阶可了解进程守护。
六、本讲小结
| 知识点 | 要点 |
|---|---|
| 编译 | go build -o bbs main.go |
| 交叉编译 | CGO_ENABLED=0 GOOS=linux GOARCH=amd64 |
| 模板携带 | templates 目录必须随可执行文件一起部署 |
| 静态资源 | r.Static("/static", "./static") |
| 运行模式 | 生产设 gin.SetMode(gin.ReleaseMode) |
| 后台运行 | nohup ./bbs > bbs.log 2>&1 & |
七、课后练习
- 在本地用
go build -o bbs编译出可执行文件并直接运行,确认能访问 - 设置
CGO_ENABLED=0 GOOS=linux GOARCH=amd64交叉编译出 Linux 版本 - 把可执行文件和
templates、static目录一起打成压缩包,模拟部署 - 在
main最前面加gin.SetMode(gin.ReleaseMode),对比 debug 模式日志差异 - 用
r.Static注册静态目录,并在模板中正确引用 css - 思考:如果部署后页面打不开,你会按什么顺序排查(端口?模板?防火墙?)?