【问题标题】:Django mod_wsgi: Exception occurred processing wsgi scriptDjango mod_wsgi:处理 wsgi 脚本时发生异常
【发布时间】:2014-06-09 14:15:02
【问题描述】:

我正在部署一个 django 项目并遇到此错误。

我的项目结构如下:

my_project
   my_project
      urls.py
      settings.py
      index.wsgi
      home
         views.py
         models.py
         .........

    requirements.txt
    manage.py

我的 index.wsgi 如下所示:

import os
import sys
import site

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('~/.virtualenvs/my_project/lib/python2.6/site-packages/')

# Add the app's directory to the PYTHONPATH
sys.path.append('/var/www/uni/my_project')
sys.path.append('/var/www/uni/my_project/home')

os.environ['DJANGO_SETTINGS_MODULE'] = 'my_project.settings'

# Activate your virtual env
activate_env=os.path.expanduser("/home/user/.virtualenvs/my_project/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

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

在我的虚拟主机中,配置如下:

    <Directory /var/www/uni/my_project/templates/static>
        Allow from all
     </Directory>  
  WSGIScriptAlias / /var/uni/news/my_project/my_project/index.wsgi 

apache error.log 显示为:

mod_wsgi (pid=27330): Exception occurred processing WSGI script '/var/www/uni/my_project/my_project/index.wsgi'.
[Mon Jun 09 14:23:53 2014] [error] [client ip] Traceback (most recent call last):
[Mon Jun 09 14:23:53 2014] [error] [client ip]   File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/wsgi.py", line 219, in __call__
[Mon Jun 09 14:23:53 2014] [error] [client ip]     self.load_middleware()
[Mon Jun 09 14:23:53 2014] [error] [client ip]   File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py", line 39, in load_middleware
[Mon Jun 09 14:23:53 2014] [error] [client ip]     for middleware_path in settings.MIDDLEWARE_CLASSES:
[Mon Jun 09 14:23:53 2014] [error] [client ip]   File "/usr/local/lib/python2.6/dist-packages/django/utils/functional.py", line 184, in inner
[Mon Jun 09 14:23:53 2014] [error] [client ip]     self._setup()
[Mon Jun 09 14:23:53 2014] [error] [client ip]   File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 42, in _setup
[Mon Jun 09 14:23:53 2014] [error] [client ip]     self._wrapped = Settings(settings_module)
[Mon Jun 09 14:23:53 2014] [error] [client ip]   File "/usr/local/lib/python2.6/dist-packages/django/conf/__init__.py", line 95, in __init__
[Mon Jun 09 14:23:53 2014] [error] [client ip]     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
[Mon Jun 09 14:23:53 2014] [error] [client ip] ImportError: Could not import settings 'my_project.settings' (Is it on sys.path?): No module named my_project.settings

我浏览了 mod_wsgi 和 djnago 文档。我知道项目结构并没有保持所有的最佳实践。我稍后会更改它,但在此之前我需要上线。

我尝试更改文件权限以及相同问题中提到的所有更改。

所以,我假设我做错了什么。

上述文件中的错误配置在哪里?

谢谢。

【问题讨论】:

  • 您需要显示 Apache 日志中的错误。
  • 添加 apache 错误日志
  • @DanielRoseman 有什么想法吗?我已经添加了日志。
  • 是否有__init__.py 文件可以使my_project 成为一个包?
  • 有没有init.py

标签: python django deployment mod-wsgi


【解决方案1】:

我在这些情况下有一个清单:

  1. 直接用python执行脚本测试index.wsgi接口,纠正错误直到输出显示一切正常。 (见更新)

  2. 检查权限。

  3. 检查 apache 配置。

更新:

直接在控制台执行python my_project/index.wsgi 不显示任何内容,此方法适用于 fcgi 配置但在 wsgi 中无效,您将需要一个脚本来创建测试服务器并在控制台上显示可能的错误,示例脚本是这样的:

test_server.py

#!/usr/bin/env python

from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server
from my_project.index import application #importing the project's index.wsgi file
httpd = make_server('', 8000, application)
httpd.serve_forever()

步骤:

  • 在控制台(甚至本地)中运行测试
  • 转到浏览器并导航到此服务器:端口
  • 在控制台查看日志

建议:

  1. 在项目文件夹和设置文件夹中为您检查__init__.py

  2. 尝试在设置和 .wsgi 文件中使用相对路径(参见示例)

  3. 验证您姓名中的大写/小写(可能将"MY_PROJECT.settings" 更改为"my_project.settings"

示例:

import os, sys, site

CURRENT_DIRECTORY = os.path.dirname(os.path.realpath(__file__))
WORK_DIRECTORY = os.path.join(CURRENT_DIRECTORY, '..')

#Add the site-packages
site.addsitedir('/home/SERVER_USERNAME/.virtualenvs/histology_env/lib/python2.6/site-packages')

#activate_env=os.path.expanduser("~/.virtualenvs/histology_env/bin/activate_this.py")
#execfile(activate_env, dict(__file__=activate_env))

#adding the project to the python path
sys.path.append(WORK_DIRECTORY)
#adding the parent directory to the python path
sys.path.append(os.path.join(WORK_DIRECTORY, '..'))

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

【讨论】:

  • 1.什么都不显示 2. 权限没问题 3. 你指的是哪个配置?
  • 我的错,只有当你有 fcgi 配置时,1 点才有效,你可以在控制台中将 -for test- 更改为 fcgi ans test,我将编辑答案,添加一个脚本来测试一个 wsgi 脚本.我第 3 点(如果第 1 点和第 2 点都通过)你必须检查虚拟主机配置、.htaccess 配置和至少 wsgi 模块(可能性较小)
  • 你说的index.wsgi interface是什么?
  • 这是一个 python 脚本,作为 django 项目和 wsgi (Apache) 服务器之间的桥梁,它位于 django 项目文件夹中
【解决方案2】:

几天前我也遇到过同样的事情。我正在阅读有关它的所有内容,但这就是我最终解决所有问题的方法。

  1. 您的 django wsgi 文件应该是 python 文件 (wsgi.py),而不是 索引文件(index.wsgi)。这是我的样子,显然替换用户名和文件夹。

    import os, sys, site
    
    #Add the site-packages
    site.addsitedir('/home/SERVER_USERNAME/.virtualenvs/histology_env/lib/python2.6/site-packages')
    
    
    #activate_env=os.path.expanduser("~/.virtualenvs/histology_env/bin/activate_this.py")
    #execfile(activate_env, dict(__file__=activate_env))
    
    sys.path.append('/opt/')
    sys.path.append('/opt/MY_PROJECT')
    sys.path.append('/opt/MY_PROJECT/MY_PROJECT')
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MY_PROJECT.settings")
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
  2. 不要将项目添加到 /var/www/html/ 文件夹中!直到我找到您时,我才意识到这是一个问题。我选择将其放入 /opt/目录。

  3. 您无需激活 env 即可使其工作。您在第一行添加包。这就是为什么我将它注释掉的原因(网站运行良好)。

  4. 在虚拟配置中

    NameVirtualHost *:80
    WSGISocketPrefix /var/run/wsgi
    WSGIPythonPath /home/SERVER_USERNAME/.virtualenvs/histology_env/lib/python2.6/site-packages
    <VirtualHost *:80>
    
            WSGIDaemonProcess safe python-path=/opt/virtual_microscope:/home/SERVER_USERNAME/.virtualenvs/histology_env/lib/python2.6/site-packages
            WSGIProcessGroup safe
            WSGIScriptAlias / /opt/MY_PROJECT/MY_PROJECT/wsgi.py
    
            Alias /static/ /var/www/html/home/static/
            Alias /slides/ /var/www/html/pictures/slides/
    
            <Directory /opt/MY_PROJECT/MY_PROJECT/>
                    Order deny,allow
                    Allow from all
            </Directory>
    </VirtualHost>
    
  5. 在主机文件中更改这些设置后,确保您sudo service httpd reload

祝你好运,我知道你正在经历什么,但没有答案令人沮丧。希望这对你有用,对我有用。

【讨论】:

  • 为什么不将它添加到 /var/www/html 文件夹?我在那里添加了我的,但我的问题完全不同。如果你不在那里添加它,为什么媒体和静态仍然在那个目录中?我可以将所有内容移动到 /opt 目录并更改我的别名吗?为什么它甚至是一个问题?
【解决方案3】:

您应该在 Apache 配置中为项目指定 virtualenv,而不是您的应用程序 WSGI 文件。由于您使用的是 Apache,请参阅 https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#using-a-virtualenv 了解您需要在 Apache 配置中添加的内容。我还强烈建议在守护程序模式下运行 - 除非您有充分的理由不这样做,否则您应该几乎总是在 Apache 上使用守护程序模式。

然后将你的项目 WSGI 文件重置为

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

【讨论】:

    猜你喜欢
    • 2016-02-11
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多