1

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

/srv由于这个页面,我将 Django 项目文件放在了目录中。

当我运行 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目录上运行了 a /srv,它的所有者和组被列为root. 因此,我运行了sudo chown -R apache:apache /srv/mysite它更改了目录和所有子目录以apache用作所有者和组。

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

编辑:

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

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

编辑2:

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

编辑 3:

我尝试将我的项目文件移动到我的 /home/ 文件夹中。我一直在尝试django.wsgiwsgi.py仍然无法克服 403 Forbidden 错误。我认为这最初是/srv目录的权限问题,但似乎情况并非如此......我试图弄清楚这一点,但没有任何效果。

编辑4:

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

4

1 回答 1

4

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/

于 2013-11-04T17:06:44.517 回答