惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
CERT Recently Published Vulnerability Notes
D
Docker
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
博客园_首页
H
Help Net Security
T
The Exploit Database - CXSecurity.com
Microsoft Security Blog
Microsoft Security Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Privacy & Cybersecurity Law Blog
AWS News Blog
AWS News Blog
Spread Privacy
Spread Privacy
F
Full Disclosure
Blog — PlanetScale
Blog — PlanetScale
Y
Y Combinator Blog
V
Vulnerabilities – Threatpost
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
aimingoo的专栏
aimingoo的专栏
Simon Willison's Weblog
Simon Willison's Weblog
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
S
Security Affairs
T
Tailwind CSS Blog
T
Tor Project blog
W
WeLiveSecurity
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
The Hacker News
The Hacker News
腾讯CDC
M
MIT News - Artificial intelligence
D
DataBreaches.Net
量子位
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
I
InfoQ
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
O
OpenAI News
美团技术团队
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
A
About on SuperTechFans

博客园 - 一名程序媛呀

Anki插件开发必知必会:钩子函数与右键菜单定制 httpx 传参总报错?这次把 GET、POST、文件上传到响应处理的坑给你一次填平 从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战) 还在 XHR、Fetch 和 Axios 之间纠结?我踩过的坑,希望你一个都不用碰到 你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南 Uvicorn、Gunicorn 傻傻分不清?FastAPI 生产部署避坑指南 Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招! 刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API 别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了 掏出手机就能搭个 WebDAV 同步服务器?这操作有点香 别只盯着GitBook了!这个文档神器让你的笔记秒变网站 写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了 FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好 旧手机别扔!用 Termux 搭个私人云盘,比网盘香多了 写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了 前端包管理咋选?我从npm叛逃到pnpm的血泪史(附避坑指南) 聊聊 fetch 使用中我踩过的那些坑和正确打开方式 FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示? 给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍 我用了FastApiAdmin后,连夜把踩过的坑都整理出来了 告别 Typora 后的新欢:我把所有笔记迁移到了 Obsidian 这个“第二大脑” 你的Agent API还在裸奔?从认证到沙箱,我用FastAPI搭了几道防线 让 FastAPI Agent 思考不阻塞:手把手教你实现异步任务与后台处理方案 让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践 FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“ 初探:用 FastAPI 搭建你的第一个 AI Agent 接口 FastAPI 少有人提的实用技巧:把 Depends 依赖提到路由层,代码少写60% FastAPI 生产环境静态文件完全指南:从 /favicon.ico 404 到 HSTS 混合内容,一次全根治 用了loguru我才明白,Python日志还能这么写 FastAPI 后台任务:BackgroundTasks 的使用场景与注意事项 FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚 FastAPI 文件上传避坑全指南:分块存盘、类型校验与安全兜底 FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上 FastAPI + SQLAlchemy 2.0 通用CRUD操作手册 —— 从同步到异步,一次讲透 FastAPI订单防超卖实战:从数据库锁到Saga分布式事务,这一篇给你理清了 FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了! FastAPI服务半夜又挂了?先别急着重启,查查你的数据库连接池“池子”是不是漏了 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 Vue 3 组合式 API 香是香,但从Vue2迁移时你可别像我当初一样踩进这 3 个深坑里 我用fastapi-scaff搭了个项目,两天工期缩到两小时,老板以为我开挂了 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! FastAPI自动生成的API文档太丑?我花了一晚上把它改成了客户愿意付费的样子 告别手写 API 胶水代码:FastAPI 与 Vue 的“契约自动机” OpenAPI 实战 FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南” FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案 FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了! FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍 FastAPI子应用挂载:别再让root_path坑你一夜 FastAPI项目半夜报警吵醒你?聊聊告警这事儿怎么搞! 别再数据线了!用FastAPI 5分钟搭个局域网文件+剪贴板神器 FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香! FastAPI状态共享秘籍:别再让中间件、依赖和路由“各自为政”了! FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了! 从0到1,FastAPI + PostgreSQL + Tortoise ORM 实战避坑指南 FastAPI + PostgreSQL 实战:给应用装上“缓存”和“日志”翅膀 FastAPI + PostgreSQL 实战:从入门到不踩坑,一次讲透
你的FastAPI又在服务器上“跑不起来”了?来,今天咱把打包这件事彻底聊透
一名程序媛呀 · 2026-06-04 · via 博客园 - 一名程序媛呀

👩‍💻我是爱折腾的一名程序媛,喜欢研究全栈开发的各种实践,热爱分享踩坑后的收获与思考,也享受用代码写出各种实用小工具解决问题的快乐。

如果你也在技术这条路上向前走,关注我,愿我们能彼此陪伴,一起成为更好的自己 🌱

还在为FastAPI打包后各种报错抓狂?本文不讲虚的,用最接地气的方式对比Linux和Windows下三种主流打包部署方式,从PyInstaller的各种坑到Docker的一键起飞,手把手教你如何根据场景选择,附上保姆级实操命令,让你的服务“稳如老狗”。

是不是满怀信心地在本地把FastAPI调通了,一丢到服务器上就各种“ModuleNotFoundError”?或者在不同系统之间迁移的时候,环境配置到让你怀疑人生?

这种感觉我太懂了。前阵子我需要在Windows Server上部署一套FastAPI服务给内部用,公司内网环境不能联网装Docker。
我当时就心想:“这有啥难,PyInstaller一把梭哈不就行了?”结果,就光一个uvicorn的子进程管理问题,折腾了我整整一个下午。

所以今天,咱不聊花里胡哨的架构,就专门搞定一件事:怎么把你的FastAPI程序,安安稳稳地在Linux和Windows上跑起来。

📦 咱们先盘盘,你面前有哪几条路?

好,咱们先来把市面上最主流的三种打法捋一遍。你可以把打包理解成“搬家”:

🔹 方式一:PyInstaller (粗暴打包流)

🔸 比喻: 把整个家当塞进一个集装箱里,拖到地方直接开箱。

🔸 优点: 一个文件夹走天下,不需要目标机器装Python。
🔸 痛点: 极其容易漏掉隐式依赖,踩坑率极高。

🔹 方式二:虚拟环境 + 源码拷贝 (原生依赖流)

🔸 比喻: 只搬家具过去,到了新家再按照清单(requirements.txt)现买锅碗瓢盆。

🔸 优点: 最稳,体积小,兼容性最好。
🔸 痛点: 目标机器必须有Python环境。

🔹 方式三:Docker 容器化 (拎包入住流)

🔸 比喻: 直接把整个旧房间的布局和家具克隆过去,连墙纸都一样。

🔸 优点: 环境完全隔离,Linux下部署的首选方案。
🔸 痛点: Windows下依赖虚拟化,有点重,且图形化交互麻烦。

🐧 Linux 环境下:听我一句劝,别折腾,直接容器化

在Linux下,真的,信我,无脑选 Docker。你别看PyInstaller能打包成单个文件很诱人,但在Linux生态里,那真是自找麻烦。

🐳 Docker 实操:把大象装进冰箱分三步

第一步:编写 Dockerfile

别一上来就找网上的烂大街模板。这里有一点要特别注意,requirements.txt 里千万别忘了写死 uvicorn[standard],否则进容器跑起来你会发现性能怎么这么拉胯,就是因为缺了那几个 C 扩展。

# 用slim镜像,体积小,安全漏洞少

FROM python:3.14-slim-bookworm

WORKDIR /app

# 先复制依赖文件,利用Docker缓存层,不用每次都重装

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

# 再把代码丢进去

COPY . .

# 重点:用字符串形式启动,不然信号传递会有问题

CMD ["uvicorn""main:app""--host""0.0.0.0""--port""80"]

第二步:构建并运行

你说“这命令我都会,有啥好讲的?”
嘿,还真有。挂载卷的时候,尽量用绝对路径。特别是配合一些CI/CD工具时,相对路径经常导致挂载了个寂寞。

docker build -t my-fastapi-app .

docker run -d -p 8080:80 --name my-app my-fastapi-app

第三步:善用 docker-compose

如果涉及数据库或者Redis,别用那个长长的 docker run 指令了,维护性太差。写个 docker-compose.yml,谁看了不夸一句清爽?

💠 Windows 环境下:在现实的泥潭里优雅地扑腾

Windows 服务器往往是企业内网的“硬骨头”。不能装 Docker Desktop(因为要开Hyper-V,很多虚机不支持),甚至不给装 Python。

这时候,PyInstaller 硬着头皮也得上,但我带你避开那些巨坑。

🔨 PyInstaller 避坑指南

官方文档虽然没写那么细,但根据以往的经验,你绝对不能直接 pyinstaller main.py,这么做生成的包,要么启动闪退,要么找不到 uvicorn 的二进制依赖。

正确姿势:使用 Spec 文件进行精细化控制。

第一步:生成 Spec 文件

pyinstaller --name myapp --onedir main.py

# 注意:是 --onedir 不是 --onefile

为什么不用 --onefile
因为单文件运行时每次都要解压到临时目录,对于 FastAPI 这种需要频繁 IO 的子进程应用,启动慢不说,杀毒软件还经常误以为你是病毒给拦下来,血泪教训。

第二步:修改 myapp.spec 文件

这个步骤最考验耐心。咱们要手动把隐式依赖揪出来。

# -*- mode: python ; coding: utf-8 -*-

a = Analysis(

    ['main.py'],

    pathex=[],

    binaries=[],

    # 重点来了:这里要补上 uvicorn 的隐式依赖

    hiddenimports=[

        'uvicorn.logging',

        'uvicorn.loops.auto',

        'uvicorn.protocols.http.auto',

        'fastapi.encoders',

    ],

    ...

)

pyz = PYZ(a.pure)

exe = EXE(pyz, ...)

第三步:重新打包

pyinstaller myapp.spec

打包完后,去 dist/myapp 目录下找你的 myapp.exe,把它和整个文件夹一起拷走。

🐍 原生环境 + NSSM

如果你能装 Python,那我就更推荐你用原生环境 + NSSM (Non-Sucking Service Manager) 把 FastAPI 注册成 Windows 服务。

是不是以为刚才 Docker 那种跑法就够稳了?
在 Windows 生产环境里,你如果只是双击 exe 或者开个 CMD 窗口,万一谁手贱把窗口关了,服务就挂了。这时候就该 NSSM 出场了:

nssm install MyFastAPI "C:\Python311\Scripts\uvicorn.exe"

nssm set MyFastAPI AppParameters "main:app --host 0.0.0.0 --port 8080"

nssm start MyFastAPI

这样它就在后台像个小强一样顽强地活着,崩溃了还能自动重启。

🤔 最后的抉择:我该怎么选?

说到这里,咱们来划个重点。选择恐惧症的同学看这里:

🔹 场景A:我有 Linux 服务器,能联网。

🔸 冲 Docker。
别想了,这是工程上的最佳实践。

🔹 场景B:我有 Linux 服务器,但完全离线(涉密内网)。

🔸 用 Docker save/load。

先在有网机器上 docker save -o app.tar my-app:latest
然后U盘拷过去 docker load -i app.tar
这也比 PyInstaller 香得多。

🔹 场景C:Windows 服务器,不能装 Python,不能开虚拟机。

🔸 上 PyInstaller。
记住我踩的坑,去改 Spec 文件,用 --onedir 模式。

🔹 场景D:Windows 服务器,能装 Python,想当服务跑。

🔸 NSSM + 虚拟环境。
这是 Windows 下最接近“优雅”二字的方案了。


其实工具的选择就是这么个理儿:没有银弹,只有场景适配。
不要为了炫技去用 Docker,也不要因为怕麻烦就在 Windows 下死磕 PyInstaller。

好了,今天掏心窝子分享的这些打包部署的野路子,希望能帮你把那句“我在我电脑上是好的啊”这口锅彻底甩掉。
如果这篇文章让你少踩了几个坑,记得点赞、收藏、加关注三连走起!毕竟,不知道哪天又会被哪个刁钻的客户环境给困住,到时候可别找不到我的人。🎯

你在部署 FastAPI 时,被哪个报错折磨得最久?评论区里晒出来,说不定我能给你支个奇奇怪怪的招儿。