在Windows環(huán)境下部署Flask的完整方案
在 Windows 生產(chǎn)環(huán)境中部署 Flask 應(yīng)用,你需要使用 Windows 兼容的 WSGI 服務(wù)器(如 Waitress、Hypercorn)以及 Windows 服務(wù)管理工具(如 NSSM 或直接使用 Python 的 win32service)。本文將為你提供一套完整的 Windows 系統(tǒng) Flask 部署方案,并對比與 Linux 方式的異同。
Windows 部署 Flask 的完整方案
核心組件替換說明
| Linux 組件 | Windows 替代方案 | 說明 |
|---|---|---|
| Gunicorn | Waitress 或 Hypercorn | Waitress 是純 Python WSGI 服務(wù)器,原生支持 Windows,性能穩(wěn)定 |
| Supervisor / Systemd | NSSM(Non-Sucking Service Manager)或 Windows 任務(wù)計劃程序 | NSSM 可將任何 exe 包裝成 Windows 服務(wù),支持自啟、崩潰重啟 |
| 日志管理 | Python logging 模塊 + 文件輪轉(zhuǎn)(RotatingFileHandler) | Windows 沒有內(nèi)置的 journald,建議在應(yīng)用內(nèi)配置日志 |
注意:Hypercorn 支持 HTTP/2 和 ASGI,但配置稍復(fù)雜;Waitress 簡單穩(wěn)定,是 Flask 官方推薦的生產(chǎn)服務(wù)器之一。
一、使用 Waitress + NSSM 部署 Flask(推薦)
1. 環(huán)境準備
- Windows Server 2016+ 或 Windows 10/11(專業(yè)版/企業(yè)版)
- Python 3.8+ 已安裝并加入 PATH
- 你的 Flask 項目(例如
C:\myapp\app.py)
2. 安裝依賴
在項目目錄創(chuàng)建虛擬環(huán)境(強烈推薦):
cd C:\myapp python -m venv venv venv\Scripts\activate pip install flask waitress
3. 創(chuàng)建啟動腳本
由于 NSSM 需要執(zhí)行一個 .bat 或 .exe,我們編寫一個 Python 啟動腳本 run.py,它使用 Waitress 運行 Flask 應(yīng)用:
# run.py
from waitress import serve
from app import app # 假設(shè)你的 Flask 實例名為 app
if __name__ == '__main__':
# 監(jiān)聽所有IP的8080端口,生產(chǎn)環(huán)境建議綁定內(nèi)網(wǎng)IP并通過反向代理(如 Nginx)暴露
serve(app, host='0.0.0.0', port=8080, threads=4)測試腳本是否能正常運行:
python run.py
訪問 http://localhost:8080 看到 Flask 輸出即為成功。
4. 使用 NSSM 注冊為 Windows 服務(wù)
下載 NSSM(官網(wǎng)),將 nssm.exe 放在 C:\Windows\System32 或項目目錄下。
以管理員身份打開命令提示符,執(zhí)行:
nssm install FlaskApp
彈出 GUI 配置界面:
- Path:
C:\myapp\venv\Scripts\python.exe - Startup directory:
C:\myapp - Arguments:
run.py - Service name:
FlaskApp(可自定義)
點擊 “Install service”。
然后啟動服務(wù):
nssm start FlaskApp
檢查狀態(tài):
nssm status FlaskApp
5. 設(shè)置服務(wù)開機自啟
NSSM 安裝的服務(wù)默認就是“自動”啟動類型,可以在 Windows 服務(wù)管理器(services.msc)中確認。
6. 查看日志與崩潰自動重啟
NSSM 默認會將 stdout/stderr 重定向到文件。在 NSSM GUI 的 “I/O” 選項卡中可以設(shè)置日志文件路徑:
- Output (stdout):
C:\myapp\logs\service-out.log - Error (stderr):
C:\myapp\logs\service-err.log
并勾選 “Redirect error output to stdout” 簡化。
在 “Process” 選項卡中:
- Exit action:
Restart(進程意外退出時自動重啟) - Restart delay:
5000(毫秒)
7. 常用 NSSM 命令
nssm restart FlaskApp # 重啟服務(wù) nssm stop FlaskApp # 停止 nssm remove FlaskApp # 刪除服務(wù)(需加 confirm 參數(shù))
二、使用 Waitress + 任務(wù)計劃程序(無第三方工具)
如果不想安裝 NSSM,可以用 Windows 任務(wù)計劃程序創(chuàng)建一個“不管用戶是否登錄都運行”的任務(wù),并設(shè)置觸發(fā)器為“啟動時”,以及“如果失敗則重啟”。缺點是配置較繁瑣,且重啟策略不如 NSSM 靈活。
步驟簡述:
創(chuàng)建啟動腳本 start.bat:
@echo off cd C:\myapp call venv\Scripts\activate python run.py
打開“任務(wù)計劃程序” → “創(chuàng)建任務(wù)”:
- 常規(guī):勾選“不管用戶是否登錄都運行”,使用最高權(quán)限。
- 觸發(fā)器:新建“啟動時”。
- 操作:啟動程序
cmd.exe,參數(shù)/c "C:\myapp\start.bat"。 - 條件:取消所有“只有在以下網(wǎng)絡(luò)連接可用時才啟動”等選項。
- 設(shè)置:勾選“如果任務(wù)失敗,按以下頻率重啟”,例如每5分鐘重啟一次,最多3次。
這種方法不推薦用于生產(chǎn)環(huán)境,因為進程管理能力弱,無優(yōu)雅停止。
三、Windows 部署的注意事項
1. 反向代理
Windows 下同樣建議在 Waitress 前面加一層 Nginx for Windows 或 IIS 做反向代理,用于:
- 提供靜態(tài)文件服務(wù)(Waitress 不擅長)
- 負載均衡
- HTTPS 卸載
Nginx for Windows 配置與 Linux 類似,下載官方 Windows 版本即可。
2. 日志輪轉(zhuǎn)
在 run.py 中配置 Python logging 的 RotatingFileHandler:
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=5)
handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s'))
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)3. 性能調(diào)優(yōu)
- Waitress 的
threads參數(shù)建議設(shè)置為 CPU 核心數(shù)的 2-4 倍。 - 如果遇到高并發(fā),可以增加
asyncore或使用Hypercorn配合uvloop(但 Windows 上 uvloop 不可用,性能不如 Linux)。
4. 防火墻與端口
確保 Windows 防火墻允許外部訪問你的端口(例如 8080):
netsh advfirewall firewall add rule name="Flask App" dir=in action=allow protocol=TCP localport=8080
四、修改代碼后如何重新部署
使用 NSSM
由于 NSSM 只是管理進程,修改代碼后需要重啟服務(wù)才能加載新代碼:
nssm restart FlaskApp
注意:restart 會立即殺死當前進程,可能導(dǎo)致正在處理的請求失敗。要實現(xiàn)優(yōu)雅重啟,Waitress 本身不支持熱重載,你可以在代碼中使用 watchdog 庫監(jiān)聽文件變化并觸發(fā) sys.exit(),配合 NSSM 的自動重啟策略,但較為復(fù)雜。更簡單的做法是:在低流量時段重啟,或使用負載均衡摘除節(jié)點。
使用任務(wù)計劃程序
手動停止任務(wù)(在任務(wù)計劃程序庫中右鍵結(jié)束),然后重新啟動任務(wù)。
五、與 Linux 部署方式的異同總結(jié)
| 方面 | Linux (Gunicorn+Systemd) | Windows (Waitress+NSSM) |
|---|---|---|
| WSGI 服務(wù)器 | Gunicorn(多進程) | Waitress(多線程) |
| 進程管理 | Systemd(原生,功能強大) | NSSM(第三方,穩(wěn)定) |
| 性能 | 高(多進程 + 預(yù)派生) | 中(Python 多線程受 GIL 限制) |
| 優(yōu)雅重啟 | 支持(kill -HUP) | 不支持(需手動重啟或變通) |
| 日志管理 | journald / syslog | 需應(yīng)用自行配置文件輪轉(zhuǎn) |
| 開機自啟 | systemctl enable | NSSM 服務(wù)默認自啟 |
| 資源隔離 | cgroup / namespace | 無(依賴 Windows 進程隔離) |
| 部署復(fù)雜性 | 中等(需理解 systemd unit) | 低(NSSM GUI 配置簡單) |
結(jié)論:
- 如果生產(chǎn)環(huán)境是 Windows Server,使用 Waitress + NSSM 是最穩(wěn)定、最接近 Linux 體驗的方案。
- 如果追求更高性能,建議將應(yīng)用容器化(Docker for Windows)或直接遷移到 Linux 服務(wù)器。
- 不推薦 使用
flask run或內(nèi)置服務(wù)器用于生產(chǎn),無論何種平臺。
六、完整示例腳本
為了方便,提供一個完整的 run.py 示例,包含日志配置和 Waitress 啟動:
import logging
from logging.handlers import RotatingFileHandler
from waitress import serve
from app import app
# 配置日志
if not app.debug:
handler = RotatingFileHandler('logs/app.log', maxBytes=10*1024*1024, backupCount=5)
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s')
handler.setFormatter(formatter)
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)
app.logger.info('Flask app starting')
if __name__ == '__main__':
serve(app, host='0.0.0.0', port=8080, threads=4)記得創(chuàng)建 logs 文件夾。
希望這份 Windows 部署教程能幫助你順利完成 Flask 項目的生產(chǎn)環(huán)境部署。如果你的環(huán)境可以換成 Linux,強烈建議使用 Linux 以獲得更成熟、高性能的工具鏈。
以上就是在Windows環(huán)境下部署Flask的完整方案的詳細內(nèi)容,更多關(guān)于Windows部署Flask方案的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解用Python實現(xiàn)自動化監(jiān)控遠程服務(wù)器
這篇文章主要介紹了用Python實現(xiàn)自動化監(jiān)控遠程服務(wù)器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
python xlsxwriter創(chuàng)建excel圖表的方法
這篇文章主要為大家詳細介紹了python xlsxwriter創(chuàng)建excel圖表的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06
Python在pycharm中使用environment.ylm文件配置虛擬環(huán)境的過程
environment.yml這個文件主要就是用來保存當前的程序運行環(huán)境,可以理解成pythonrequirementstxt的存在更加方便一些,這篇文章主要介紹了Python在pycharm中使用environment.ylm文件配置虛擬環(huán)境的過程2025-11-11
python如何爬取網(wǎng)站數(shù)據(jù)并進行數(shù)據(jù)可視化
這篇文章主要介紹了python爬取拉勾網(wǎng)數(shù)據(jù)并進行數(shù)據(jù)可視化,爬取拉勾網(wǎng)關(guān)于python職位相關(guān)的數(shù)據(jù)信息,并將爬取的數(shù)據(jù)已csv各式存入文件,然后對csv文件相關(guān)字段的數(shù)據(jù)進行清洗,并對數(shù)據(jù)可視化展示,包括柱狀圖展示、直方圖展示,需要的朋友可以參考下2019-07-07

