将API部署到云服务器

记录一下将API部署到云服务器的流程,同时也作为第一篇正经的博文来练习使用WordPress编辑文章。希望能养成把学习内容归档到这里的习惯啊(っ´ω`c)

Step0 最终目的

  • 在服务器本地跑监听本地端口的进程
  • 使用博客的子域名(如 https://api.domain.com )作为API的域名,通过Nginx将请求反向代理到进程监听的本地端口
  • 使用systemd自动管理API,实现开机自启/崩溃自动拉起/日志

Step1 在服务器上部署Go程序

最通用的做法是在服务器上编译。由于服务器性能有限,我选择在本地编译后上传到服务器

package main

import (
	"log"

	"github.com/gin-gonic/gin"
)

func main() {
	gin.SetMode(gin.ReleaseMode)

	router := gin.New()
	router.Use(gin.Recovery())
	router.Use(gin.Logger())

	router.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "pong"})
	})

	if err := router.Run("127.0.0.1:8080"); err != nil {
		log.Fatalf("Failed to start server: %v", err)
	}
}

使用Gin编写了一个简单的程序,监听本地的8080端口

Bash:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ping_pong main.go

PowerShell:

$env:CGO_ENABLED="0"
$env:GOOS="linux"
$env:GOARCH="amd64"
go build -o ping_pong main.go

将程序编译为Linux程序。若要在服务器上进行编译,则使用git clone或直接上传源代码,再到服务器上安装Go后进行编译即可。但我使用2核2G服务器编译时直接卡死无法连接了(´;ω;`)

最后将编译出的可执行文件放到合适的位置,如/www/api/ping_pong/ping_pong,放到wwwroot下貌似会有权限问题,带来更多麻烦。 先手动跑起来测试一下:

sudo chmod +x /www/api/ping_pong/ping_pong
# chmod:change mode,修改文件权限
# +x:添加 executable(可执行)权限
# /www/api/ping_pong/ping_pong:二进制文件路径

cd /www/api/ping_pong
./ping_pong
curl -i http://127.0.0.1:8080/ping

Step2 用systemd管理API

建一个管理API的专用用户:

sudo useradd -r -s /usr/sbin/nologin api || true
# -r:创建系统用户
# -s /usr/sbin/nologin:把新增用户的 shell 设置为 nologin,意味着这个用户不能登录
# api是用户名
# 若用户已存在导致useradd报错,|| true确保忽略错误继续执行

sudo chown -R api:api /www/api
# chown:change owner,改文件/目录的属主
# -R:递归修改目录下所有子目录和文件
# api:api:格式是 用户:组,把属主改为用户"api",把属组也改为api
# /www/api:目标目录

创建service 文件:

sudo nano /etc/systemd/system/ping_pong.service
# 使用nano创建并打开ping_pong.service文本文件进行编辑,Ctrl+O保存,Ctrl+X退出

简单的service文件内容:

[Unit]
Description=Ping Pong API
# 服务描述
After=network.target
# 启动顺序依赖,表示网络基本就绪后启动服务

[Service]
Type=simple
# 类型,普通前台进程
User=api
# 用户,使用刚刚创建的用户"api"
WorkingDirectory=/www/api/ping_pong
# 运行目录,即程序根目录(程序的相对路径也依赖这个)
ExecStart=/www/api/ping_pong/ping_pong
# 可执行文件的绝对路径
Restart=always
# 进程退出时总是尝试重启
RestartSec=2
# 重启前等待2s,避免反复崩溃时一直重启
#LimitNOFILE=
# 限制打开文件数
#TimeoutStopSec=
# 设置退出超时

# 通过“Environment=键=值”的格式设置环境变量
# Environment=ADDR=127.0.0.1:8080

StandardOutput=journal
StandardError=journal
#设置日志输出位置

[Install]
WantedBy=multi-user.target
# 当系统进入多用户运行状态时需要启动,但还没有开启开机自启动

保存service文件后执行下列命令:

sudo systemctl daemon-reload
# 重载 .service 配置文件
sudo systemctl enable --now ping_pong
# 设置开机自启并立即启动
sudo systemctl status ping_pong
# 查看运行状态
journalctl -u ping_pong -f
# 查看实时日志

systemctl status ping_pong 应显示active (running)
也可以用sudo ss -lntp | grep 8080查看8080端口占用情况,确定API进程正在监听8080端口

Step3 设置反向代理

这里使用阿里云+宝塔面板+Nginx

  1. 添加DNS解析
    为主域名 yourdomain.com 添加记录
    主机记录:api
    类型:A
    值:服务器公网IP
  2. 在宝塔面板添加站点
    域名:api.yourdomain.com
    根目录:/www/wwwroot/api.yourdomain.com
    PHP、数据库均不需要
  3. 配置反向代理
    宝塔面板中的站点设置→反向代理
    代理名称:任意
    目标URL:API在本地监听的端口,如 http://127.0.0.1:8080
    发送域名:$host
    注意:服务器安全组不需要放行该端口
    可以先用HTTP测试一下:curl -i http://api.yourdomain.com/ping
  4. 给子域名开HTTPS
    为子域名申请SSL协议,并开启强制HTTPS
  5. 最终测试
    在本地电脑运行curl -i https://api.yourdomain.com/ping

至此,API已经成功部署。

Step4 更新、维护API和添加API

状态:sudo systemctl status ping_pong

重启:sudo systemctl restart ping_pong

日志:journalctl -u ping_pong -f

更新API:

在服务器上编译:

cd /www/api/ping_pong
git pull
go build -o ping_pong main.go
sudo systemctl restart ping_pong
journalctl -u ping_pong -n 50 --no-pager

在本地编译并上传服务器后:

sudo systemctl restart ping_pong
journalctl -u ping_pong -n 50 --no-pager

新增API:

  1. 将可执行文件放到合适位置
  2. 为新增的API创建.service文件并设置、启动、测试
  3. 在宝塔面板的子域名处添加反向代理
文章标题:将API部署到云服务器
作者:Misaka10233
本文链接:https://www.misaka10233.com/2026/01/23/%e5%b0%86api%e9%83%a8%e7%bd%b2%e5%88%b0%e4%ba%91%e6%9c%8d%e5%8a%a1%e5%99%a8/

评论

  1. 小汐
    3 月前
    2026-1-23 22:52:00

    すごいですね!o(////▽////)q楼主文章数破百要记得发女装哦ヾ(≧∇≦*)ゝ

    • 博主
      小汐
      3 月前
      2026-1-23 22:59:58

      我可没说过要

      • 小汐
        Misaka10233
        3 月前
        2026-1-28 20:18:39

        为什么要说这种话…🥺

  2. konging
    2 月前
    2026-2-27 13:36:40

    すごいですね!o(////▽////)q楼主文章数破百要记得发女装哦ヾ(≧∇≦*)ゝ

  3. 夏大山
    2 月前
    2026-2-27 13:38:17

    大战火山

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇