我正在尝试使用apache部署mod_wsgi来运行django应用程序,但是我收到错误500内部服务器错误apache日志显示:
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] mod_wsgi (pid=16142): Exception occurred processing WSGI script '/home/user/bms/apache/django.wsgi'.
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] Traceback (most recent call last):
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] File "/home/user/bms/apache/django.wsgi", line 13, in <module>
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] import django.core.handlers.wsgi
[Thu Jun 23 14:01:47 2011] [error] [client 152.78.95.64] ImportError: No module named django.core.handlers.wsgi
我的apache虚拟主机如下:
<VirtualHost *:80>
DocumentRoot /home/user/bms
<Directory /home/user/bms>
Order allow,deny
Allow from all
</Directory>
WSGIDaemonProcess bms user=user group=user processes=2 threads=25 python-path=/usr/local/lib/python2.7/site-packages
WSGIProcessGroup bms
WSGIScriptAlias / /home/user/bms/apache/django.wsgi
</VirtualHost>
我的app目录中引用的wsgi文件具有0777权限:
import os
import sys
path = '/home/user/bms'
if path not in sys.path:
sys.path.append(path)
os.environ['DJANGO_SETTINGS_MODULE'] = 'bms.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
我听说这可能是因为apache用户没有正确的权限。但是我不知道如何解决这个问题。我也试过用www-data用户启动deamon,但这并没有解决问题。
修改:
我通过将虚拟主机文件复制到默认主机文件然后使用a2dissite禁用旧主机文件来解决此问题。我不知道我怎么能“正确地”做到这一点并设置它以便apache进入我想要它的虚拟主机。
答案 0 :(得分:48)
对我来说问题是wsgi python版本不匹配。我使用的是python 3,所以:
$ sudo apt-get remove libapache2-mod-python libapache2-mod-wsgi
$ sudo apt-get install libapache2-mod-wsgi-py3
在复制/粘贴这些命令之前,来自@alxs 的警告:
如果服务器上运行的python 2项目使用wsgi和apache,则上述命令将有效地关闭它们。
答案 1 :(得分:18)
对我来说,问题是WSGI脚本不可执行。
sudo chmod a+x django.wsgi
或只是
sudo chmod u+x django.wsgi
只要您拥有正确的所有者
答案 2 :(得分:5)
我在日志中遇到此错误消息的类似问题:
目标WSGI脚本'/home/web2py/wsgihandler.py'无法作为Python模块加载。
解决方案是从/etc/httpd/conf.d/wsgi.conf
删除不正确的WSGIPythonHome指令(指向应用程序目录)
我在使用CentOS存储库的RedHat上。
建议遵循Graham Dumpleton的安装/配置说明。针对helloworld应用程序的测试配置向我显示mod_wsgi
正在运行且配置有问题。
但是,错误消息几乎没有提供任何错误的线索。
答案 3 :(得分:5)
我遇到了同样的问题,起初我没有意识到我可以向下滚动并查看实际的错误消息。就我而言,这是一个导入错误:
ImportError: No module named bootstrap3
通过pip(pip install django-bootstrap3)安装后,我重新启动了Apache,它运行良好。
答案 4 :(得分:2)
我知道这个问题已经很老了,但是我刚才用这个问题摔了八个小时。如果您的系统启用了SELinux并且您已将virtualenv放在特定位置,则mod_wsgi将无法将指定的python-path
添加到site-packages。它也不会引起任何错误;事实证明,它用于将指定的python-path
添加到站点包的机制是使用Python site
模块,特别是site.adduserdir()
。如果目录丢失或无法访问,此方法不会引发任何错误,因此mod_wsgi也不会引发任何错误。
无论如何,请尝试使用
关闭SELinuxsudo setenforce 0
或确保您运行Apache的进程具有SELinux的相应ACL,以访问virtualenv所在的目录。
答案 5 :(得分:1)
就我自己在xampp中的Windows上的情况而言,我错误地在wsgi.py文件中加载了应用程序路径,如下所示:
<强> 不正确 强>:
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "advisory_portal.settings")
application = get_wsgi_application()
sys.path.append('C:/xampp/htdocs/advisory_portal/advisory_portal')
sys.path.append('C:/xampp/htdocs/advisory_portal')
而不是:
<强> 正确: 强>
import sys
sys.path.append('C:/xampp/htdocs/advisory_portal/advisory_portal')
sys.path.append('C:/xampp/htdocs/advisory_portal')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "advisory_portal.settings")
application = get_wsgi_application()
不要忘记导入sys python包
答案 6 :(得分:1)
你没有WSGIDaemonProcess选项吗?
我在家中设置mod_wsgi没有问题,但没有守护进程选项就做到了。你提到通过移动虚拟主机文件解决问题,我在WSGIDaemonProcess的文档中注意到这一点:
还要注意守护进程的名称 进程组必须是唯一的 整个服务器。也就是说,事实并非如此 可以使用相同的守护进程 进程组名称不同 虚拟主机。
不知道这是不是巧合。
答案 7 :(得分:1)
在wsgi.py
中添加路径是方向,但不是附加django
附加路径sys.path.append("/path/to/virtual/environment/lib/pythonX.X/site-packages")
固定了我的情况。
这是针对在ubuntu 16.04上使用python2.7的Django项目。
答案 8 :(得分:0)
确保我的项目的 venv
文件夹位于我的项目的根目录中为我解决了这个问题。
答案 9 :(得分:0)
我建议尝试将DJANGO降级到版本2.1.1
。
答案 10 :(得分:0)
有时候,当我陷入困境时,我会硬编码在wsgi文件中投影的路径,例如:
testGlob.py
答案 11 :(得分:0)
我有同样的错误
目标WSGI脚本无法作为Python模块加载
这是因为apache.conf中未添加python路径
根据Apache和Ubuntu版本,您需要使用pythonWSGIPath更新apache.conf或httpd.conf文件。
就我而言,我需要编辑apache.conf
sudo nano /etc/apache2/apache2.conf
然后在末尾添加以下行(将my_project更改为您的项目名称)
WSGIPythonPath /var/www/my_project
一切都充满魅力
答案 12 :(得分:0)
我收到此错误。我在虚拟环境中使用python 3 在我的apache日志中找到了
[2018年12月21日星期五08:01:43.471561] [mpm_prefork:notice] [pid 21786] AH00163:Apache / 2.4.6(红帽企业版Linux)mod_wsgi / 3.4 配置了Python / 2.7.5-恢复正常操作
我已经使用yum -y install mod_wsgi
安装了wsgi。这已经安装了为python 2编译的mod_wsgi。所以我将其卸载了
yum remove mod_wsgi
并安装了使用python 3编译的mod_wsgi
yum install python35u-mod_wsgi
此后有效
答案 13 :(得分:0)
在尝试了许多失败之后,最终对我有用的解决方案很简单,但却难以捉摸,因为我一直在努力找出实际使用的路径。
我使用以下命令创建了一个基于django的夹层项目。我在这里列出它们以使路径明确。
/var/www/mysite$ python3 -m venv ./venv
/var/www/mysite$ source ./venv/bin/activate
(venv) /var/www/mysite$ mezzanine-project mysite
(venv) /var/www/mysite$ cd mysite
(venv) /var/www/mysite/mysite$
现在,wsgi.py文件的路径是:
/var/www/mysite/mysite/mysite/wsgi.py
在我的/etc/apache2/sites-available/mysite.conf
文件中用于此安装的指令如下:
...<VirtualHost...>
...
WSGIDaemonProcess mysite python-home=/var/www/mysite/venv python-path=/var/www/mysite/mysite
WSGIProcessGroup mysite
WSGIScriptAlias / /var/www/mysite/mysite/mysite/wsgi.py process-group=accounting
<Directory /var/www/mysite/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
...
</VirtualHost>...
我尝试了多个版本的python-home和python-path,并反复出现OP错误。在这里使用正确的路径还应完成与@Dev's answer相同的功能,而不必在wsgi.py文件中添加路径(由mezzanine提供,在我的情况下无需进行编辑)。
答案 14 :(得分:0)
我遇到了同样的问题,并且使用
解决了sudo easy_install cx_Oracle
但是请记住在使用easy_install
安装cx_oracle之前先取消安装。
卸载命令:pip uninstall cx_oracle
答案 15 :(得分:0)
我遇到了类似的问题,例如apache日志错误“ wsgi.py无法作为Python模块加载”。
事实证明,我不得不停止然后再启动apache,而不仅仅是重启它。
答案 16 :(得分:0)
添加到列表中,这就是我如何使用它。
我试图从源代码安装CentOS 7上的CKAN 2.7.2并不断遇到此错误。 对我而言,这是因为SELinux已启用。我不需要禁用它。相反,在阅读https://www.endpoint.com/blog/2010/10/13/selinux-httpd-modwsgi-26-rhel-centos-5后,我发现打开httpd_can_network_connect修复了它:
setsebool -P httpd_can_network_connect on
从该页面开始:
httpd_can_network_connect - 允许httpd建立网络连接, 包括你将在数据库中制作的本地文件
答案 17 :(得分:0)
如果在virtualenv中安装项目的Python依赖项,则还需要将此virtualenv目录的路径添加到Python路径中。为此,请为WSGIPythonPath指令添加一个额外的路径,如果使用类似UNIX的系统,则使用冒号(:)分隔多个路径;如果使用Windows,则使用分号(;)
答案 18 :(得分:0)
由于这个问题变成了一个用于收集问题解决方案的池,这些问题会导致错误,并将此问题作为标题,我也想添加这个问题。
就我而言,我想在Ubuntu 16.04.2上使用Apache和WSGI运行OpenStack Keystone(Ocata)。这些流程开始,但一旦我查询了keystone,我就会
mod_wsgi (pid=20103): Target WSGI script '/opt/openstack/bin/keystone-wsgi-public' cannot be loaded as Python module.
我有两个vhost,一个有
WSGIDaemonProcess keystone-public ...
WSGIProcessGroup keystone-public ...
而另一个人
WSGIDaemonProcess keystone-admin ...
WSGIProcessGroup keystone-admin ...
我通过重命名解决了这个问题。 vhost条目现在显示为:
WSGIDaemonProcess kst-pub ...
WSGIProcessGroup kst-pub ...
和
WSGIDaemonProcess kst-adm ...
WSGIProcessGroup kst-adm ...
我没有进一步调查。解决了我的工作。