本地构建与交叉编译
在把Go项目扔到服务器之前,先在本地打好包。Go的一大优势是静态编译,直接生成可执行文件,不依赖外部库。比如你在Mac上写完代码,想部署到Linux服务器,用一行命令就能搞定:
GOOS=linux GOARCH=amd64 go build -o myapp main.go这条命令会生成一个叫myapp的二进制文件,专为Linux系统准备。以后换架构或系统也一样,改GOOS和GOARCH就行,不用重新装环境。
上传与运行脚本
文件编译好了,接下来传到服务器。可以用scp命令:
scp myapp user@your-server:/home/user/app/登录服务器,进到目录,直接运行:
./myapp如果提示没权限,加个chmod:
chmod +x myapp这时候服务就跑起来了,默认可能占着终端。想让它后台运行,可以加&,或者用nohup:
nohup ./myapp &使用systemd管理服务
公司里没人愿意手动重启挂掉的服务。Linux系统一般都用systemd来管进程。在/etc/systemd/system下建个文件,比如myapp.service:
[Unit]
Description=My Go Application
After=network.target
[Service]
User=appuser
ExecStart=/home/appuser/app/myapp
Restart=always
[Install]
WantedBy=multi-user.target保存后启用服务:
sudo systemctl enable myapp.service
sudo systemctl start myapp之后启停查状态都方便了,出问题也会自动重启。
配合Nginx做反向代理
Go服务通常监听本地端口,比如:8080。但用户访问不该带端口号。这时候让Nginx挡前面,把80请求转给后端。
在Nginx配置里加一段:
server {
listen 80;
server_name api.yoursite.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}重载配置后,用户访问api.yoursite.com,实际请求就被转到Go程序了。还能顺便处理HTTPS、静态资源这些事。
自动化部署小技巧
每次改完代码都手动编译上传太累。可以写个简单的部署脚本deploy.sh:
#!/bin/bash
GOOS=linux GOARCH=amd64 go build -o myapp main.go
scp myapp user@your-server:/home/user/app/
ssh user@your-server 'systemctl restart myapp'本地运行./deploy.sh,一键完成构建、上传、重启。等项目大了再上CI/CD也不迟。
日志别直接扔终端
上线后不能靠打印看问题。把日志写文件更靠谱。比如用标准库log搭配rotatelogs:
import (
"log"
"os"
)
func init() {
logFile, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
log.SetOutput(logFile)
}systemd其实也会捕获输出,用journalctl就能查:
journalctl -u myapp.service -f开发时方便,上线后也能追问题。