Apache同IP同端口如何通过不同路径访问多个Flask应用
实现方案:Apache配置同端口多Flask项目路径分发
可以实现,通过Apache的mod_wsgi模块配合别名规则即可完成需求,具体操作步骤如下:
前置准备
首先安装必要的Apache模块和依赖:
- Debian/Ubuntu系统执行:
sudo apt update sudo apt install apache2 libapache2-mod-wsgi-py3 sudo a2enmod wsgi
- CentOS/RHEL系统执行:
sudo dnf install httpd python3-mod_wsgi sudo systemctl enable httpd
步骤1:编写各项目的WSGI入口文件
分别给两个Flask项目创建WSGI启动文件,示例如下:
flask1项目
在/var/www/flask1/目录下创建app.wsgi,内容如下:
# 若使用虚拟环境,先激活虚拟环境 # activate_this = '/var/www/flask1/venv/bin/activate_this.py' # with open(activate_this) as f: # exec(f.read(), {'__file__': activate_this}) import sys sys.path.insert(0, '/var/www/flask1') # 假设你的Flask实例在app.py文件中,实例名称为app,按需修改 from app import app as application
flask2项目
在/var/www/flask2/目录下创建app.wsgi,内容如下:
# 若使用虚拟环境,先激活虚拟环境 # activate_this = '/var/www/flask2/venv/bin/activate_this.py' # with open(activate_this) as f: # exec(f.read(), {'__file__': activate_this}) import sys sys.path.insert(0, '/var/www/flask2') # 假设你的Flask实例在app.py文件中,实例名称为app,按需修改 from app import app as application
步骤2:修改Apache虚拟主机配置
编辑默认80端口的站点配置文件:
- Debian/Ubuntu路径:
/etc/apache2/sites-available/000-default.conf - CentOS/RHEL路径:
/etc/httpd/conf.d/httpd.conf
在<VirtualHost *:80>标签内添加以下配置:
# 配置flask1路径分发 Alias /flask1 /var/www/flask1 WSGIScriptAlias /flask1 /var/www/flask1/app.wsgi <Directory /var/www/flask1> Require all granted AllowOverride All </Directory> # 配置flask2路径分发 Alias /flask2 /var/www/flask2 WSGIScriptAlias /flask2 /var/www/flask2/app.wsgi <Directory /var/www/flask2> Require all granted AllowOverride All </Directory>
步骤3:调整Flask项目适配路径前缀
需要给两个Flask项目配置应用根路径,避免路由出错:
- flask1项目入口文件(如app.py)中添加:
app.config['APPLICATION_ROOT'] = '/flask1'
- flask2项目入口文件(如app.py)中添加:
app.config['APPLICATION_ROOT'] = '/flask2'
该配置会自动给项目内所有路由、url_for生成的路径加上对应前缀,无需手动修改路由规则
步骤4:配置权限并重启服务
- 给Apache运行用户授予项目目录权限:
sudo chown -R www-data:www-data /var/www/flask1 /var/www/flask2
- 安装项目依赖(若使用虚拟环境需先激活对应虚拟环境):
cd /var/www/flask1 pip3 install -r requirements.txt cd /var/www/flask2 pip3 install -r requirements.txt
- 测试Apache配置合法性:
# Debian/Ubuntu sudo apache2ctl configtest # CentOS/RHEL sudo httpd -t
- 配置返回
Syntax OK后重启Apache服务生效:
# Debian/Ubuntu sudo systemctl restart apache2 # CentOS/RHEL sudo systemctl restart httpd
常见问题排查
- 访问返回403:检查项目目录权限、SELinux状态(CentOS可临时关闭
sudo setenforce 0验证) - 访问返回500:查看Apache错误日志定位问题,日志路径为
/var/log/apache2/error.log(Debian/Ubuntu)或/var/log/httpd/error_log(CentOS/RHEL) - 路由404:确认Flask项目已配置
APPLICATION_ROOT参数
内容的提问来源于stack exchange,提问作者Raymond
相关产品推荐
相关产品推荐

