1 前言
1.1 Gunicorn 是什么?
Gunicorn(Green Unicorn)是一个 Python WSGI HTTP 服务器,用于生产环境运行 Python Web 应用(如 Flask、Django、FastAPI)。
特点:
- 支持多进程(worker)
- 支持日志、信号处理、守护进程等
- 稳定高效,广泛用于部署生产环境服务
1.2 uvicorn 是什么?
Uvicorn 是一个基于 uvloop
和 httptools
的 异步 ASGI 服务器,是 FastAPI 推荐的服务器。
- 支持异步请求处理
- 更适合现代异步框架(如 FastAPI、Starlette)
1.3 uvicorn启动方式 vs Gunicorn 启动
项目 |
uvicorn.run() 启动 |
gunicorn + UvicornWorker 启动 |
用途 |
本地开发、调试 |
生产部署 |
启动命令 |
uvicorn main:app --reload |
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker |
多进程 |
❌ 单进程 |
✅ 支持多 worker(并发更强) |
热重载 |
✅ 开发环境推荐 |
❌ 默认关闭,可结合其它方案 |
守护进程 |
❌ |
✅ 支持 --daemon 后台运行 |
日志管理 |
简单 |
更专业、更灵活 |
健壮性 |
异常自动退出 |
崩溃自动重启 worker,容错强 |
1.4 推荐使用方式
场景 |
推荐方式 |
本地开发 |
uvicorn main:app --reload |
生产部署 |
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker |
本地开发推荐启动程序代码块。
if __name__ == "__main__":
uvicorn.run(
app,
host="0.0.0.0",
port=Env().port,
timeout_keep_alive=300,
timeout_graceful_shutdown=60,
)
在生产部署中,gunicorn 启动方式更推荐通过配置文件启动。
1.5 Gunicorn 是如何支持 FastAPI 的?
Gunicorn 本身是 WSGI 服务器,而 FastAPI 是基于 ASGI 的。
因此我们使用:
gunicorn main:app -k uvicorn.workers.UvicornWorker
这里的 -k uvicorn.workers.UvicornWorker
就是使用 Uvicorn 作为 ASGI worker 适配器,让 Gunicorn 能运行 FastAPI。
2 FastAPI案例
main.py
from fastapi import FastAPI
from app.routes import router
app = FastAPI()
app.include_router(router)
routes.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/")
async def read_root():
return {"message": "Gunicorn案例测试"}
3 requirements.txt
依赖文件
fastapi
uvicorn[standard]
gunicorn
fastapi==0.115.5
uvicorn==0.32.1
gunicorn==23.0.0
4 命令启动参考
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
参数 |
说明 |
app.main:app |
指定 FastAPI 应用位置,模块路径:对象 格式 |
-w 4 |
启动 4 个 worker(根据 CPU 核数调整) |
-k uvicorn.workers.UvicornWorker |
使用 Uvicorn 的异步 worker |
--bind 0.0.0.0:8000 |
绑定端口和 IP 地址 |
5 通过配置文件启动
启动命令(可配合shell脚本进行一键启动)
gunicorn main:app -c gunicorn.conf.py
gunicorn.conf.py
bind = "0.0.0.0:8000"
workers = 4
worker_class = "uvicorn.workers.UvicornWorker"
loglevel = "info"
accesslog = "log/gunicorn_access.log"
errorlog = "log/gunicorn_error.log"
timeout = 60
pidfile = "gunicorn.pid"
daemon = True
shell脚本授权
chmod +x start.sh
./start.sh

6 docker配置
6.1 Dockerfile
# 基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 复制项目文件
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 启动命令
CMD ["gunicorn", "app.main:app", "-c", "gunicorn.conf.py"]
6.2 docker-compose.yml
version: "3"
services:
fastapi:
build: .
ports:
- "8000:8000"
restart: always
6.3 启动
6.3.1 构建镜像
docker build -t fastapi-app .
6.3.2 运行容器
docker run -d -p 8000:8000 --name fastapi-container fastapi-app
或者使用 docker-compose
:
docker-compose up -d
<h2><a id="1__0"></a>1 前言</h2>
<h3><a id="11_Gunicorn__2"></a>1.1 Gunicorn 是什么?</h3>
<p><strong>Gunicorn</strong>(Green Unicorn)是一个 <strong>Python WSGI HTTP 服务器</strong>,用于生产环境运行 Python Web 应用(如 Flask、Django、FastAPI)。</p>
<p>特点:</p>
<ul>
<li>支持多进程(worker)</li>
<li>支持日志、信号处理、守护进程等</li>
<li>稳定高效,广泛用于部署生产环境服务</li>
</ul>
<h3><a id="12_uvicorn__12"></a>1.2 uvicorn 是什么?</h3>
<p><strong>Uvicorn</strong> 是一个基于 <code>uvloop</code> 和 <code>httptools</code> 的 <strong>异步 ASGI 服务器</strong>,是 FastAPI 推荐的服务器。</p>
<ul>
<li>支持异步请求处理</li>
<li>更适合现代异步框架(如 FastAPI、Starlette)</li>
</ul>
<h3><a id="13_uvicorn_vs_Gunicorn__19"></a>1.3 uvicorn启动方式 vs Gunicorn 启动</h3>
<table>
<thead>
<tr>
<th>项目</th>
<th><code>uvicorn.run()</code> 启动</th>
<th><code>gunicorn</code> + <code>UvicornWorker</code> 启动</th>
</tr>
</thead>
<tbody>
<tr>
<td>用途</td>
<td>本地开发、调试</td>
<td>生产部署</td>
</tr>
<tr>
<td>启动命令</td>
<td><code>uvicorn main:app --reload</code></td>
<td><code>gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker</code></td>
</tr>
<tr>
<td>多进程</td>
<td>❌ 单进程</td>
<td>✅ 支持多 worker(并发更强)</td>
</tr>
<tr>
<td>热重载</td>
<td>✅ 开发环境推荐</td>
<td>❌ 默认关闭,可结合其它方案</td>
</tr>
<tr>
<td>守护进程</td>
<td>❌</td>
<td>✅ 支持 <code>--daemon</code> 后台运行</td>
</tr>
<tr>
<td>日志管理</td>
<td>简单</td>
<td>更专业、更灵活</td>
</tr>
<tr>
<td>健壮性</td>
<td>异常自动退出</td>
<td>崩溃自动重启 worker,容错强</td>
</tr>
</tbody>
</table>
<h3><a id="14__31"></a>1.4 推荐使用方式</h3>
<table>
<thead>
<tr>
<th>场景</th>
<th>推荐方式</th>
</tr>
</thead>
<tbody>
<tr>
<td>本地开发</td>
<td><code>uvicorn main:app --reload</code></td>
</tr>
<tr>
<td>生产部署</td>
<td><code>gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker</code></td>
</tr>
</tbody>
</table>
<p>本地开发推荐启动程序代码块。</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
<span class="hljs-comment"># uvicorn.run(app, host="0.0.0.0", port=8090)</span>
uvicorn.run(
app,
host=<span class="hljs-string">"0.0.0.0"</span>,
<span class="hljs-comment"># port=8090,</span>
port=Env().port,
timeout_keep_alive=<span class="hljs-number">300</span>, <span class="hljs-comment"># 设置长时间的保持活跃超时(秒)</span>
timeout_graceful_shutdown=<span class="hljs-number">60</span>, <span class="hljs-comment"># 设置优雅关闭的超时</span>
)
</code></div></pre>
<p>在生产部署中,gunicorn 启动方式更推荐通过配置文件启动。</p>
<h3><a id="15_Gunicorn__FastAPI__55"></a>1.5 Gunicorn 是如何支持 FastAPI 的?</h3>
<p>Gunicorn 本身是 WSGI 服务器,而 FastAPI 是基于 ASGI 的。</p>
<p>因此我们使用:</p>
<pre><div class="hljs"><code class="lang-shell">gunicorn main:app -k uvicorn.workers.UvicornWorker
</code></div></pre>
<p>这里的 <code>-k uvicorn.workers.UvicornWorker</code> 就是使用 <strong>Uvicorn 作为 ASGI worker 适配器</strong>,让 Gunicorn 能运行 FastAPI。</p>
<h2><a id="2_FastAPI_67"></a>2 FastAPI案例</h2>
<p>main.py</p>
<pre><div class="hljs"><code class="lang-shell">from fastapi import FastAPI
from app.routes import router
app = FastAPI()
app.include_router(router)
</code></div></pre>
<p>routes.py</p>
<pre><div class="hljs"><code class="lang-shell">from fastapi import APIRouter
router = APIRouter()
@router.get("/")
async def read_root():
return {"message": "Gunicorn案例测试"}
</code></div></pre>
<h2><a id="3_requirementstxt_91"></a>3 requirements.txt</h2>
<p>依赖文件</p>
<pre><div class="hljs"><code class="lang-shell">fastapi
uvicorn[standard]
gunicorn
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">fastapi==0.115.5
uvicorn==0.32.1
gunicorn==23.0.0
</code></div></pre>
<h2><a id="4__107"></a>4 命令启动参考</h2>
<pre><div class="hljs"><code class="lang-shell">gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
</code></div></pre>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>app.main:app</code></td>
<td>指定 FastAPI 应用位置,<code>模块路径:对象</code> 格式</td>
</tr>
<tr>
<td><code>-w 4</code></td>
<td>启动 4 个 worker(根据 CPU 核数调整)</td>
</tr>
<tr>
<td><code>-k uvicorn.workers.UvicornWorker</code></td>
<td>使用 Uvicorn 的异步 worker</td>
</tr>
<tr>
<td><code>--bind 0.0.0.0:8000</code></td>
<td>绑定端口和 IP 地址</td>
</tr>
</tbody>
</table>
<h2><a id="5__120"></a>5 通过配置文件启动</h2>
<p>启动命令(可配合shell脚本进行一键启动)</p>
<pre><div class="hljs"><code class="lang-shell">gunicorn main:app -c gunicorn.conf.py
</code></div></pre>
<p>gunicorn.conf.py</p>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-comment"># 应用模块路径</span>
bind = <span class="hljs-string">"0.0.0.0:8000"</span>
<span class="hljs-comment"># worker 数量,建议 = CPU核心数 * 2 + 1</span>
workers = <span class="hljs-number">4</span>
<span class="hljs-comment"># 使用异步 worker 适配 FastAPI</span>
worker_class = <span class="hljs-string">"uvicorn.workers.UvicornWorker"</span>
<span class="hljs-comment"># 日志等级</span>
loglevel = <span class="hljs-string">"info"</span>
<span class="hljs-comment"># 日志文件(可选)</span>
accesslog = <span class="hljs-string">"log/gunicorn_access.log"</span>
errorlog = <span class="hljs-string">"log/gunicorn_error.log"</span>
<span class="hljs-comment"># 设置最大请求处理时间(秒)</span>
timeout = <span class="hljs-number">60</span>
<span class="hljs-comment"># 设置 pid 文件路径(可选)</span>
pidfile = <span class="hljs-string">"gunicorn.pid"</span>
<span class="hljs-comment"># 设置守护进程(可选)</span>
daemon = <span class="hljs-literal">True</span>
</code></div></pre>
<p>shell脚本授权</p>
<pre><div class="hljs"><code class="lang-shell">chmod +x start.sh
./start.sh
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/ee5dea842a6b6971d955ed1115af752b.png" alt="gunicorn启动fastapi项目" /></p>
<h2><a id="6_docker_166"></a>6 docker配置</h2>
<h3><a id="61_Dockerfile_168"></a>6.1 Dockerfile</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">基础镜像</span>
FROM python:3.10-slim
<span class="hljs-meta">
# </span><span class="language-bash">设置工作目录</span>
WORKDIR /app
<span class="hljs-meta">
# </span><span class="language-bash">复制项目文件</span>
COPY . /app
<span class="hljs-meta">
# </span><span class="language-bash">安装依赖</span>
RUN pip install --no-cache-dir -r requirements.txt
<span class="hljs-meta">
# </span><span class="language-bash">启动命令</span>
CMD ["gunicorn", "app.main:app", "-c", "gunicorn.conf.py"]
</code></div></pre>
<h3><a id="62_dockercomposeyml_187"></a>6.2 docker-compose.yml</h3>
<pre><div class="hljs"><code class="lang-shell">version: "3"
services:
fastapi:
build: .
ports:
- "8000:8000"
restart: always
</code></div></pre>
<h3><a id="63__199"></a>6.3 启动</h3>
<h4><a id="631__201"></a>6.3.1 构建镜像</h4>
<pre><div class="hljs"><code class="lang-shell">docker build -t fastapi-app .
</code></div></pre>
<h4><a id="632__207"></a>6.3.2 运行容器</h4>
<pre><div class="hljs"><code class="lang-shell">docker run -d -p 8000:8000 --name fastapi-container fastapi-app
</code></div></pre>
<p>或者使用 <code>docker-compose</code>:</p>
<pre><div class="hljs"><code class="lang-shell">docker-compose up -d
</code></div></pre>
留言