在VPS上部署Go应用:开发者分步指南

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

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

开始课程

引言:为什么在VPS上部署Go应用简单且可靠

Go(Golang)是创建服务器应用最高效的语言之一。其主要优势在于可编译为单一静态二进制文件,无需在服务器上安装解释器或虚拟机。这使得在VPS(虚拟专用服务器)上部署Go应用相比Python、Node.js或Java更为简单快捷。

本文将逐步指导您在VPS上部署Go应用:从初始服务器设置,到通过systemd运行,再通过Nginx配合HTTPS发布。您将学习如何最小化风险,确保服务7x24小时稳定运行。



1. 准备VPS并安装必要软件

开始部署前,请确保您拥有VPS的SSH访问权限(例如Ubuntu 22.04 LTS)。我们将使用一套基础工具。



1.1. 初始服务器设置

连接服务器并更新软件包:

ssh root@your-server-ipapt update && apt upgrade -y

为应用创建单独用户(不要以root身份操作):

adduser deployerusermod -aG sudo deployersu - deployer


1.2. 安装Go(如需在服务器上编译)

虽然二进制文件通常在本地构建,但有时直接在VPS上编译也很方便。安装最新版Go:

wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gzecho 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrcsource ~/.bashrcgo version


1.3. 安装Git和Nginx

Git用于克隆仓库,Nginx用于反向代理和SSL:

sudo apt install git nginx -y


2. 构建Go应用并准备部署

2.1. 简单Go应用示例

让我们创建一个最小的Go HTTP服务器。您可以使用自己的项目,但为了演示,以下代码(main.go)即可:

package main

import ( "fmt" "net/http" "os")

func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from Go! Server time: %s", time.Now().Format(time.RFC1123)) })

fmt.Printf("Server starting on port %s", port) http.ListenAndServe(":"+port, nil)}


2.2. 为Linux编译二进制文件

在您的本地机器(或服务器上),为目标VPS架构(通常为amd64)构建二进制文件:

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

检查二进制文件是否为静态且不依赖库:

ldd myapp  # 应输出 "not a dynamic executable"


2.3. 上传至服务器

通过SCP将二进制文件复制到VPS:

scp myapp deployer@your-server-ip:/home/deployer/

在服务器上,将其移动到合适的目录并赋予执行权限:

sudo mkdir -p /opt/myappsudo mv /home/deployer/myapp /opt/myapp/sudo chmod +x /opt/myapp/myapp


3. 配置systemd实现自动启动和监控

systemd是Linux中的标准服务管理器。它将使您的应用在系统启动时自动运行,并在失败时自动重启。



3.1. 创建Unit文件

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

sudo nano /etc/systemd/system/myapp.service

插入以下配置:

[Unit]Description=My Go ApplicationAfter=network.target

[Service]Type=simpleUser=deployerGroup=deployerWorkingDirectory=/opt/myappExecStart=/opt/myapp/myappRestart=alwaysRestartSec=5Environment=PORT=80

博客

书籍推荐