Apache表示打开文件读取错误:权限被拒绝。

8
我正在尝试使用apache(2.2.22)和mod_wsgi(3.4)运行一个django(1.6)项目。我的python版本是2.7.3,这是ubuntu 12.04的默认版本。我已经将从/var/www到子目录下的所有内容都设置为chmod 777。不幸的是,它给了我“打开文件进行读取时出错:权限被拒绝”,然后是“wsgi.py的脚本头过早结束”的错误。有人能告诉我我做错了什么吗?我在这里发布我的error.log。
root@whq-4:/var/www/Imse_dev2/Imse/Imse# tail -f /var/log/apache2/error.log 
[Tue Jan 14 14:16:04 2014] [notice] caught SIGTERM, shutting down
[Tue Jan 14 14:16:08 2014] [notice] Apache/2.2.22 (Ubuntu) mod_wsgi/3.4 Python/2.7.3      configured -- resuming normal operations
[Tue Jan 14 14:16:28 2014] [error] /var/www/Imse_dev2/Imse
Error opening file for reading: Permission denied
[Tue Jan 14 14:21:32 2014] [error] [client 127.0.0.1] Premature end of script headers:   wsgi.py
[Tue Jan 14 14:29:13 2014] [notice] caught SIGTERM, shutting down
[Tue Jan 14 14:29:13 2014] [notice] Apache/2.2.22 (Ubuntu) mod_wsgi/3.4 Python/2.7.3  configured -- resuming normal operations
[Tue Jan 14 14:29:17 2014] [error] /var/www/Imse_dev2/Imse
Error opening file for reading: Permission denied
[Tue Jan 14 14:34:21 2014] [error] [client 127.0.0.1] Premature end of script headers:  wsgi.py

并且还有我的httpd.conf文件。
#LimitRequestLine 200475
#LimitRequestFieldSize 200475

WSGIDaemonProcess imse_dev2_wsgi python-path=/var/www/Imse_dev2/Imse/Imse


#LoadModule deflate_module modules/mod_deflate.so
#LoadModule headers_module modules/mod_headers.so

<VirtualHost *:80>
    ServerName whq-4
    DocumentRoot /var/www/
    #Header set Access-Control-Allow-Origin "*"
    Alias /static /var/www/Imse_dev2/Imse/static
    Alias /favicon.ico /var/www/favicon.ico
#       Header set Access-Control-Allow-Origin "*"


    <Directory /var/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride None
            Order allow,deny
            allow from all
    </Directory>


    WSGIScriptAlias /imse_dev2 /var/www/Imse_dev2/Imse/Imse/wsgi.py
    <Directory /var/www/Imse_dev2/Imse/Imse>
            WSGIProcessGroup imse_dev2_wsgi
            <Files wsgi.py>
                    Order deny,allow
                    Allow from all
            </Files>
    </Directory>

    <IfModule mod_headers.c>
             Header set Access-Control-Allow-Origin "*"
    </IfModule>

</VirtualHost>

我认为对于 Apache 2.2,你应该使用 mod_wsgi 3.3。 - yuvi
好的,让我试一下... - Sayantan
完全没有头绪,这可能是一个微不足道的问题,但我正在苦苦挣扎。 - Sayantan
我搜索了很多,但仍然没有解决,apache2无法访问我的项目根目录。 - Sayantan
不确定是否正确,但我注意到您在<Directory>中有/var/www/Imse_dev2/Imse/Imse,但错误是针对/var/www/Imse_dev2/Imse(少了一个Imse)。如果第一个路径是正确的,则它可能不应该尝试将/var/www/Imse_dev2/Imse打开为文件,因为它似乎是一个目录。 - Mark
2个回答

0
问题是,Django不允许您访问应用程序所在目录之外的文件。例如,如果您的应用程序正在运行/var/www/project,而您想要访问的文件位于/var/www/foo,则Django将引发您正在遇到的异常。
解决方案是将您尝试访问的目录移动到项目目录中。

我认为Django本身并不会对您可以访问哪些文件施加任何限制...您是指Apache吗? - Mark
嗨,马克,不,我确实是指Django本身。它曾经检查过您是否尝试访问项目路径之外的内容...我之前也遇到过这个问题,但我无法确认当前版本中是否仍然存在此检查...但您可以参考谷歌,看看它以前发生了多少次:https://www.google.com.br/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=django%20file%20upload%20suspiciousoperation - Carlos H Romano
好的,对于上传的文件,它会检查目录。我认为 Django 会将其与 MEDIA_ROOT 进行比较,而不是 Apache 配置。我非常确定这不是问题所在(没有提到上传文件),但这是一个很好的提示,可能会导致类似的问题。 - Mark

0
看你的 httpd.conf 和对应的错误消息,似乎是目录有问题。
/var/www/Imse_dev2/Imse/Imse

可能是由于apache用户(即拥有apache进程的用户)无法读取该文件,或者该目录对于apache用户来说不可执行。可以通过以下方式使所有用户都能够看到该目录:

chmod 755 /var/www/Imse_dev2/Imse/Imse

但我认为您的Apache文档根目录下可能还有其他不可读的目录。除非您有特定的原因,否则我会将文档根目录下的所有文件和目录都归属于Apache用户,就像这样:

chown -R apache /var/www/Imse_dev2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接