FastAPI 手动部署服务器实战:fastapi run 命令、ASGI 服务器与 Uvicorn 启动流程 FastAPI 手动部署服务器实战fastapi run 命令、ASGI 服务器与 Uvicorn 启动流程【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi本文围绕 FastAPI 官方文档「手动运行服务器」一章展开讲解如何在真实服务器、容器或远程机器上直接运行 FastAPI 应用从最省事的fastapi run命令到手动安装并启动 Uvicorn 等 ASGI 服务器程序的完整流程再到导入字符串import string、0.0.0.0监听、端口配置等关键细节。读完本篇你将能够独立在远程 Linux 机器上把 FastAPI 应用跑起来并理解每个参数背后的机制为后续 HTTPS、多进程、自动重启等生产级部署打下基础。用fastapi run命令一键启动生产服务器结论先行提供serveFastAPI 应用时直接使用fastapi run$ fastapi run main.py FastAPI Starting production server Searching for package file structure from directories with __init__.py files Importing from /home/user/code/awesomeapp module main.py code Importing the FastAPI app object from the module with the following code: from main import app app Using import string: main:app server Server started at http://0.0.0.0:8000 server Documentation at http://0.0.0.0:8000/docs Logs: INFO Started server process [2306215] INFO Waiting for application startup. INFO Application startup complete. INFO Uvicorn running on http://0.0.0.0:8000 (Press CTRLC to quit)这个命令在绝大多数场景下可以直接工作。 你可以用它把 FastAPI 应用跑在容器内、远程服务器里等各种地方。从启动日志可以读出fastapi run的完整工作链路这些细节对排查部署问题很有用包结构搜索CLI 会搜索带__init__.py文件的目录推断出应用的包文件结构并确定导入根目录如Importing from /home/user/code/awesomeapp模块定位解析你传入的main.py模块自动推导导入代码按from main import app的方式导入 FastAPI 应用对象也就是使用导入字符串main:app启动服务器默认监听http://0.0.0.0:8000所有网络接口、8000 端口交互式文档位于/docs路径。源码视角fastapi命令从哪里来在当前仓库中可以验证这个命令的挂载方式pyproject.toml 中定义了可执行入口[project.scripts]下fastapi fastapi.cli:main安装 fastapi 包后fastapi命令即可用fastapi/cli.py 的main()实际是薄封装它把调用委托给独立包fastapi-clifrom fastapi_cli.cli import main as cli_main如果未安装该包会抛出明确的错误信息提示执行pip install fastapi[standard]fastapi/main.py 同样调用这个入口因此python -m fastapi ...与fastapi ...等价tests/test_fastapi_cli.py 覆盖了两个边界情况传入不存在的文件python -m fastapi dev non_existent_file.py时返回非零退出码并提示Path does not exist以及 CLI 未安装时抛出带安装指引的RuntimeError。也就是说fastapi run只是把「定位包结构 推导导入字符串 调用 Uvicorn 启动生产服务器」这套流程封装成了单条命令。理解了这一点即使脱离 CLI你也能用裸的 Uvicorn 手动完成同样的事——这正是下一部分的内容。ASGI 服务器FastAPI 的运行时底座稍微深入一层FastAPI 使用的标准是ASGIAsynchronous Server Gateway Interface异步服务器网关接口它是 Python Web 框架与服务器之间的标准协议FastAPI 本身就是一个 ASGI Web 框架。要在远程服务器上运行 FastAPI 应用或任何 ASGI 应用核心需要的是一个ASGI 服务器程序最典型的就是Uvicorn——它也正是fastapi命令默认内置的那一个。此外还有若干替代选择Uvicorn高性能的 ASGI 服务器Hypercorn支持 HTTP/2 与 Trio 等特性的 ASGI 服务器Daphne为 Django Channels 打造的 ASGI 服务器Granian面向 Python 应用的 Rust 语言 HTTP 服务器。从源码结构看FastAPI 核心对 ASGI 实现没有任何私有绑定它依赖的 Starlette/ASGI 应用对象可以被任何符合 ASGI 规范的服务器加载这是上述多个服务器可以互换的根本原因。术语澄清「服务器机器」与「服务器程序」部署文档中有一个容易混淆的命名细节值得先厘清服务器server一词常被同时用于指代两类东西远程/云端的计算机物理或虚拟机以及运行在该机器上的程序例如 Uvicorn。当读到泛指的「服务器」时要意识到它可能指其中任意一个。指代远程机器时常见叫法还有machine机器、VM虚拟机、node节点它们通常都指一台运行 Linux、用来执行程序的真实远程机器。区分这两个概念是理解后续「安装」「启动」各步骤的前提我们安装和启动的始终是服务器程序而它运行在服务器机器上。手动安装服务器程序安装 FastAPI尤其是 standard 组合时已经自带了用于生产的 Uvicorn直接用fastapi run就能启动。但你也完全可以手动安装 ASGI 服务器。例如安装 Uvicorn$ uv add uvicorn[standard] --- 100%其他 ASGI 服务器程序的安装流程与此类似。/// 小贴士standard附加依赖extra会让 Uvicorn 安装并使用一批推荐的额外依赖其中最关键的是uvloop——asyncio的高性能直接替换件能带来显著的并发性能提升。如果你是通过uv add fastapi[standard]这种方式安装 FastAPI 的那么uvicorn[standard]已经一并包含在内无需重复安装。///这个说法可以直接在仓库中得到印证pyproject.toml 的[project.optional-dependencies]中standard组明确列出了fastapi-cli[standard] 0.0.32与uvicorn[standard] 0.12.0注释即「Uvicorn with uvloop」。因此「fastapi[standard]自带生产服务器」不是文档口头承诺而是打包配置里的硬事实。手动启动服务器程序导入字符串与 uvicorn 命令如果你手动安装了 ASGI 服务器通常需要传给它一个特殊格式的导入字符串import string让它知道去哪里导入你的 FastAPI 应用$ uv run uvicorn main:app --host 0.0.0.0 --port 80 INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRLC to quit)这条命令中各参数的含义参数含义main:app导入字符串从模块main导入对象app--host 0.0.0.0监听本机所有网络接口而非仅127.0.0.1外部客户端才能访问--port 80监听 80 端口HTTP 默认端口uv run在 uv 管理的虚拟环境中执行命令保证依赖隔离uvicorn main:app具体指什么main文件main.pyPython 的「模块」app在main.py中通过app FastAPI()这一行创建的对象。它与下面这行 Python 代码等价from main import app也就是说导入字符串模块名:对象名就是把「点号导入」翻译成了「冒号分隔的字符串形式」方便在命令行中传递。仓库中的入门示例 docs_src/first_steps/tutorial001_py310.py 展示了这个app对象的标准来源from fastapi import FastAPI app FastAPI()其他 ASGI 服务器程序也有类似的命令形式具体参数请查阅各自的文档。注意Uvicorn 等服务器都支持--reload选项它在开发期非常有用。但--reload会消耗更多资源、行为也更不稳定。开发时可以放心使用生产环境不应使用。从单进程到生产部署下一阶段的扩展概念上面的示例都是启动单个进程的服务器程序如 Uvicorn在预定义端口如80上监听所有 IP0.0.0.0。这是最基本的部署形态。但实际生产环境通常还需要处理以下问题安全性 — HTTPS通过外部 TLS 终结代理如 Traefik、Caddy、Nginx 等提供加密开机自启服务器重启后无需人工干预自动拉起应用进程Systemd、Docker、Supervisor 等;自动重启进程因崩溃挂掉后由外部组件负责重新拉起副本/多进程replication多个 worker 进程分摊请求同时注意每个进程的独立内存开销例如加载 1 GB 的模型、开 4 个 worker 就是 4 GB 内存内存管理按「worker 数 × 单进程内存」估算服务器 RAM 需求启动前置步骤如数据库迁移必须保证只由单个进程执行一次避免多 worker 并行执行造成冲突。这些问题属于部署策略层面的设计FastAPI 仓库的部署文档系列如 docs/en/docs/deployment/concepts.md 的部署概念详解以及 docs/en/docs/deployment/docker.md 的容器化方案对每一项都给出了具体的思路和工具选型本篇的日文版对应文件位于 docs/ja/docs/deployment/concepts.md。小结绝大多数场景直接用fastapi run main.py它会自动搜索包结构、推导main:app导入字符串并以 Uvicorn 启动生产服务器默认0.0.0.0:8000FastAPI 是 ASGI 框架可运行在 Uvicorn、Hypercorn、Daphne、Granian 等任意 ASGI 服务器上手动启动时用uv run uvicorn main:app --host 0.0.0.0 --port 80其中导入字符串等价于from main import appuv add uvicorn[standard]或fastapi[standard]会带来自含 uvloop 的高性能运行时--reload仅限开发期生产禁用单进程监听只是起点HTTPS、自启、重启、副本与内存是通往生产环境的下一组必修概念。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考