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

部署在Ubuntu 18.04 VPS的Flask应用(Apache2)非静态路径无法访问

解决Ubuntu 18.04 Apache部署Flask应用路由与文件访问问题

看起来你的问题主要来自两个核心点:文件路径错误和Apache配置的权限/语法问题,下面一步步帮你解决:

1. 修复文件路径问题(最直接的错误来源)

从你给出的错误日志FileNotFoundError: [Errno 2] No such file or directory: '/data/categories/categories.json'可以看出,你的代码里误用了绝对路径/data/...,但实际这个目录在/var/www/FlaskApp/FlaskApp/data/下。

当Flask应用通过Apache WSGI运行时,进程的工作目录不是你的应用目录,所以绝对路径写错、或者用相对路径都会导致找不到文件。正确的做法是用Flask提供的app.root_path来构建文件的绝对路径:

比如在你的Flask应用代码里:

import os
from flask import Flask

app = Flask(__name__)

# 构建data目录的绝对路径,基于应用根目录
DATA_ROOT = os.path.join(app.root_path, 'data')

# 读取categories.json时使用这个路径
def get_categories():
    file_path = os.path.join(DATA_ROOT, 'categories', 'categories.json')
    with open(file_path, 'r') as f:
        # 处理JSON内容
        pass

这样不管应用在哪里运行,都能正确找到文件。

2. 更新Apache配置的语法与权限

Ubuntu 18.04使用的是Apache 2.4,而你配置里的Order allow,deny和Allow from all是Apache 2.2的旧语法,在2.4里已经被替换,可能会导致权限限制,影响路由访问。

修改你的VirtualHost配置:

<VirtualHost *:80>
ServerName <ServerName>
ServerAdmin <ServerAdmin>
WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi

<Directory /var/www/FlaskApp/FlaskApp/>
    Require all granted
</Directory>

Alias /static /var/www/FlaskApp/FlaskApp/static
<Directory /var/www/FlaskApp/FlaskApp/static/>
    Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

3. 确保WSGI进程有文件读取权限

Apache的WSGI进程默认以www-data用户运行,需要确保这个用户能读取你的data目录及其中的文件:

# 更改data目录的所有者为www-data
sudo chown -R www-data:www-data /var/www/FlaskApp/FlaskApp/data
# 设置合适的权限,确保用户能读取文件
sudo chmod -R 755 /var/www/FlaskApp/FlaskApp/data

4. 验证Flask路由与WSGI导入

检查你的Flask应用主文件(比如/var/www/FlaskApp/FlaskApp/__init__.py)是否正确注册了路由,并且WSGI文件里的导入路径正确:

  • 确保__init__.py里有类似这样的路由定义:
    @app.route('/')
    def index():
        return "Hello from Flask!"
    
  • 确认flaskapp.wsgi里的from FlaskApp import app as application是正确的(你的应用包名确实是FlaskApp,且app对象在__init__.py中定义)。

5. 重启Apache生效配置

最后,重启Apache服务让所有修改生效:

sudo systemctl restart apache2

做完这些步骤后,你的Flask路由应该能正常访问,data目录的文件也能正确读取了。

内容的提问来源于stack exchange,提问作者YKerem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:12:32