02-3. 進階配置技巧 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 掌握 Gunicorn 的進階配置技巧:preload_app、graceful_timeout、Hook functions、日誌優化等。
📋 進階參數總覽 參數 作用 默認值 使用場景 preload_app 預載入應用 False 加快啟動、節省記憶體 graceful_timeout 優雅關閉超時 30 秒 平滑重載 worker_tmp_dir Worker 臨時目錄 None 效能優化 limit_request_line 請求行長度限制 4094 安全防護 limit_request_fields 請求頭數量限制 100 安全防護 🚀 preload_app(預載入應用) 什麼是 preload_app? 在 Master 進程啟動時就載入應用代碼,然後 fork 出 Workers,而不是每個 Worker 獨立載入。
工作原理對比 沒有 preload_app(默認) Master 進程啟動 ↓ Master: 我要創建 4 個 workers ↓ ├─ Worker 1 啟動 → 載入 Django 應用(100MB)→ 就緒 ├─ Worker 2 啟動 → 載入 Django 應用(100MB)→ 就緒 ├─ Worker 3 啟動 → 載入 Django 應用(100MB)→ 就緒 └─ Worker 4 啟動 → 載入 Django 應用(100MB)→ 就緒 總記憶體:100MB × 4 = 400MB 啟動時間:慢(每個 worker 都要載入)有 preload_app = True Master 進程啟動 ↓ Master: 載入 Django 應用(100MB) ↓ Master: 用 fork() 複製出 4 個 workers ↓ ├─ Worker 1(複製 Master)→ 就緒(快!) ├─ Worker 2(複製 Master)→ 就緒(快!) ├─ Worker 3(複製 Master)→ 就緒(快!) └─ Worker 4(複製 Master)→ 就緒(快!) 總記憶體:約 150MB(共享記憶體) 啟動時間:快(只載入一次) 配置方式 # gunicorn.
Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
📚 Django 面試準備系列 - 目錄 01. Gunicorn 基礎篇 01-1. Gunicorn 是什麼 ⏱️ 5min 01-2. 為什麼需要 Gunicorn ⏱️ 5min 01-3. Worker 的概念 ⏱️ 8min 01-4. Sync Worker 詳解 ⏱️ 10min 01-5. Gevent Worker 詳解 ⏱️ 10min 01-6. Gthread Worker 詳解 ⏱️ 10min 01-7. Worker 如何選擇 ⏱️ 8min 01-8. 現代方案:Gunicorn + Uvicorn Workers ⏱️ 12min 🆕 02. Gunicorn 配置篇 02-1. Workers 數量計算 ⏱️ 10min 02-2. 基礎配置參數 ⏱️ 10min ✅ 02-3. 進階配置技巧 ⏱️ 12min ✅ 02-4.
01-1. FastAPI 是什麼?為什麼選擇它? ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐ (入門)
🤔 一句話解釋 FastAPI 是一個現代、高效能的 Python Web 框架,專門用來建立 API,速度可以媲美 Node.js 和 Go。
🏎️ 用賽車來比喻 想像你要參加一場 API 框架大賽:
Django = 豪華房車 # Django 內建超多功能 from django.contrib.auth.models import User from django.contrib.admin import site from django.contrib.sessions.middleware import SessionMiddleware # ... 還有 ORM、模板引擎、Admin 後台等等特點:
🚗 功能齊全,開箱即用 🚗 適合完整的 Web 應用 ⚠️ 有點重,起步較慢 ⚠️ 學習曲線較高 Flask = 機車 # Flask 極簡 from flask import Flask app = Flask(__name__) @app.
01-2. 環境設定與第一個 API ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐ (入門)
🎯 本章目標 完成這一章後,你將能:
✅ 設定 FastAPI 開發環境 ✅ 建立並運行第一個 API ✅ 理解 FastAPI 應用的基本結構 ✅ 使用 Swagger UI 測試 API 🔧 環境準備 1. 確認 Python 版本 FastAPI 需要 Python 3.8+,建議使用 3.10+
# 檢查 Python 版本 python --version # 或 python3 --version # 輸出應該是 Python 3.8 以上 # Python 3.11.x 或 Python 3.12.x2. 建立專案目錄 # 建立專案目錄 mkdir fastapi-learning cd fastapi-learning # 建立虛擬環境 python -m venv venv # 啟動虛擬環境 # macOS / Linux source venv/bin/activate # Windows (Command Prompt) venv\Scripts\activate.
01-3. 路徑參數與查詢參數 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐ (入門)
🤔 一句話解釋 路徑參數是 URL 的一部分,查詢參數是 URL 後面的 ?key=value
https://api.example.com/users/123/posts?page=1&limit=10 ↑ ↑ ↑ 路徑參數 查詢參數 查詢參數 📍 路徑參數 (Path Parameters) 路徑參數用來識別特定的資源。
基本用法 from fastapi import FastAPI app = FastAPI() # {user_id} 就是路徑參數 @app.get("/users/{user_id}") async def get_user(user_id: int): return {"user_id": user_id}請求:
GET /users/123回應:
{"user_id": 123}型別自動轉換 FastAPI 會自動根據型別提示轉換參數:
@app.get("/items/{item_id}") async def get_item(item_id: int): # 自動轉成 int return {"item_id": item_id, "type": type(item_id).__name__}測試:
# 正確 - 會轉成 int GET /items/42 # 回應: {"item_id": 42, "type": "int"} # 錯誤 - 無法轉換 GET /items/abc # 回應: 422 Unprocessable Entity # { # "detail": [{ # "loc": ["path", "item_id"], # "msg": "Input should be a valid integer", # "type": "int_parsing" # }] # }多個路徑參數 @app.
01-4. 請求體與回應模型 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐ (基礎)
🤔 一句話解釋 請求體是客戶端發送給 API 的資料,回應模型定義 API 返回的資料格式。
Client Server │ │ │ POST /users │ │ ─────────────────────────────────▶│ │ 請求體 (Request Body): │ │ {"name": "John", "email": "..."} │ │ │ │ 回應 (Response): │ │ ◀─────────────────────────────────│ │ {"id": 1, "name": "John", ...} │ │ │ 📥 請求體 (Request Body) 基本用法 使用 Pydantic 模型定義請求體結構:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() # 定義請求體模型 class UserCreate(BaseModel): name: str email: str age: int @app.