Go应用应静态编译(CGO_ENABLED=0)、Linux平台交叉编译、用systemd管理(非nohup)、加Nginx/Caddy反向代理、环境变量外置且校验,避免硬编码和环境差异导致上线失败。

编译成静态可执行文件再上传
Go 默认会把所有依赖打包进二进制,不需要在服务器装 Go 环境。关键是要关掉 CGO(否则可能链接本地 libc):CGO_ENABLED=0 go build -o myapp main.go
生成的 myapp 是纯静态文件,扔到任意 Linux 服务器都能直接运行。
常见错误:
• 忘关 CGO_ENABLED,导致部署后报错 standard_init_linux.go:228: exec user process caused: no such file or directory
• 用 macOS 或 Windows 编译,结果传到 Linux 上无法执行(必须目标平台编译,或用 GOOS=linux GOARCH=amd64 交叉编译)
用 systemd 管理进程不挂掉
别用 nohup ./myapp & 这种方式——它没法自动重启、没日志轮转、信号处理也弱。写个 systemd service 文件更稳:
[Unit] Description=My Go Web App After=network.target [Service] Type=simple User=www-data WorkingDirectory=/opt/myapp ExecStart=/opt/myapp/myapp Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
注意点:
• User 别设成 root,普通用户更安全
• Restart=always 能兜住 panic 崩溃,但得确保程序本身不重复监听端口(否则重启失败)
• 日志走 journal,查起来用 journalctl -u myapp -f 就行,不用自己搞 logrotate
立即学习“go语言免费学习笔记(深入)”;
加一层反向代理(Nginx 或 Caddy)
Go 自带的 http.Server 能跑,但缺 HTTPS、域名复用、请求限流、静态文件缓存这些能力。直接暴露 :8080 很危险,也难扩展。
推荐用 Caddy(配置极简):Caddyfile 示例:
example.com {
reverse_proxy localhost:8080
}
或者 Nginx:location / { proxy_pass http://127.0.0.1:8080; }
重点:
• Go 服务监听 127.0.0.1:8080,别用 0.0.0.0(避免被外网直连)
• 反代要透传真实 IP,Go 里用 r.Header.Get("X-Forwarded-For") 取客户端地址
• Caddy 自动申请 HTTPS 证书;Nginx 需手动配 ssl_certificate
环境变量和配置分离
别把数据库地址、密钥写死在代码里。启动前导出环境变量,或用 .env 文件(配合 godotenv 加载):
DB_URL=postgres://user:pass@db:5432/appPORT=8080ENV=prod
systemd service 里可以加:EnvironmentFile=/opt/myapp/.env
或者直接写:Environment="DB_URL=..."
容易忽略的坑:
• os.Getenv 返回空字符串时没做校验,导致运行时报错而不是启动失败
• 把敏感信息 commit 到 Git(.env 文件必须加进 .gitignore)
• 在 Docker 或 systemd 里改了环境变量,忘了 reload daemon:sudo systemctl daemon-reload && sudo systemctl restart myapp
/tmp/app.log,但生产机上该目录不可写。这些细节比“怎么部署”本身更常导致上线失败。










