使用Django应用程序在Apache Server上出现403错误

时间:2013-10-24 20:38:19

标签: django apache centos mod-wsgi selinux

我一直在寻找这个网站的解决方案,但一直找不到。我有一个带有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。我在ls -l目录上运行了/srv,其所有者和组列为root。因此,我运行了sudo chown -R apache:apache /srv/mysite,它将目录和所有子目录更改为使用apache作为所有者和组。

然而,无论我谷歌或尝试多少,我都无法克服403错误。

编辑:

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

在任何情况下,由于这将是一台生产机器,我更喜欢保持SELinux,并找出如何获得适当的权限。

编辑2:

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

编辑3:

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

编辑4:

我决定暂时坚持开发服务器......但是我仍然需要让它工作,我就在我的绳索的最后。那里有人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

SELinux拥有自己的授予访问权限的系统。必须根据SELinux上下文授予您访问文件系统文件的进程权限。在SELinux中定义了一些默认的政治和上下文,它们对于您的安装的默认情况很有用。只是网络文件应该在'/ 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。为您的目录制作默认的labaling

通过'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/