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



すごいですね!o(////▽////)q楼主文章数破百要记得发女装哦ヾ(≧∇≦*)ゝ
我可没说过要
为什么要说这种话…🥺
すごいですね!o(////▽////)q楼主文章数破百要记得发女装哦ヾ(≧∇≦*)ゝ
大战火山