
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 run一条命令启动生产服务器、理解 ASGI 协议与 ASGI 服务器程序Uvicorn 等的角色、手动安装并直接运行 Uvicorn 的方式以及生产部署前必须权衡的六大 Deployment 概念。读完本文你将能够独立在任意一台服务器或容器中把 FastAPI 应用跑起来并能结合源码确认fastapi命令背后的实现与依赖关系。一、使用fastapi run命令启动服务器最直接的方式就是用fastapi run来运行你的 FastAPI 应用$ 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)在绝大多数场景下这一条命令就够了。 你可以在容器里、在服务器上、在 CI 的某个步骤中使用这个命令来启动你的FastAPI应用。从输出可以读出几个关键信息module/code/app三行CLI 先找到目标模块main.py再从中导入名为app的 FastAPI 对象最终使用导入字符串main:appserver两行服务器监听http://0.0.0.0:8000自动生成的交互式文档在http://0.0.0.0:8000/docs日志部分Uvicorn 完成了 ASGI 应用的生命周期启动Waiting for application startup.→Application startup complete.。注意Starting production server的提示fastapi run默认走的是生产模式不带--reload而开发时应使用fastapi dev。两者的对比在官方文档中有详细说明见 测试与部署相关章节 的导航。源码印证fastapi命令入口fastapi这个可执行命令由当前仓库的打包配置注册。在 pyproject.toml 中[project.scripts] fastapi fastapi.cli:main它指向 fastapi/cli.py 中的main()。这个文件的实现非常简短fastapi/cli.pytry: from fastapi_cli.cli import main as cli_main except ImportError: # pragma: no cover cli_main None # type: ignore # ty: ignore[unused-ignore-comment] def main() - None: if not cli_main: # type: ignore[truthy-function] message To use the fastapi command, please install fastapi[standard]:\n\n\tpip install fastapi[standard]\n print(message) raise RuntimeError(message) # noqa: B904 cli_main()可以读出两点事实核心 CLI 逻辑不在本仓库而在独立的fastapi-cli包中。FastAPI 仓库只保留一个薄薄的转发层把run、dev等子命令委托给fastapi_cli.cli.main如果未安装fastapi-cli例如只装了 FastAPI 本体fastapi命令会打印安装提示并抛出RuntimeError提示执行pip install fastapi[standard]。而 tests/test_fastapi_cli.py 中恰好覆盖了这两条路径test_fastapi_cli验证python -m fastapi dev对不存在文件会报错Path does not exist non_existent_file.pytest_fastapi_cli_not_installed验证缺失fastapi-cli时抛出包含To use the fastapi command, please install的异常。二、ASGI 服务器理解底层协议接下来深入一点细节。FastAPI 采用一个用于构建 Python Web 框架和服务器的标准称为ASGIAsynchronous Server Gateway Interface异步服务器网关接口。FastAPI 本身就是一个 ASGI Web 框架——你的应用代码FastAPI()实例并不直接处理网络 IO而是通过 ASGI 接口被一个具体的ASGI 服务器程序如Uvicorn加载运行。要在远程服务器上运行一个FastAPI应用或任何 ASGI 应用你需要一个 ASGI 服务器程序fastapi命令内置使用的是 Uvicorn。仓库中还有其他可选的 ASGI 服务器Uvicorn高性能 ASGI 服务器fastapi run的默认选择Hypercorn兼容 HTTP/2 与 Trio 的 ASGI 服务器Daphne为 Django Channels 开发的 ASGI 服务器Granian面向 Python 应用的 Rust HTTP 服务器。具体项目里用哪一个取决于你的需求协议支持、生态、性能特征等后文的安装与运行流程对任意 ASGI 服务器都类似细节以各服务器自己的文档为准。三、术语辨析服务器机器 vs 服务器程序文档特别提醒一个容易混淆的命名细节。单词“Server服务器”经常被用来同时指代两样东西概念通常含义常见别名例子服务器机器远程/云端的计算机物理机或虚拟机服务器、机器、VM虚拟机、节点一台 Linux 云主机服务器程序跑在那台机器上的程序—Uvicorn、Hypercorn在大多数语境下“服务器”指的是“某台运行着你程序的远程计算机通常是 Linux”而 Uvicorn 这类程序是跑在上面的“服务器程序”。理解这个区分后阅读后续 Deployment 概念进程、Worker、内存时会顺很多。四、手动安装 ASGI 服务器程序安装 FastAPI 时standard额外依赖里已经带上了生产服务器 Uvicorn你可以直接通过fastapi run启动它。但也可以手动安装一个 ASGI 服务器程序以获得更精细的控制。例如安装 Uvicorn$ uv add uvicorn[standard] --- 100%其他 ASGI 服务器程序的安装流程与之类似。Tip加上[standard]后缀Uvicorn 会安装并使用一组推荐附加依赖其中包括uvloop——asyncio的高性能 Drop-in 替代品能带来显著的并发性能提升。这一点可以直接在仓库的依赖声明中得到印证。pyproject.toml 中standard额外依赖包含standard [ fastapi-cli[standard] 0.0.32, fastar 0.9.0, # For the test client httpx 0.23.0,1.0.0, # For templates jinja2 3.1.5, # For forms and file uploads python-multipart 0.0.18, # To validate email fields email-validator 2.0.0, # Uvicorn with uvloop uvicorn[standard] 0.12.0, # # Settings management pydantic-settings 2.0.0, # # Extra Pydantic data types pydantic-extra-types 2.0.0, ]也就是说如果你用uv add fastapi[standard]安装 FastAPIuvicorn[standard]含uvloop已经随包就位无需再单独安装。而 FastAPI 的核心依赖pyproject.toml只有starlette、pydantic、typing-extensions、typing-inspection、annotated-doc——服务器程序不属于核心依赖这正是“手动安装 ASGI 服务器”这一节存在的原因。五、手动运行 ASGI 服务器程序手动安装了 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)Noteuvicorn main:app中——main指main.py这个 Python“模块”文件app指在main.py里通过app FastAPI()创建的那个对象。它等价于from main import app这里引用的main.py就是官方“First Steps”示例docs_src/first_steps/tutorial001_py310.py里的最小应用from fastapi import FastAPI app FastAPI() app.get(/) async def root(): return {message: Hello World}常用参数速查参数说明main:app导入字符串模块名:对象名等价于from main import app--host 0.0.0.0监听所有网络接口对外提供服务必须用0.0.0.0而非127.0.0.1--port 80监听端口示例直接用 80 是因为在容器/服务器里由它作为最终入口实际裸机部署通常还会在前面加一层反向代理WarningUvicorn 等服务器支持--reload选项在开发期很有用但它消耗更多资源、稳定性也更差。不要在生产环境中使用--reload。其他 ASGI 服务器程序都有类似的运行命令可在各自文档中查阅。六、Deployment 概念清单单进程启动之后的事以上示例都是让服务器程序如 Uvicorn以单个进程运行监听所有 IP0.0.0.0上的某个预定义端口如80。这是最基本的形态。但在真正的生产环境中通常还需要处理下面这些概念安全 – HTTPS开机自启Beim Hochfahren ausführen自动重启Neustarts复制/Replikation同时运行的进程数内存启动前的前置步骤如数据库迁移。这些概念与具体的服务器程序无关而是对任何 Web API 都成立的运维问题。仓库中的后续章节逐一给出具体策略可按此路线深入主题文档HTTPS / TLS 终结docs/de/docs/deployment/https.md完整概念与示例工具Traefik、Caddy、Systemd、Docker 等docs/de/docs/deployment/concepts.md用--workers启动多个 Uvicorn Worker 进程docs/de/docs/deployment/server-workers.mdDocker 容器化部署docs/de/docs/deployment/docker.md云端部署docs/de/docs/deployment/cloud.md版本管理与依赖锁定docs/de/docs/deployment/versions.md上图来自 Deployment 概念章节一个操作系统里可以同时运行同一程序的多个进程——这是理解 Worker 复制的基础。在概念层面与本文最直接相关的两点是详见 docs/de/docs/deployment/concepts.md一个端口只能被一个进程监听因此“多进程”方案中必须有一个进程管理器独占该 IP端口再把请求分发给各 WorkerUvicorn 的--workers模式正是“一个 Uvicorn 父进程监听端口、拉起多个 Uvicorn Worker 进程”的结构。server-workers 章节 给出了fastapi run --workers 4 main.py与uv run uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4两种写法及对应日志内存按进程独立占用多个进程通常不共享内存。如果代码加载了一个 1 GB 的模型4 个 Worker 就会占用约 4 GB RAM——规划 Worker 数量时必须把“每个进程的内存足迹 × 进程数”算进服务器容量。七、小结一条命令到一套生产策略把本文的主线串起来fastapi run main.py是默认推荐的生产启动方式它经由 pyproject.toml 注册的入口转发到fastapi-cli包自动发现main:app并启动 Uvicorn监听0.0.0.0:8000见 fastapi/cli.py 与 tests/test_fastapi_cli.pyFastAPI 是 ASGI 框架任何 ASGI 服务器Uvicorn、Hypercorn、Daphne、Granian都可以承载它fastapi[standard]已含uvicorn[standard]带uvloop性能优化也可以uv add uvicorn[standard]手动安装手动运行 Uvicorn 时使用导入字符串main:app等价于from main import app配合--host 0.0.0.0与--port指定监听地址生产环境禁用--reload单进程启动只是起点HTTPS、开机自启、自动重启、进程复制、内存与启动前步骤这六类 Deployment 概念需要组合后续章节的策略--workers、Docker、反向代理、Systemd 等来完整解决。掌握这条从“一条命令”到“一套策略”的路径就能在任何服务器或容器环境中把 FastAPI 应用稳定地部署上线。【免费下载链接】fastapiFastAPI framework, high performance, easy to learn, fast to code, ready for production项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考