Django mod_wsgi:处理wsgi脚本时发生异常

时间:2014-06-09 14:15:02

标签: python django deployment mod-wsgi

我正在部署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文档。我知道项目结构并没有保持所有最佳实践。我会稍后改变它,但在此之前我需要将它改为现场。

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

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

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

感谢。

3 个答案:

答案 0 :(得分:3)

我在这种情况下有一份清单:

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

  2. 检查权限。

  3. 检查apache配置。

  4. <强>更新

    执行python my_project/index.wsgi直接在控制台中没有显示任何内容,这种方法适用于fcgi配置,但在wsgi中没有,你需要一个创建测试服务器并在控制台上显示可能错误的脚本,示例脚本如下: / p>

    <强> 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()
    

    步骤:

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

    <强>建议:

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

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

    3. 验证姓名中的大写/小写(可能会更改"MY_PROJECT.settings"的{​​{1}}

    4. 示例:

      "my_project.settings"

答案 1 :(得分: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. DON&#34;将项目添加到/ var / www / html / FOLDER!在我到达你的地方之前,我没有意识到这是一个问题。我选择将它放入/ 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

  6. 祝你好运,我知道你正在经历的事情,没有答案是令人沮丧的。希望这对你有用,它对我有用。

答案 2 :(得分:0)

您应该在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()