使用Supervisor+Nginx部署Go API

这篇文章中,我将向您展示如何使用 Supervisor 部署一个简单的 Go API 来管理该进程,并使用 Nginx 作为 Web 服务器为其提供服务。

在深入部署步骤之前,让我们简单讨论一下为什么使用 Supervisor 和 Nginx。

  • Supervisor 是一个进程控制系统,可帮助管理和监控在后台运行的应用程序。它可确保您的 Go API 保持运行,并在崩溃时自动重新启动。查看完整文档
  • Nginx 是一款高性能 Web 服务器,也可以用作反向代理,非常适合将我们的 Go API 提供给互联网。查看完整文档

为什么选择 Supervisor 而不是其他选项?
您可能想知道为什么我们使用 Supervisor 而不选择Systemd、Docker等容器化解决方案。

Supervisor:

  • 设置简单,非常适合管理多个进程,轻松进行日志管理
  • 需要手动配置

Systemd:

  • 原生Linux,启动速度更快设置
  • 更复杂,调试更困难

Docker:

  • 隔离环境,易于部署,可扩展
  • 更多设置开销,需要容器知识

何时应使用 Supervisor?
当您想要一种简单、非容器化的方式来管理 Go 服务时,请使用 Supervisor,它具有自动重启和日志管理等功能,无需处理 systemd 的复杂性或 Docker 的额外开销。


设置并运行简单的 Go API
要求
开始之前,请确保您的系统上安装了以下软件:
1、Go

$ go version

go version go1.24.0 linux/amd64

2、Supervisor

Ubuntu/Debian:
$ sudo apt update
$ sudo apt install supervisor -y

CentOS/RHEL:
$ sudo yum install supervisor -y

Homebrew(macOS)
$ brew install supervisor

安装后,检查 Supervisor 是否正在运行:

$ sudo systemctl status supervisor

如果它没有运行,请启动并启用它:

$ sudo systemctl start supervisor
$ sudo systemctl enable supervisor

3、Nginx

初始化一个新的 Go 项目
首先,为项目创建一个新目录并初始化一个 Go 模块:

$ cd /var/www/
$ mkdir go-api && cd go-api
$ go mod init example.com/go-api

此命令创建一个名为的 Go 模块example.com/go-api,用于管理依赖项。

创建一个简单的 API
现在,创建一个新文件main.go并添加以下代码:

$ vim main.go

package main

import (
        "fmt"
        "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "text/plain")
        fmt.Fprintln(w, "Simple Go API")
}

func main() {
        http.HandleFunc("/", handler)
        fmt.Println("Server started at :8080")
        http.ListenAndServe(":8080", nil)
}

编译并运行 Go 服务器:

$ go run main.go

如果成功,您应该在终端中看到此消息:

Server started at :8080

现在使用以下命令测试 API curl:

$ curl localhost:8080
Simple Go API


使用 Supervisor 将 API 作为后台服务运行
为 Go API 创建 Supervisor 配置
创建一个新的 Supervisor 配置文件:

$ sudo vim /etc/supervisor/conf.d/go-api.conf

添加以下配置:

[program:go-api]
process_name=%(program_name)s_%(process_num)02d
directory=/var/www/go-api
command=bash -c 'cd /var/www/go-api && ./main'
autostart=true
autorestart=true
user=www-data
redirect_stderr=true
stderr_logfile=/var/log/go-api.err.log
stdout_logfile=/var/log/go-api.out.log

解释

  • directory=/var/www/simple-go-api→ Go API 的工作目录。
  • command=bash -c 'cd /var/www/simple-go-api && ./main'→ 运行 API。
  • autostart=true→ 系统启动时自动启动。
  • autorestart=true→ 如果进程崩溃则重新启动。
  • user=www-data→ 以 www-data 用户身份运行(根据需要调整)。
  • redirect_stderr=true→ 将错误日志重定向到 stdout。
  • stdout_logfile=/var/log/api/simple-go-api.out.log→ 标准输出日志文件。
  • stderr_logfile=/var/log/api/simple-go-api.err.log→ 错误日志文件。

现在,我们需要构建 Go API:

go build -o main .

确保目录和二进制文件具有正确的权限:

sudo chown -R www-data:www-data /var/www/go-api
sudo chmod 775 /var/www/go-api/main

应用 Supervisor 配置
重新加载 Supervisor 并启动服务:

$ sudo supervisorctl reread
$ sudo supervisorctl update
$ sudo supervisorctl start go-api:*

检查服务状态:

$ sudo supervisorctl avail
go-api:go-api_00                 in use    auto      999:999
$ sudo supervisorctl status go-api:*

go-api:go-api_00                 RUNNING   pid 198867, uptime 0:01:52


检查日志和调试
如果 API 没有运行,请检查日志:

cat /var/log/go-api.out.log
cat /var/log/go-api.err.log

或者使用 Supervisor 的内置日志查看器:

$ sudo supervisorctl tail -f go-api:go-api_00

==> Press Ctrl-C to exit <==
Server started at :8080

将 Nginx 设置为 API 的反向代理
创建新的配置文件:
$ sudo vim /etc/nginx/sites-available/go-api

server {
    server_name _;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
    }

    error_log /var/log/nginx/go-api_error.log;
    access_log /var/log/nginx/go-api_access.log;
}

创建符号链接以启用该站点:

$ sudo ln -s /etc/nginx/sites-available/go-api /etc/nginx/sites-enabled/

测试配置:

$ nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果测试成功,重启Nginx:

$ sudo systemctl restart nginx

现在,您可以使用以下方式访问您的 Go API:

本地主机(如果在本地运行)
curl http://localhost

curl http://YOUR_SERVER_IP

注意:如果您想使用自定义域而不是 IP 地址访问 Go API,则需要购买域名、配置其 DNS 以指向服务器的 IP,并相应地更新 Nginx 配置。为了获得更好的安全性,建议使用 Let's Encrypt 设置 HTTPS。

结论
在本指南中,我们使用 Supervisor 部署了一个简单的 Go API 来管理流程,确保自动重启和高效的请求处理,同时使用 Nginx 作为反向代理。感谢您的阅读,祝您部署顺利!