跳过正文
Background Image

后端部署第二步:本地到公网——如何使用 Nginx 发布 FastAPI 服务

Abanana
作者
Abanana
目录

后端部署第二步:本地到公网——如何使用 Nginx 发布 FastAPI 服务
#

在当今的开发环境中,快速构建和部署后端服务变得至关重要。FastAPI 作为一个高性能、现代化的 Python 异步 Web 框架,广受开发者喜爱。而 Nginx 则是部署 Web 应用最常见也是最稳定的解决方案之一。

本文将手把手带你完成如下目标:

  • 启动一个最小 FastAPI 应用;
  • 使用 Nginx 把服务代理到 80 端口;
  • 实现通过公网 IP 或域名访问服务。

不需要复杂的设置,只需几个步骤,就能让你的本地服务走向世界。


前提条件
#

请确保你已经具备以下环境:

  • 一台可以访问公网的 Linux 服务器或云主机(如 AWS EC2、腾讯云、阿里云等);
  • 已安装 Python 3.7+;
  • 已安装 Nginx;
  • 有一些基本的 Linux 操作经验。

如果你准备好了,就让我们开始吧!


第一步:创建并启动一个最小 FastAPI 后端服务
#

首先,我们搭建一个最小可运行的 FastAPI 应用。建议使用 Python 虚拟环境:

# 安装依赖
sudo apt update
sudo apt install python3-pip -y
pip3 install fastapi uvicorn

接着,创建一个名为 main.py 的文件,内容如下:

# main.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello from FastAPI via Nginx!"}

使用 Uvicorn 启动服务:

uvicorn main:app --host 0.0.0.0 --port 8000

此时你已经可以通过 http://<你的服务器IP>:8000 在浏览器中访问这个返回 JSON 的接口。


第二步:安装并配置 Nginx
#

如果还未安装 Nginx,请先执行以下命令安装:

sudo apt install nginx -y

确保 Nginx 正常运行:

sudo systemctl start nginx
sudo systemctl enable nginx

第三步:配置 Nginx 作反向代理
#

我们需要编辑 Nginx 配置文件,将来自公网 80 端口的请求转发到本地的 8000 端口。

新建一个配置文件(或编辑默认配置):

sudo nano /etc/nginx/sites-available/fastapi

请输入以下内容:

server {
    listen 80;
    server_name your_domain_or_ip;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

替换 your_domain_or_ip 为你的实际公网 IP(如 123.456.78.9)或绑定的域名(如 api.example.com)。

接下来,启用该配置:

sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/
sudo nginx -t  # 检查配置是否正确
sudo systemctl reload nginx

第四步:在防火墙中开放 80 端口(如有)
#

如果你启用了防火墙(如 UFW),确保端口 80 是开放的:

sudo ufw allow 80

第五步:测试访问
#

现在,一切已准备就绪:

  • 浏览器访问:http://your_domain_or_ip/
    • 示例:http://123.456.78.9/
  • 你应能看到如下 JSON 输出:
{"message": "Hello from FastAPI via Nginx!"}

恭喜你!你的 FastAPI 服务已经可以通过公网访问了!


第六步:使用 systemd 管理 FastAPI 服务(推荐)
#

虽然我们可以用 uvicorn 手动在终端启动 FastAPI 服务,但这种方式有两个明显的问题:

  1. 当 SSH 会话断开时,uvicorn 会关闭;
  2. 服务无法随系统开机自动启动;

为了让 FastAPI 稳定运行在后台并具备开机自启功能,我们推荐使用 systemd 进行进程管理。

接下来,我们将创建一个 systemd 单元文件来管理 FastAPI 服务。


6.1 创建 FastAPI systemd 服务文件
#

假设你的主机上 FastAPI 项目的路径为 /home/ubuntu/fastapi-app,并在该目录下有一个 main.py 文件。

以下步骤以 ubuntu 用户为例:

  1. 编辑 systemd 服务文件:
sudo nano /etc/systemd/system/fastapi.service
  1. 在文件中填写以下内容:
[Unit]
Description=FastAPI Application with Uvicorn
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/fastapi-app
ExecStart=/usr/bin/python3 -m uvicorn main:app --host 0.0.0.0 --port 8000
Restart=always
RestartSec=3
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

请根据你的实际路径和运行用户进行调整:

  • WorkingDirectory 指向你的 FastAPI 应用目录;
  • ExecStart 中使用的 python3 和运行参数视你的环境而定;
  • 如果你使用虚拟环境,请指定对应虚拟环境下的 python 路径,比如:
ExecStart=/home/ubuntu/fastapi-venv/bin/python -m uvicorn main:app --host 0.0.0.0 --port 8000

6.2 启用并启动服务
#

创建完文件后,执行以下命令:

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable fastapi
sudo systemctl start fastapi

现在你的服务已经注册为系统服务并自动启动了!


6.3 查看服务状态
#

使用以下命令查看运行状态:

sudo systemctl status fastapi

你应看到如下类似输出:

● fastapi.service - FastAPI Application with Uvicorn
   Loaded: loaded (/etc/systemd/system/fastapi.service; enabled)
   Active: active (running) since ...
   ...

6.4 查看输出日志(可选)
#

你可以使用 journalctl 查看程序输出日志:

sudo journalctl -u fastapi -f

这将实时跟踪 FastAPI 服务的日志输出,方便调试请求和错误信息。


6.5 重启与停止服务
#

重启服务:

sudo systemctl restart fastapi

停止服务:

sudo systemctl stop fastapi

为什么使用 systemd?
#

使用 systemd 管理服务的几大益处:

  • 稳定:系统守护进程会在服务崩溃时自动重启;
  • 安全:服务以特定用户运行,避免 root 权限;
  • 开机自启:确保服务器重启后服务仍能使用;
  • 日志集中:方便使用 journalctl 跟踪日志和排错。

这是部署生产环境服务最推荐的方式之一。

借助 systemd 配置,FastAPI 服务变成了一个真正的系统级网络服务。你无需手动启动,也不怕 SSH 会话断开。真正实现了后端“后台运行、永不掉线”的目标。


常见问题排查
#

  • 无法访问服务?
    • 检查是否正在运行 uvicorn
    • Nginx 是否启用正确配置并重新加载;
    • 防火墙是否允许 80 端口;
    • 是否将域名正确地解析到了服务器 IP。

相关文章

后端部署第一步:Nginx 发布服务前的万全准备
·1594 字·4 分钟
后端部署第一步:Nginx 发布服务前的准备工作 # 你是不是刚刚用 Java、Python 或 Go 写出了第一个后端程序?它在本地跑得飞快,通过 localhost:8080 就能访问,功能也都挺顺畅。接下来,自然而然会冒出一个念头:“我要怎样才能让别人也能访问到它?”
Fast-dLLM:通过KV Cache和并行Decoding加速dLLM
·2003 字·4 分钟
Fast-dLLM:通过 KV Cache 和并行 Decoding 加速 dLLM # Fast-dLLM: Training-free Acceleration of Diffusion LLM by Enabling KV Cache and Parallel Decoding
自信地深度思考
·2274 字·5 分钟
自信地深度思考 # DEEP THINK WITH CONFIDENCE
TriangleMix:无损且高效的用于预填充阶段的注意力模式
·2323 字·5 分钟
TriangleMix:无损且高效的用于预填充阶段的注意力模式 # TriangleMix: A Lossless and Efficient Attention Pattern for Long Context Prefilling
ASC:CoT压缩的激活引导 Training free
·1854 字·4 分钟
ASC:CoT 压缩的激活引导 Training free # Activation Steering for Chain-of-Thought Compression
SEAL:大语言模型的可操控推理 Traning Free
·2081 字·5 分钟
SEAL:大语言模型的可操控推理 Traning Free # SEAL: Steerable Reasoning Calibration of Large Language Models for Free
Hmm等Token影响模型推理能力
·2840 字·6 分钟
Hmm 等 Token 影响模型推理能力 # Demystifying Reasoning Dynamics with Mutual Information: Thinking Tokens are Information Peaks in LLM Reasoning
AdaCoT:通过强化学习实现的帕累托最优自适应链式思维触发器
·1472 字·3 分钟
AdaCoT:通过强化学习实现的帕累托最优自适应链式思维触发器 # AdaCoT: Pareto-Optimal Adaptive Chain-of-Thought Triggering via Reinforcement Learning
AdaptThink: 让模型决定是否思考
·1806 字·4 分钟
AdaptThink: 让模型决定是否思考 # AdaptThink: Reasoning Models Can Learn When to Think