【问题标题】:Trying to configure a django application to use mod_wsgi尝试将 django 应用程序配置为使用 mod_wsgi
【发布时间】:2017-01-20 22:37:55
【问题描述】:

当我访问此项目的 URL 时,我在 apache error.log 中不断收到此错误:

[Fri Jan 20 21:04:16.143990 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326] mod_wsgi (pid=18618): Target WSGI script '/srv/botbot/src/botbot/botbot/wsgi.py' cannot be loaded as Python module. 
[Fri Jan 20 21:04:16.144124 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326] mod_wsgi (pid=18618): Exception occurred processing WSGI script '/srv/botbot/src/botbot/botbot/wsgi.py'. 
[Fri Jan 20 21:04:16.144195 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326] Traceback (most recent call last): 
[Fri Jan 20 21:04:16.144255 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/src/botbot/botbot/wsgi.py", line 9, in <module> 
[Fri Jan 20 21:04:16.144335 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     application = get_wsgi_application() 
[Fri Jan 20 21:04:16.144381 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application 
[Fri Jan 20 21:04:16.144437 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     django.setup() 
[Fri Jan 20 21:04:16.144487 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/lib/python2.7/site-packages/django/__init__.py", line 17, in setup 
[Fri Jan 20 21:04:16.144540 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     configure_logging(settings.LOGGING_CONFIG, settings.LOGGING) 
[Fri Jan 20 21:04:16.144586 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/lib/python2.7/site-packages/django/conf/__init__.py", line 48, in __getattr__ 
[Fri Jan 20 21:04:16.144638 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     self._setup(name) 
[Fri Jan 20 21:04:16.144675 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/lib/python2.7/site-packages/django/conf/__init__.py", line 44, in _setup 
[Fri Jan 20 21:04:16.144711 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     self._wrapped = Settings(settings_module) 
[Fri Jan 20 21:04:16.144747 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/lib/python2.7/site-packages/django/conf/__init__.py", line 92, in __init__ 
[Fri Jan 20 21:04:16.144793 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     mod = importlib.import_module(self.SETTINGS_MODULE) 
[Fri Jan 20 21:04:16.144822 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module 
[Fri Jan 20 21:04:16.144856 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     __import__(name) 
[Fri Jan 20 21:04:16.144884 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/src/botbot/botbot/settings/__init__.py", line 1, in <module> 
[Fri Jan 20 21:04:16.144930 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     from base import * 
[Fri Jan 20 21:04:16.145008 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/srv/botbot/src/botbot/botbot/settings/base.py", line 27, in <module> 
[Fri Jan 20 21:04:16.145053 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     SECRET_KEY = os.environ['WEB_SECRET_KEY'] 
[Fri Jan 20 21:04:16.145085 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]   File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__ 
[Fri Jan 20 21:04:16.145118 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326]     raise KeyError(key) 
[Fri Jan 20 21:04:16.145157 2017] [:error] [pid 18618:tid 140192977487616] [remote 66.90.146.30:326] KeyError: 'WEB_SECRET_KEY' 

这是我的 wsgi.py 文件:

import os 

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

# This application object is used by any WSGI server configured to use this 
# file. This includes Django's development server, if the WSGI_APPLICATION 
# setting points here. 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

这是我的 .env 文件:

# Required 
SECRET_KEY='password1' 
WEB_PORT=8000 
EMAIL_BACKEND='django.core.mail.backends.console.EmailBackend' 
GOPATH=$VIRTUAL_ENV 
WEB_SECRET_KEY='password1' 
STORAGE_URL=postgres://ubuntu:password@localhost:5432/botbot 
REDIS_PLUGIN_STORAGE_URL=redis://localhost:6379/0 
REDIS_PLUGIN_QUEUE_URL=redis://localhost:6379/1 
PUSH_STREAM_URL=http://localhost:8080/pub/?id={id} 

# Set encoding if the system hasn't done it properly 
LANG=en_US.UTF-8 
PYTHONIOENCODING=utf8 

# Optional 
# MEMCACHE_URL=127.0.0.1:11211 
# STATIC_ROOT=/var/www/botbot/static 
# MEDIA_ROOT=/var/www/botbot/uploads 
# DEBUG=True 
# SMTP_URL=smtp://user:pass@host:port 
# SMTP_TLS=True 
# ALLOWED_HOSTS=host1,host2 
# INCLUDE_DJANGO_ADMIN=False 
# EXCLUDE_NICKS=nick1,nick2 

这是我的 apache conf 文件:

<VirtualHost *:80> 
        ServerName server.test.com 
        ErrorLog ${APACHE_LOG_DIR}/error.log 
        SetEnv WEB_SECRET_KEY password1 
        CustomLog ${APACHE_LOG_DIR}/access.log combined 
        DocumentRoot /srv/botbot/src/botbot 
        <Directory /srv/botbot/src/botbot/botbot> 
                <Files wsgi.py> 
                        Require all granted 
                </Files> 
        </Directory> 

        WSGIDaemonProcess botbot python-path=/srv/botbot/src/botbot/botbot:/srv/botbot/lib/python2.7/site-packages 
        WSGIProcessGroup botbot 
        WSGIScriptAlias / /srv/botbot/src/botbot/botbot/wsgi.py 

</VirtualHost> 

这是我正在尝试构建的应用程序:https://github.com/BotBotMe/botbot-web

如您所见,我尝试在 apache conf 中设置 SetEnv 变量,但没有成功。我什至不确定这是否是正确的做法,无论我做什么,我仍然会收到以下错误。

【问题讨论】:

    标签: python django apache wsgi


    【解决方案1】:

    我相信您应该尝试SetEnvIf 指令,就像在 apache 文档中阅读的那样:

    The internal environment variables set by this directive are set after   
    most early request processing directives are run, such as access 
    control and URI-to-filename mapping. If the environment variable you're 
    setting is meant as input into this early phase of processing such as 
    the RewriteRule directive, you should instead set the environment  
    variable with SetEnvIf.
    

    如果你想通过 SetEnv 设置它 - 它在启动时对 django 应用程序不可用。

    但可能你能做的最好的事情是在一些预运行脚本中设置这个环境变量。

    编码愉快!

    【讨论】:

    • SetEnvSetEnvIf 都不为 mod_wsgi 托管的 WSGI 应用程序设置进程范围的环境变量。他们只在 WSGI environ 字典中设置每个请求变量,这在代码查找进程范围的环境变量时没有帮助。在预运行脚本中设置变量对于操作系统启动的 Apache httpd 来说很痛苦,不推荐。
    【解决方案2】:

    我最终将以下行添加到我的 wsgi.py 文件中:

    os.environ['WEB_SECRET_KEY'] = 'password'
    

    其中“密码”等于 .env 文件中为 WEB_SECRET_KEY 变量指定的密码字符串。

    我还必须递归地将 /srv 目录(其中包含应用程序而没有其他内容)提供给 www-data 用户。

    这篇文档很有帮助:https://gist.github.com/GrahamDumpleton/b380652b768e81a7f60c

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2022-08-14
      • 2015-12-25
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2014-03-07
      • 2015-04-30
      相关资源
      最近更新 更多