Flask/Django 生產部署:Gunicorn vs Nginx,Windows 與 Linux 實戰指引

Flask/Django 生產部署:Gunicorn vs Nginx,Windows 與 Linux 實戰指引

TL;DR

  • Gunicorn:Python WSGI 應用服務器,運行 Flask/Django(Linux 用)。
  • Nginx:反向代理/網關(TLS、靜態、限流、緩存、IP 過濾),不運行 Python。
  • Windows:不要用 Gunicorn,用 Waitress;如需 Gunicorn,用 WSL2/Docker。
  • Linux:標準做法 Nginx → Gunicorn(多 worker)→ 應用。

1. 角色與分工

  • Gunicorn(應用服務器):多進程/線程、連接處理、超時、重啟、日志;負責把 Python 應用跑起來。
  • Nginx(反向代理/網關):TLS、靜態文件、緩沖/抗慢連接、壓縮、緩存、限流、負載均衡、黑白名單。
  • 常見拓撲:互聯網 → Nginx → Gunicorn → Flask/Django。

2. Windows 部署(Gunicorn 不支持)

2.1 單機/內網(最簡)

  • Waitress(WSGI) 直接運行 Flask/Django。
# run_waitress.py
from app import create_app
from waitress import serve
app = create_app()
if __name__ == '__main__':serve(app, host='0.0.0.0', port=5000, threads=8)

2.2 多實例 + 負載(推薦)

  • 啟多個 Waitress 實例(不同端口),前置 Nginx/Caddy/IIS 做負載均衡。
# 啟動 4 個實例:5001..5004
1..4 | % { Start-Process python -ArgumentList "run_waitress.py --port $([int](5000+$_))" }
  • Nginx(Windows)示例:
upstream backend {server 127.0.0.1:5001;server 127.0.0.1:5002;server 127.0.0.1:5003;server 127.0.0.1:5004;keepalive 64;
}
server {listen 80;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;proxy_pass http://backend;}
}
  • Caddy(更易用):
:80 {reverse_proxy 127.0.0.1:5001 127.0.0.1:5002 127.0.0.1:5003 127.0.0.1:5004
}
  • 守護與自啟動:用 NSSM 把每個實例注冊為 Windows 服務。

2.3 想用 Gunicorn?

  • WSL2 或 Docker 內運行 Linux 棧:Nginx + Gunicorn + 應用;Windows 側通過端口映射訪問。

3. Linux 部署(標準做法)

3.1 單服務多 worker(最常用)

  • 啟動(Flask 工廠函數):
pip install gunicorn
gunicorn 'app:create_app()' -b unix:/run/cbs/app.sock -w 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
# 或 -b 127.0.0.1:5000;workers≈2*CPU+1,I/O 多可加 --threads 或 -k gevent
  • systemd:
[Unit]
Description=CBS via Gunicorn
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/srv/cbs
ExecStart=/srv/cbs/venv/bin/gunicorn 'app:create_app()' --bind unix:/run/cbs/app.sock --workers 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
  • Nginx:
upstream backend { server unix:/run/cbs/app.sock; keepalive 64; }
server {listen 80;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;proxy_http_version 1.1;proxy_set_header Connection "";proxy_pass http://backend;}
}
  • 平滑重載:systemctl reload cbs.service 或向 master 發送 HUP

3.2 多 Gunicorn master + 負載(更強隔離)

  • 啟兩個 socket,Nginx upstream 負載;便于滾動升級與故障隔離。

3.3 Django 說明

  • 啟動目標改為 myproject.wsgi:application;靜態資源 collectstatic 后由 Nginx 下發。

4. 調優與實踐要點

  • 分工:靜態、TLS、緩沖、限流交給 Nginx;業務交給應用服務器。
  • 并發模型:CPU 密集——多 worker;I/O 多——加 --threads-k gevent
  • 超時:Gunicorn --timeout 與 Nginx proxy_read_timeout 對齊。
  • 預加載--preload + CoW 可省內存(確認初始化無副作用)。
  • 真實 IP:只信任邊界代理注入的 X-Forwarded-For/X-Real-IP
  • 守護:Windows 用 NSSM;Linux 用 systemd;容器用 Compose/K8s。

5. FAQ

  • 后端“用 Gunicorn 代理還是 Nginx 代理”?
    • 說法不準確:Gunicorn 運行應用,Nginx 才是代理。生產推薦二者搭配。
  • Windows 一定要 Nginx 嗎?
    • 不是必須;內網可直連 Waitress。需要 TLS/限流/負載時再加 Nginx/Caddy/IIS。
  • 非得用 Gunicorn 又是 Windows?
    • WSL2/Docker 跑 Linux 棧。

  • 小結
    • Windows:Waitress 多實例 + Nginx/Caddy/IIS;Gunicorn 走 WSL2/Docker。
    • Linux:Nginx + Gunicorn,多 worker 或多 master 皆可;用 systemd 管理與平滑重載。
    • 關鍵:網關層與應用層分工明確,按并發特性選擇 worker/threads,統一處理真實 IP。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96326.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx 優化與防盜鏈全解析:從性能調優到資源保護

Nginx 優化與防盜鏈全解析:從性能調優到資源保護 文章目錄Nginx 優化與防盜鏈全解析:從性能調優到資源保護一、基礎安全優化:隱藏版本號1.1 查看當前版本號1.2 兩種隱藏/修改方案方案一:修改配置文件(快速隱藏&#xf…

HOT100--Day20--39. 組合總和,22. 括號生成,79. 單詞搜索

HOT100–Day20–39. 組合總和,22. 括號生成,79. 單詞搜索 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型:回溯。 關鍵:掌握排列,組合。記得回溯。可以重復選的話,下一層index從哪里開始&#x…

高并發場景下的“命令執行”注入繞道記

環境:CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景:營銷團隊上線了一個“圖片裁剪”接口,參數直接拼進 shell_exec,結果被打成“礦機”。1. 發現:流量突增 30 倍,卻不見數據庫慢查詢 iftop -i eth0出站 1.8…

【modbus學習】

Modbus通信(源于施耐德)串行鏈路:RTU(傳輸大量數據,適合工業)、ASCII(少量數據,適合計算機)TCP/IP:TCP(傳輸嚴謹,效率低)、…

Redis單線程模型為什么快?

Redis的單線程模型指的是redis只使用一個線程來出來所有的命令式指令,但是不是意味著redis內部就只使用一個線程來處理所有的任務。都知道redis是一個客戶端-服務器的程序,那么redis就只有一個服務器,但是有多個客戶端,就像mysql一…

前端安全攻防:XSS, CSRF 等常見威脅的防范與檢測指南

在如今高度互聯的 Web 應用世界里,前端安全不再是可有可無的選項,而是構建可信賴、健壯應用的基石。隨著 Web 技術的發展,攻擊者們也變得越來越狡猾,前端遭受的攻擊手段層出不窮。其中,跨站腳本攻擊 (XSS) 和跨站請求偽…

Scikit-learn Python機器學習 - 特征降維 壓縮數據 - 特征選擇 - 移除低方差特征(VarianceThreshold)

鋒哥原創的Scikit-learn Python機器學習視頻教程: 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識,包括機器學習概述,特征工程(數據…

C#(鏈表創建與原地反轉)

鏈表創建(C#) 在C#中,鏈表可以通過自定義節點類實現。每個節點包含數據域和指向下一個節點的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源碼導入Android Studio

AOSP代碼量龐大,為了開發的方便,我們需要導入到android studio中,其中關鍵的一 項就是配置跳轉。尤其是對于Framework開發來說生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh會生成如下文件首先需要修改ipr和iml文件…

游戲中的設計模式——第一篇 設計模式簡介

前言 對于設計模式,相信很多開發者并不陌生,我在學習過程中希望把自己的一些總結和心得體會與你分享。 本專欄主要將重點放在設計模式在游戲中的應用,會結合大家熟悉的游戲場景和功能闡述設計模式在該處應用的好處。因為設計模式很多&#xf…

SpringBoot + RustFS 實現文件切片極速上傳技術

本文將手把手教你如何通過 SpringBoot 和 RustFS 構建高性能文件切片上傳系統,解決大文件傳輸的痛點,實現秒傳、斷點續傳和分片上傳等高級功能。 目錄 一、為什么選擇 RustFS SpringBoot? 二、環境準備與部署 2.1 安裝 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切換英文段落大小寫

在Word和WPS文字中編輯英文段落時,有時候英文字母的大小寫不規范,或者需要把某一段全部改為大寫字母怎么辦?使用ShiftF3組合鍵即可快速在三種模式中切換:全部大寫、全部小寫、首字母大寫——其中首字母大寫的Word是每一句話的第一…

成都金牛區哪里租好辦公室?國際數字影像產業園享稅收優惠

在成都金牛區租賃優質辦公室,國際數字影像產業園憑借其享有的稅收優惠政策,成為了許多企業的首選之地。稅收優惠對于租賃辦公室的企業來說,是一筆不小的成本節省。國際數字影像產業園針對入駐企業提供的稅收優惠政策,能在企業運營…

CSS `:is()` `:where()` 實戰指南:簡化選擇器,提升可維護性

🎯 CSS :is() & :where() 實戰指南:簡化選擇器,提升可維護性你是否在項目中寫過一大串重復的選擇器?比如: h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }這樣的代碼既冗長又難維護。 現在 CSS 提供了 :is() 和…

Linux I/O 訪問架構深入分析

Linux I/O 訪問架構深入分析 目錄 概述I/O 架構層次核心數據結構I/O 處理流程VFS 虛擬文件系統塊設備I/O字符設備I/O內存映射I/O異步I/O機制I/O調度器調試工具與方法性能優化策略 概述 Linux I/O 系統是一個多層次、高度抽象的架構,旨在為應用程序提供統一的文件訪問…

Linux:6_基礎IO

基礎IO 一.理解"文件" 文件分類 1.內存級(被打開)文件 2.磁盤級文件 1. 狹義理解 文件在磁盤里磁盤是永久性存儲介質,因此文件在磁盤上的存儲是永久性的磁盤是外設 (即是輸出設備也是輸入設備)磁盤上的文件本質是對文件的所有操作,都是對外…

Coze源碼分析-資源庫-刪除插件-前端源碼-核心邏輯

刪除插件邏輯 1. 刪除操作入口組件 刪除插件操作主要通過 usePluginConfig hook 中的 renderActions 方法實現,該方法返回 TableAction 組件來處理表格行的操作。 文件位置:frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地狀態(Flink 1.x)

最初的架構將狀態以 JVM Heap 對象的形式存儲在 TaskManager 的內存中。對于小規模數據集,這種方式效果良好,但隨著狀態大小的增長超出內存,將所有狀態保存在內存中變得成本高昂且不穩定。 為了解決狀態規模增長的問題,引入了一種…

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南 關鍵詞:印度股票數據對接 NSE實時行情 BSE證券接口 金融API開發 Python請求示例一、印度股市數據源技術解析(核心價值) 印度兩大交易所數據獲取難點: 時區差異&a…

AFSim2.9.0學習筆記 —— 1、AFSim及完整工具介紹(文末附:完整afsim2.9.0源碼、編譯好的完整工具包、中文教材等)

🔔 AFSim2.9.0 相關技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) AFSim介紹 AFSim(Advanced Framework for Simulation Integration & Modeling【高級仿真集成與…