Go语言编译生成静态链接的二进制文件,部署极为简单——只需上传一个可执行文件即可运行,不需要安装运行时环境。Go程序内存占用低、启动快、并发性能优秀,非常适合在搬瓦工VPS上部署Web服务和API。
如果需要在VPS上编译Go代码,先安装Go SDK:
# 下载最新版Go
wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz
# 解压到/usr/local
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz
# 配置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc
# 验证安装
go version
Tip: 推荐在本地交叉编译后上传二进制文件,VPS上不需要安装Go SDK。
Go支持交叉编译,可以在macOS/Windows上编译Linux可执行文件:
# 在本地编译Linux AMD64版本
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp-linux-amd64 .
# 编译ARM64版本(如果VPS是ARM架构)
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o myapp-linux-arm64 .
# 减小二进制文件体积
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o myapp .
-ldflags="-s -w" 去除调试信息和符号表,通常可减小30%体积。
# 上传到VPS
scp myapp-linux-amd64 root@your-vps-ip:/opt/goapp/myapp
# 在VPS上设置权限
sudo mkdir -p /opt/goapp
sudo chmod +x /opt/goapp/myapp
# 创建配置文件
sudo nano /opt/goapp/config.yaml
server:
host: 127.0.0.1
port: 8080
database:
host: localhost
port: 3306
name: mydb
# 测试运行
/opt/goapp/myapp
# 测试访问
curl http://127.0.0.1:8080
sudo nano /etc/systemd/system/goapp.service
[Unit]
Description=Go Web Application
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/goapp
ExecStart=/opt/goapp/myapp
Restart=on-failure
RestartSec=5
# 环境变量
Environment="GIN_MODE=release"
Environment="APP_ENV=production"
Environment="APP_PORT=8080"
# 资源限制
LimitNOFILE=65535
MemoryMax=256M
# 日志
StandardOutput=append:/var/log/goapp/stdout.log
StandardError=append:/var/log/goapp/stderr.log
[Install]
WantedBy=multi-user.target
# 创建日志目录
sudo mkdir -p /var/log/goapp
sudo chown www-data:www-data /var/log/goapp
sudo chown -R www-data:www-data /opt/goapp
# 启用并启动
sudo systemctl daemon-reload
sudo systemctl enable goapp
sudo systemctl start goapp
sudo systemctl status goapp
sudo nano /etc/nginx/conf.d/goapp.conf
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 静态文件由Nginx直接处理
location /static/ {
alias /opt/goapp/static/;
expires 30d;
access_log off;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
sudo nginx -t
sudo nginx -s reload
Go应用应支持优雅停机,在收到终止信号时完成正在处理的请求:
// 示例代码片段(使用标准库)
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
srv := &http.Server{Addr: ":8080"}
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatalf("listen: %s\n", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
srv.Shutdown(ctx)
log.Println("Server exited")
}
# 本地编译新版本
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o myapp .
# 上传到VPS
scp myapp root@your-vps-ip:/opt/goapp/myapp-new
# 在VPS上替换
cd /opt/goapp
sudo systemctl stop goapp
mv myapp myapp-backup
mv myapp-new myapp
chmod +x myapp
sudo chown www-data:www-data myapp
sudo systemctl start goapp
# 验证
sudo systemctl status goapp
curl http://127.0.0.1:8080/health
CAP_NET_BIND_SERVICE,建议用Nginx代理LimitNOFILE 调整-ldflags="-s -w" 和UPX压缩 upx --best myappTip: 更多教程请查看新手教程。