【问题标题】:403 error on Apache Server with Django application带有 Django 应用程序的 Apache 服务器上的 403 错误
【发布时间】:2013-11-03 18:21:00
【问题描述】:

我一直在整个网站上寻找解决方案,但一直没有找到。我有一个带有 Apache 2.2.15、Django 1.6 和 mod_wsgi 3.2 的 CentOS 6.4 服务器。我使用 Apache 来显示静态文件和 mod_wsgi 来显示 Django 内容。

由于this page,我将Django项目文件放在了/srv目录下。

当我运行 Django 开发服务器时,我编写的测试页面正确显示。但是,当我启动我的 Apache 服务器并访问 127.0.0.1 时,我收到 403 Forbidden 错误。

django.wsgi(在 /srv/mysite 中)

import os
import sys

envpath = '/usr/lib/python2.6/site-packages'

pwd = os.path.dirname(os.path.abspath(__file__))
os.chdir(pwd)
sys.path = [env] + sys.path

os.environ['PYTHON_EGG_CACHE'] = '/srv/mysite/.python-egg'
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

site.addsitedir(envpath)

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandlers()

httpd.conf

WSGIScriptAlias / /srv/mysite/django.wsgi
WSGIPythonPath /srv/mysite
<more aliases and tags in order to get the right static files to show>

httpd.conf 文件中,列出的用户和组是默认的apache。我在/srv 目录上运行了ls -l,它的所有者和组被列为root。所以,我运行了sudo chown -R apache:apache /srv/mysite,它更改了目录和所有子目录以使用apache 作为所有者和组。

但是,无论我如何谷歌或尝试,我都无法克服这个 403 错误。

编辑:

我发现当我禁用 SELinux 并且 http.conf 文件中的 WSGIPythonPath 变量为 django.wsgi 时,会导致 500 Internal Server 错误。但是,当我将其更改为 wsgi.py 时,我的网站会正常显示。我很好奇为什么会这样。

无论如何,由于这将是一台生产机器,我更喜欢让 SELinux 保持打开状态并弄清楚如何获得适当的权限。

编辑 2:

我已经编辑了我的 django.wsgi 文件(上面已更改)ala this link

编辑 3:

我尝试将我的项目文件移动到我的 /home/ 文件夹中。我一直在尝试django.wsgiwsgi.py 之间交替,但仍然无法通过 403 Forbidden 错误。我认为这最初是 /srv 目录的权限问题,但似乎情况并非如此......我正在尝试解决这个问题,但没有任何效果。

编辑 4:

我决定暂时只保留开发服务器......但我仍然需要让它工作,我已经走到了尽头。有没有人可以帮助我?

【问题讨论】:

    标签: django apache centos mod-wsgi selinux


    【解决方案1】:

    SELinux 有自己的授予访问权限的系统。必须根据 SELinux 上下文授予您的进程访问文件系统上的文件的权限。 SELinux 中定义了一些默认的政治和上下文,它们对于您安装的默认情况很有用。预计只有 Web 文件位于“/var/www”中。您主要可以使用开关“-Z”检查文件或进程的当前上下文,请参阅

    [root@localhost]#  ls -Z /var
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 www
    

    检查 /srv/mysite 的上下文

    [root@localhost]#  ls -Z /srv
    drwxr-xr-x. root root system_u:object_r:var_t:s0       mysite
    

    允许 Apache HTTPD 服务器访问 SELinux 类型为 httpd_sys_content_t 的文件,但不允许访问 SELinux 类型为 var_t 的文件。

    1.更改目录的 SELinux 类型并检查上下文

    [root@localhost]#  chcon -R -t  httpd_sys_content_t /srv/mysite
    [root@localhost]#  ls -Z /srv
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 mysite
    

    检查您的网站现在是否正常工作。

    到目前为止,它还没有完成,当您将文件系统重新标记为默认值或使用守护程序检查或重新标记自身时,您可能会丢失新的标签。

    2。为您的目录设置默认标签

    通过“semange”创建默认标签并通过“restorecon”将其应用到您的目录

    [root@localhost]#  semanage fcontext -a -t httpd_sys_content_t /srv/mysite
    [root@localhost]#  restorecon -v -R /srv/mysite
    [root@localhost]#  ls -Z /srv
    drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 mysite
    

    现在您的 SELinux 标签已修复。

    注意:可以用正则表达式来定义默认上下文。

    Debian:我不是Debian用户,所以SELinux类型可能会有点不同,原理是一样的,检查你的apache目录的SELinux类型并在你的您希望从 apache 访问的目录。


    在 RedHat 了解更多信息: https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-SELinux_Contexts_Labeling_Files-Persistent_Changes_semanage_fcontext.html

    Fedora SELinux 文档: http://docs.fedoraproject.org/en-US/Fedora/13/html/Security-Enhanced_Linux/

    【讨论】:

    • 感谢您的回复,抱歉回复太晚了。我跟着你的第一步,效果很好。然后我继续进行第 2 步,但在那之后,该网站不再工作,给我返回相同的 403 错误。我还注意到ls -Z /srv 的输出是system_u:object_r 而不是unconfined_u:object_r。这种差异重要吗?
    • 如果您使用目标策略(即类型强制策略),system_u 和 unconfined_u SELinux 用户之间没有区别,因为只检查 SELinux 类型。如果第 2 步不起作用,还有一条默认标签规则,通过“ls -Z /srv”检查 SELinux 上下文,并通过“semanage fcontext -l|grep /srv”检查默认标签。
    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2017-08-30
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多