引言:为什么Go和VPS是您项目的理想组合
\n\nGo(Golang)是一种为性能和简洁而设计的编译型语言。它在部署时的主要优势是静态编译。您无需在服务器上安装解释器或虚拟机。只需上传一个二进制文件并运行它。这使得在VPS上部署Go应用变得异常快速和可靠。
\n\n在本指南中,我们将走完完整流程:从编写一个简单的Go HTTP服务器,到在运行Ubuntu 22.04的真实VPS服务器上启动它。我们将配置systemd以实现自动启动,Nginx作为反向代理,以及Let's Encrypt用于HTTPS。所有代码示例均可直接使用。
\n\n1. 准备VPS并编写Go应用
\n\n1.1. 服务器初始配置
\n\n购买VPS(例如,从DigitalOcean、Timeweb或Hetzner)后,通过SSH连接:
\n\nssh root@您的服务器IP\n\n执行基本安全配置:
\n\napt update && apt upgrade -y\nadduser deployer\nusermod -aG sudo deployer\n# 在 /etc/ssh/sshd_config 中禁用root登录\n# PermitRootLogin no\nsystemctl restart sshd\n\n确保防火墙(UFW)中开放了80和443端口:
\n\nufw allow 22\nufw allow 80\nufw allow 443\nufw enable\n\n1.2. 用于部署的简单Go应用
\n\n在您的本地机器上创建文件 main.go:
package main\n\nimport (\n\t"fmt"\n\t"log"\n\t"net/http"\n\t"os"\n)\n\nfunc main() {\n\tport := os.Getenv("PORT")\n\tif port == "" {\n\t\tport = "8080"\n\t}\n\n\thttp.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n\t\tfmt.Fprintf(w, "来自Go的问候!服务器正在端口 %s 上运行", port)\n\t})\n\n\thttp.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {\n\t\tw.WriteHeader(http.StatusOK)\n\t\tw.Write([]byte("OK"))\n\t})\n\n\tlog.Printf("在 :%s 上启动服务器", port)\n\tlog.Fatal(http.ListenAndServe(":"+port, nil))\n}\n\n在本地测试:
\n\ngo run main.go\n\n在浏览器中打开 http://localhost:8080。如果您看到问候信息,说明一切正常。
2. 编译并将二进制文件上传到服务器
\n\n2.1. 为Linux进行交叉编译
\n\n在您的本地机器上(即使您使用的是Windows或macOS),执行:
\n\nGOOS=linux GOARCH=amd64 go build -o myapp main.go\n\n标志 -o myapp 指定输出文件的名称。环境变量 GOOS 和 GOARCH 指定目标架构(64位Linux)。
编译后,您将得到一个大小约为10-15 MB的二进制文件 myapp。
2.2. 上传到VPS
\n\n使用 scp 复制文件:
scp myapp deployer@您的服务器IP:/home/deployer/myapp\n\n或者,如果您使用rsync:
\n\nrsync -avz myapp deployer@您的服务器IP:/home/deployer/myapp\n\n在服务器上,将二进制文件移动到系统目录并使其可执行:
\n\nsudo mv /home/deployer/myapp /usr/local/bin/myapp\nsudo chmod +x /usr/local/bin/myapp\n\n3. 配置systemd和自动启动
\n\n3.1. 创建service文件
\n\nSystemd将管理我们的应用:在系统启动时启动,崩溃时重启,并收集日志。
\n\n创建文件 /etc/systemd/system/myapp.service:
sudo nano /etc/systemd/system/myapp.service\n\n粘贴以下配置:
\n\n[Unit]\nDescription=Go应用服务器\nAfter=network.target\n\n[Service]\nType=simple\nUser=deployer\nGroup=deployer\nWorkingDirectory=/usr/local/bin\nExecStart=/usr/local/bin/myapp\nRestart=always\nRestartSec=5\nEnvironment=PORT=8080\nEnvironment=GIN_MO