子域名Apache部署Flask应用遇Python导入及访问异常求助
子域名Flask应用Apache部署404及开发服务器访问超时问题
主域名domain.com静态页面运行正常,但子域名propman.domain.com部署的Flask应用出现以下问题:
- 直接运行Flask开发服务器时本地可访问,但外部访问
http://10.13.0.107:8080超时 - 通过Apache访问
propman.domain.com或propman.domain.com/propman均返回404错误
现有配置文件
1. Apache子域名配置(/etc/apache2/sites-available/propman.domain.com.conf)
<VirtualHost *:80> LogLevel debug ServerName propman.domain.com ServerAlias www.propman.domain.com ServerAlias localhost ServerAdmin user@domain.com WSGIDaemonProcess flaskapp user=www-data group=www-data threads=5 WSGIScriptAlias /propman /var/www/propman/test1.wsgi # DocumentRoot /var/www/propman <Directory /var/www/propman> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> Alias /propman/static /var/www/propman/web/static <Directory /var/www/propman/web/static> Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/propman_error.log CustomLog ${APACHE_LOG_DIR}/propman_access.log combined </VirtualHost>
2. Flask WSGI脚本(/var/www/propman/test1.wsgi)
import logging import sys logging.basicConfig(stream=sys.stderr) sys.path.insert(0, '/var/www/propman/') activate_this = '/var/www/propman/.venv/bin/activate_this.py' with open(activate_this) as file: exec(file.read(), dict(__file__=activate_this)) from test1 import application
3. Flask应用代码(/var/www/propman/test1.py)
from flask import Flask application = Flask(__name__) @application.route("/") def hello(): return "Hello world!" if __name__ == "__main__": application.run(host="0.0.0.0", port=8080, debug=True)
已执行操作
- 在
/var/www/propman目录创建虚拟环境并安装Flask - 设置文件/目录权限(未包含
.venv目录) - 启用Apache站点并重启服务,配置测试无错误
- 虚拟环境内运行Flask开发服务器,本地可正常访问
解决方案
1. 修复Apache部署的404错误
问题根源
WSGIScriptAlias将/propman映射到WSGI脚本,但Flask应用的路由是/,导致请求/propman时Flask无法匹配对应路由- WSGI守护进程未指定虚拟环境路径,Apache可能使用系统Python而非虚拟环境的Python,导致无法找到Flask模块
.venv目录权限未开放给www-data用户,Apache无法读取虚拟环境内的依赖
修改步骤
(1)更新Apache子域名配置
修改/etc/apache2/sites-available/propman.domain.com.conf,添加虚拟环境路径并调整WSGI映射:
<VirtualHost *:80> LogLevel debug ServerName propman.domain.com ServerAlias www.propman.domain.com ServerAdmin user@domain.com # 指定虚拟环境路径,替代activate_this脚本 WSGIDaemonProcess flaskapp user=www-data group=www-data threads=5 python-home=/var/www/propman/.venv WSGIProcessGroup flaskapp # 将整个子域名根路径映射到WSGI脚本 WSGIScriptAlias / /var/www/propman/test1.wsgi <Directory /var/www/propman> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> Alias /static /var/www/propman/web/static <Directory /var/www/propman/web/static> Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/propman_error.log CustomLog ${APACHE_LOG_DIR}/propman_access.log combined </VirtualHost>
若需将Flask应用挂载在
/propman路径下,需:
- 保持
WSGIScriptAlias /propman /var/www/propman/test1.wsgi- 在Flask代码中添加
application.config['APPLICATION_ROOT'] = '/propman'
(2)简化WSGI脚本
删除activate_this相关代码,修改/var/www/propman/test1.wsgi:
import logging import sys logging.basicConfig(stream=sys.stderr) sys.path.insert(0, '/var/www/propman/') from test1 import application
(3)修复虚拟环境权限
确保www-data用户能访问虚拟环境:
sudo chown -R www-data:www-data /var/www/propman/.venv sudo chmod -R 755 /var/www/propman/.venv
(4)重启Apache服务
sudo apachectl --configtest sudo service apache2 restart
2. 解决开发服务器访问超时问题
直接运行Flask开发服务器时,外部访问超时是因为服务器防火墙未开放8080端口,执行以下命令开放端口:
sudo ufw allow 8080/tcp
注意:开发服务器仅用于测试,生产环境必须使用Apache+WSGI部署,禁止直接暴露开发服务器。
内容的提问来源于stack exchange,提问作者jordanthompson
相关产品推荐
相关产品推荐

