在VPS上部署Go应用:从A到Z的逐步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么Go和VPS是您项目的理想组合

\n\n

Go(Golang)是一种为性能和简洁而设计的编译型语言。它在部署时的主要优势是静态编译。您无需在服务器上安装解释器或虚拟机。只需上传一个二进制文件并运行它。这使得在VPS上部署Go应用变得异常快速和可靠。

\n\n

在本指南中,我们将走完完整流程:从编写一个简单的Go HTTP服务器,到在运行Ubuntu 22.04的真实VPS服务器上启动它。我们将配置systemd以实现自动启动,Nginx作为反向代理,以及Let's Encrypt用于HTTPS。所有代码示例均可直接使用。

\n\n

1. 准备VPS并编写Go应用

\n\n

1.1. 服务器初始配置

\n\n

购买VPS(例如,从DigitalOcean、Timeweb或Hetzner)后,通过SSH连接:

\n\n
ssh root@您的服务器IP
\n\n

执行基本安全配置:

\n\n
apt 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\n
ufw allow 22\nufw allow 80\nufw allow 443\nufw enable
\n\n

1.2. 用于部署的简单Go应用

\n\n

在您的本地机器上创建文件 main.go:

\n\n
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\n
go run main.go
\n\n

在浏览器中打开 http://localhost:8080。如果您看到问候信息,说明一切正常。

\n\n

2. 编译并将二进制文件上传到服务器

\n\n

2.1. 为Linux进行交叉编译

\n\n

在您的本地机器上(即使您使用的是Windows或macOS),执行:

\n\n
GOOS=linux GOARCH=amd64 go build -o myapp main.go
\n\n

标志 -o myapp 指定输出文件的名称。环境变量 GOOS 和 GOARCH 指定目标架构(64位Linux)。

\n\n

编译后,您将得到一个大小约为10-15 MB的二进制文件 myapp。

\n\n

2.2. 上传到VPS

\n\n

使用 scp 复制文件:

\n\n
scp myapp deployer@您的服务器IP:/home/deployer/myapp
\n\n

或者,如果您使用rsync:

\n\n
rsync -avz myapp deployer@您的服务器IP:/home/deployer/myapp
\n\n

在服务器上,将二进制文件移动到系统目录并使其可执行:

\n\n
sudo mv /home/deployer/myapp /usr/local/bin/myapp\nsudo chmod +x /usr/local/bin/myapp
\n\n

3. 配置systemd和自动启动

\n\n

3.1. 创建service文件

\n\n

Systemd将管理我们的应用:在系统启动时启动,崩溃时重启,并收集日志。

\n\n

创建文件 /etc/systemd/system/myapp.service:

\n\n
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                

博客

书籍推荐