Debian 上部署 Golang 项目的实用流程
一 准备与安装
- 更新系统并安装基础工具:
- sudo apt update && sudo apt install -y git curl wget
- 安装 Go(两种常用方式,二选一)
- 使用发行版仓库安装:sudo apt install -y golang-go(简单,版本可能偏旧)
- 使用官方二进制包安装(推荐,版本可控):
- 查看架构:dpkg --print-architecture(常见为 amd64)
- 下载并解压:
- wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
- sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
- 配置环境变量(写入 ~/.bashrc 或 /etc/profile):
- export PATH=$PATH:/usr/local/go/bin
- source ~/.bashrc
- 验证:go version(应输出版本号,如 go1.22 linux/amd64)
二 两种部署路径
- 方式 A 服务器编译运行
- 拉取代码:git clone https://github.com/yourname/yourproject.git && cd yourproject
- 安装依赖:go mod tidy
- 编译:go build -o myapp main.go
- 运行:./myapp(调试阶段可直接前台运行)
- 方式 B 本地交叉编译后上传(推荐,镜像更干净、CI/CD 友好)
- 本地交叉编译(目标为 Linux amd64):
- GOOS=linux GOARCH=amd64 go build -o myapp main.go
- 上传到服务器:scp myapp user@your_server:/var/www/myapp/
- 服务器赋权:chmod +x /var/www/myapp/myapp
- 试运行:/var/www/myapp/myapp
- 说明
- Go 是静态编译,通常无需在服务器安装额外运行时依赖;二进制可直接运行。
三 以 systemd 托管服务
- 建议创建专用用户与目录(更安全):
- sudo useradd -m -s /bin/bash deploy
- sudo mkdir -p /var/www/myapp && sudo chown deploy:deploy /var/www/myapp
- 创建服务文件:sudo nano /etc/systemd/system/myapp.service
- 示例(按需修改路径、用户、端口):
- [Unit]
- Description=My Go Application
- After=network.target
- [Service]
- Type=simple
- User=deploy
- Group=deploy
- WorkingDirectory=/var/www/myapp
- ExecStart=/var/www/myapp/myapp
- Environment=PORT=8080
- Restart=on-failure
- StandardOutput=journal
- StandardError=journal
- [Install]
- WantedBy=multi-user.target
- 常用命令:
- 重载并启停:
- sudo systemctl daemon-reload
- sudo systemctl start myapp
- sudo systemctl enable myapp
- sudo systemctl status myapp
- 查看日志:
- sudo journalctl -u myapp -f
- 提示
- 若程序监听 80/443,可直接以 root 或具备相应能力的用户运行;否则建议监听高位端口(如 8080)并用反向代理对外暴露。
四 对外访问与反向代理
- 防火墙放行(示例为 8080 端口)
- 安装并配置 Nginx 反向代理
- 安装:sudo apt install -y nginx
- 配置(/etc/nginx/sites-available/myapp 或 /etc/nginx/conf.d/myapp.conf):
- server {
- listen 80;
- server_name yourdomain.com;
- location / {
- proxy_pass http://127.0.0.1:8080;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- }
- }
- 启用与生效:
- sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
- sudo nginx -t && sudo systemctl reload nginx
- 可选:申请并配置 HTTPS/TLS(可使用 certbot 自动签发)。
五 依赖管理与常见问题
- 依赖管理(Go Modules)
- 初始化:go mod init
- 拉取与整理:go get ./… 或 go mod tidy
- 常用:go list -m all(查看依赖)、go get -u(升级)、go mod vendor(可选,将依赖打入 vendor)
- 常见问题速查
- 端口未放行:应用启动成功但外部访问失败,检查云安全组与 ufw/iptables 规则
- 权限不足:确保运行用户对二进制与日志目录具备读写权限
- 监听地址错误:服务仅绑定 127.0.0.1 时外部不可达,改为 0.0.0.0
- 日志查看:优先使用 journalctl -u myapp;若用文件日志,确保目录可写并配置 logrotate
- 构建失败:确认 GOOS/GOARCH 与服务器架构一致(常见为 linux/amd64)。