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

