VPS部署Go语言Web服务教程


Go语言编译生成静态链接的二进制文件,部署极为简单——只需上传一个可执行文件即可运行,不需要安装运行时环境。Go程序内存占用低、启动快、并发性能优秀,非常适合在搬瓦工VPS上部署Web服务和API。

安装Go环境

如果需要在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

Systemd服务管理

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

Nginx反向代理

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

常见问题

Tip: 更多教程请查看新手教程
关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工 BandwagonHost 的优惠信息、使用教程和方案对比,方便中文用户选购和使用。

新手必读
搬瓦工优惠码

当前最大折扣优惠码:

NODESEEK2026(优惠 6.77%)

在购买方案时填入优惠码即可自动抵扣。详见 优惠码使用教程