Flask在Windows下必须通过Apache+mod_wsgi部署,核心是版本严格匹配(Python标识、VC编译版本)、使用守护进程模式、配置正确app.wsgi入口及权限加固。

Flask 自带的开发服务器不能用于生产环境,Apache 必须通过 mod_wsgi 模块来托管 Flask 应用,核心在于进程隔离、路径明确、权限可控。Windows 下虽受限,但只要版本对齐、配置严谨,一样能稳定运行。
确保 mod_wsgi 与 Python/Apache 版本严格匹配
这是最容易出错的第一步。三者必须协同:
- Python 版本(如 cp39、cp310)需与下载的
mod_wsgi‑X.X.X‑cpXX‑cpXXm‑win_amd64.whl中的标识完全一致 - Apache 必须使用对应 VC 编译版本(如 VC14 对应 Apache 2.4.x,VC17 对应 Apache 2.5+)
- 安装后运行
mod_wsgi-express module-config,把输出的LoadFile和LoadModule行完整复制进httpd.conf的LoadModule区域下方 - 不要手动拷贝
.so或.pyd文件到modules/目录再用LoadModule wsgi_module modules/mod_wsgi.so—— 容易路径错、依赖缺、加载失败
用守护进程模式(Daemon Mode)启动 Flask
别用嵌入模式(Embedded Mode),它共享 Apache 工作进程,容易因一个请求崩溃拖垮整个服务。必须启用独立守护进程:
- 在虚拟主机配置中写明
WSGIDaemonProcess,显式指定python-home(虚拟环境根目录)和python-path(项目根目录) - 示例(假设虚拟环境在
D:\myapp\venv,项目代码在D:\myapp):
<VirtualHost *:80>
ServerName myapp.local
WSGIDaemonProcess myapp \
python-home="D:/myapp/venv" \
python-path="D:/myapp" \
processes=2 threads=15 \
display-name=%{GROUP}
WSGIProcessGroup myapp
WSGIScriptAlias / "D:/myapp/app.wsgi"
<Directory "D:/myapp">
Require all granted
</Directory>
</VirtualHost> -
python-home必须指向含Scripts/activate(Windows)或bin/activate(Linux)的目录;python-path是项目所在路径,不是app.py所在子目录
编写可靠且可复用的 app.wsgi 入口文件
这个文件是 Apache 和 Python 之间的唯一桥梁,必须简洁、健壮、不依赖交互式环境:
立即学习“Python免费学习笔记(深入)”;
- 内容固定结构(注意:变量名必须为
application,不能是app或其他):
import sys
import os
# 确保项目路径在 sys.path 开头
sys.path.insert(0, 'D:/myapp')
os.chdir('D:/myapp')
# 激活虚拟环境(仅 Windows 下必要,Linux 可省略此行)
activate_this = 'D:/myapp/venv/Scripts/activate.bat'
exec(open(activate_this).read(), dict(__file__=activate_this))
# 导入 Flask 实例
from app import app as application - 避免在
app.wsgi中写日志、初始化数据库连接或调用耗时操作——这些应在 Flask 应用内部按需处理 - 文件编码保存为 UTF-8 无 BOM,否则 Apache 启动时报语法错误
基础 Apache 配置与权限加固
绕过默认安全限制不等于放任不管,而是精准授权:
- 修改
httpd.conf中的<Directory />块,改为:
<Directory />
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
(Apache 2.4+ 使用Require语法,Order/Allow已废弃) -
DocumentRoot和<Directory>路径必须与WSGIScriptAlias中的项目路径逻辑一致,但无需让静态资源走 WSGI —— 可额外配Alias /static "/path/to/static"提升性能 - 关闭不必要的模块(如
mod_cgi、mod_userdir),减少攻击面 - Windows 下确保 Apache 服务以普通用户(非 SYSTEM)运行,并赋予该用户对项目目录的读取+执行权限


















