【问题标题】:Django Apache Redhat Permission denied, call to fopen() failedDjango Apache Redhat 权限被拒绝,调用 fopen() 失败
【发布时间】:2017-04-06 14:28:48
【问题描述】:

/var/log/httpd/error_log 说,

[Tue Nov 22 12:54:51.763863 2016] [mime_magic:error]  AH01512: mod_mime_magic: can't read /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py', referer: http://ipaddress/Live
[Tue Nov 22 12:54:51.763953 2016] [mime_magic:error]  AH01512: mod_mime_magic: can't read /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py', referer: http://ipaddress/Live
[Tue Nov 22 12:54:51.771547 2016] [:error]  (13)Permission denied: client ######## mod_wsgi (pid=39821, process='', application='omadi-trafcbi01.intranet.hdr|'): Call to fopen() failed for '/var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py'., referer: http://ipaddress/Live

我将我的项目从我的主文件夹移到 /var/www/ 以尝试修复权限问题(无济于事)。

这是我添加到 /etc/httpd/conf/httpd.conf 的内容,

WSGIScriptAlias / /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py
WSGIPythonPath /bin/python3/site-packages:/var/www/Django_Project/cbtraffic/cbTraffic
<Directory /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

我还有一个 /etc/httpd/sites-enabled/000-default 文件,

<VirtualHost *:80>
    WSGIScriptAlias / /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py
    <Directory "/var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic">
      Require all granted
    </Directory>
    WSGIDaemonProcess cbTraffic python-path=/var/www/Django_Project:/bin/python3/site-packages
    WSGIProcessGroup cbTraffic
    WSGIScriptAlias / /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py
</VirtualHost>

这是我的 wsgi.py 文件,

import os
import sys
import site
sys.path.append("/var/www/Django_Project/cbtraffic/cbTraffic")
sys.path.append("/var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py")
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cbTraffic.settings")
application = get_wsgi_application()

这是我第一次尝试在 Redhat 上启动 Django。任何帮助将不胜感激。

【问题讨论】:

  • 不相关,但在任何一个 Python 模块搜索路径选项中都不需要 /bin/python3/site-packages。只要您将python-pathWSGIDaemonProcess 修复为具有/var/www/Django_Project/cbtraffic/cbTraffic 的正确路径,您甚至根本不需要httpd.conf 中的任何东西。而且您也不需要wsgi.py 文件中的任何sys.path 内容。在默认站点的Directory 块中使用&lt;Files wsgi.py&gt; 可以使安全访问更加具体,但没有。

标签: python linux django apache mod-wsgi


【解决方案1】:

Appache 通常以httpd 用户身份运行。我会确保该用户至少对该目录具有读取权限。你可以试试:

chown -R httpd:httpd /var/www/Django_Project/    

【讨论】:

  • 我不确定组/用户是什么,因为 chown -R httpd:httpd /var/www/Django_Project/ 给了我错误“无效用户”。我用 find / -name httpd.conf | xargs grep -i "^user" 查找用户并查找 / -name httpd.conf | xargs grep -i "^group" 获取组。命令 chown -R apache:apache /var/www/Django_Project/ 成功,但我仍然遇到相同的权限问题。
  • /var/www 的权限是什么?
  • 我将 /etc/selinux/config 更改为 SELINUX=permissive 并通过 "echo 0 > /sys/fs/selinux/enforce" 运行 /sys/fs/selinux/envorce 这使得之前的错误消失了!我现在收到错误“没有名为 django.core.wsgi 的模块”,错误发生在我的 wsgi.py 文件中的“from django.core.wsgi import get_wsgi_application”行中
【解决方案2】:

我最初的问题是 Selinux。我去了 /etc/selinux/config 并更改了文件,以便

SELINUX=许可

之前,我的档案说

SELINUX=强制执行

此更改消除了权限错误。

从那里我遇到了其他错误,无法导入站点或无法导入 django.core.wsgi。

我去了 Django 文档https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/ 并添加了一个 virtualenv 并在守护程序模式下使用了 mod_wsgi。

我遇到的总体问题是使用 Python 2 的 apache。我会收到一条小消息,告诉我正在跳过加载 mod_wsgi,

"AH01574: module wsgi_module is already loaded, skipping". 

原来我在机器上安装了 mod_wsgi(python 2 的版本)。我删除了这个并在运行 service httpd start 时出现错误,

"httpd: Syntax error on line 379 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_wsgi.so into server: /etc/httpd/modules/mod_wsgi.so: cannot open shared o...file or directory"

原来 mod_wsgi 没有加载。好吧,我忘了用新的 virtualenv 位置为 python 3 制作 mod_wsgi。

我使用这些说明让 mod_wsgi 在 Redhat 上使用 Python 3

https://code.google.com/p/modwsgi/wiki/DownloadTheSoftware

cd /usr/local/src
sudo wget https://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
sudo tar -zxvf mod_wsgi-3.4.tar.gz 
cd mod_wsgi-3.4/
sudo ./configure --with-python=/usr/bin/python3.3
sudo make
sudo make install
mod_wsgi.so is placed in /usr/lib/apache2/modules/

但是这次我在我的 virtualenv 中使用了我的 python3 路径。我也在安装我的 pip 包,“

pip install -I <name>

"。-I 将在您的虚拟环境中安装包(而不是使用全局站点包)。

这是我的 /etc/httpd/conf/httpd.conf 文件的主要部分:

WSGIScriptAlias / /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py process-group=example.com


WSGIDaemonProcess example.com python-path=/var/www/Django_Project/cbtraffic/cbTraffic:/usr/lib/python3.4/site-packages/cbenv/lib/python3.4/site-packages
WSGIProcessGroup example.com


<Directory /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

然后在我的 /etc/httpd/conf/httpd.conf 文件的底部:

LoadModule wsgi_module /etc/httpd/modules/mod_wsgi.so
Include /etc/httpd/sites-enabled/000-default
IncludeOptional conf.d/*.conf

这会加载您创建的 mod_wsgi.so 文件。如您所见,我还有一个 sites-enabled/000-default 文件。以下是这些内容:

<VirtualHost *:80>
    WSGIScriptAlias / /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py
    <Directory "/var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic">
      Require all granted
    </Directory>


WSGIDaemonProcess cbTraffic python-path=/var/www/Django_Project:/usr/lib/python3.4/site-packages/cbenv/lib/python3.4/site-packages
    WSGIProcessGroup cbTraffic
    WSGIScriptAlias / /var/www/Django_Project/cbtraffic/cbTraffic/cbTraffic/wsgi.py




</VirtualHost>

【讨论】:

  • 不要使用 Google 代码站点中与 mod_wsgi 相关的任何内容。那是谷歌不会让你删除的旧文档。目前最新的 mod_wsgi 版本是 4.5.7。比 3.4 更新的多。不要使用 3.4。另请参阅有关如何在 modwsgi.readthedocs.io/en/develop/user-guides/… 设置 Python 虚拟环境的更多最新文档,您不应在 python-path 中使用 site-packages 来设置 Python 虚拟环境。
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2020-09-30
  • 2012-03-12
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
相关资源
最近更新 更多