Azure Ubuntu20.04上Apache2+WSGI部署Flask应用遇超时及加载问题
针对你在Azure Ubuntu 20.04虚拟机上部署Flask+Apache+WSGI时遇到的超时问题,按以下步骤逐一排查:
1. 验证WSGI配置与虚拟环境关联
确保app.wsgi正确激活虚拟环境并加载Flask应用,示例配置如下:
import sys import os import site # 绑定虚拟环境的依赖库路径 venv_path = '/var/www/html/FLASKAPP.web.tool/flaskapp_venv' site.addsitedir(os.path.join(venv_path, 'lib', 'python3.9', 'site-packages')) sys.path.insert(0, '/var/www/html/FLASKAPP.web.tool') # 设置Flask环境变量 os.environ['FLASK_APP'] = 'main.py' os.environ['FLASK_ENV'] = 'production' # 导入Flask应用实例 from main import app as application
注意:确认虚拟环境的Python版本路径(python3.9)与你的实际版本匹配,且main.py中正确导出了app实例。
2. 本地测试Flask应用可用性
先排除应用本身的问题,进入虚拟环境手动启动应用并测试:
cd /var/www/html/FLASKAPP.web.tool source flaskapp_venv/bin/activate flask run --host=0.0.0.0 --port=5000
在VM本地执行curl http://localhost:5000,若无法返回响应,说明应用存在启动阻塞(如等待未配置的服务连接)、依赖缺失或语法错误,需先修复应用本身。
3. 匹配WSGI模块与Python版本
Ubuntu 20.04默认的mod_wsgi可能适配Python3.8,与你使用的Python3.9虚拟环境存在兼容性问题,需重新安装对应版本的模块:
# 卸载默认模块 sudo apt remove libapache2-mod-wsgi-py3 # 安装编译依赖 sudo apt install apache2-dev python3.9-dev # 激活虚拟环境并安装适配的mod_wsgi source /var/www/html/FLASKAPP.web.tool/flaskapp_venv/bin/activate pip install mod_wsgi # 获取模块配置路径 mod_wsgi-express module-config
将输出的三行配置替换到/etc/apache2/mods-available/wsgi.load,然后重启Apache:
sudo a2enmod wsgi sudo systemctl restart apache2
4. 优化WSGI守护进程配置
在/etc/apache2/sites-available/flaskapp.com.conf中调整守护进程参数,避免资源阻塞:
<VirtualHost *:80> ServerName <你的VM IP> # 配置守护进程,指定虚拟环境路径 WSGIDaemonProcess flaskapp user=www-data group=www-data threads=5 python-home=/var/www/html/FLASKAPP.web.tool/flaskapp_venv WSGIScriptAlias / /var/www/html/FLASKAPP.web.tool/app.wsgi <Directory /var/www/html/FLASKAPP.web.tool> WSGIProcessGroup flaskapp WSGIApplicationGroup %{GLOBAL} Require all granted </Directory> # 设置WSGI专属超时(短于Apache全局Timeout) WSGIRequestTimeout 300 ProxyTimeout 300 </VirtualHost>
注意:python-home需指向虚拟环境根目录,而非bin目录;WSGIApplicationGroup %{GLOBAL}可避免部分Flask扩展因子解释器问题导致阻塞。
5. 确认文件权限与SELinux(若启用)
确保Apache进程拥有应用目录的完整访问权限:
sudo chown -R www-data:www-data /var/www/html/FLASKAPP.web.tool sudo chmod -R 755 /var/www/html/FLASKAPP.web.tool
若虚拟机启用了SELinux,需添加访问规则:
sudo setsebool -P httpd_can_network_connect on sudo chcon -Rt httpd_sys_content_t /var/www/html/FLASKAPP.web.tool
6. 查看详细日志定位阻塞点
在main.py中添加Flask日志配置,捕获应用启动时的错误:
import logging from logging.handlers import RotatingFileHandler # 配置日志文件 handler = RotatingFileHandler('/var/log/flaskapp.log', maxBytes=10000, backupCount=3) handler.setLevel(logging.INFO) app.logger.addHandler(handler)
创建日志文件并设置权限:
sudo touch /var/log/flaskapp.log sudo chown www-data:www-data /var/log/flaskapp.log
重启Apache后,访问页面,查看/var/log/flaskapp.log和/var/log/apache2/error.log的详细输出,定位具体阻塞原因。
内容的提问来源于stack exchange,提问作者HBi

