You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子域名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:39:59