我有一个包含数千个模型的Django项目的异常值。它作为我们使用Django REST Framework的数据的RESTful API。当我启动Django的runserver
时,由于验证了项目中的数据模型,需要几分钟时间才能启动。加载后,它会按预期工作。
mod_wsgi
表现出类似的行为。在发布或重新启动Apache之后,我们第一次在浏览器中调出页面需要几分钟时间。在第一页加载之后,整个网站几乎立即响应。通过阅读文档,这似乎是mod_wsgi
将应用程序加载到GLOBAL
应用程序组时的情况。在部署(触及wsgi.py)或Apache重启之后,我一直试图找到一种方法来立即启动此加载过程,以避免在部署后将网站放入浏览器中,这是在生产中存在问题,因为我们在专用网络上的循环代理后面有几个Web服务器。
我已尝试将GLOBAL
应用程序组添加到WSGIScriptAlias
并添加WSGIImportScript
,但似乎都不起作用。
以下是我所讨论的VirtualHost的.conf
文件。我显然遗漏了一些东西。
<VirtualHost *:443>
SSLEngine On
ServerName django-project-dev.my.domain.com
ErrorLog "|/usr/sbin/cronolog /path/to/log/httpd/errorlog/%Y/%Y-%m-django-project-dev-error.log"
LogLevel info
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess django-project-dev-https python-home=/path/to/django/djangoproject/virtualenvs/django-project-dev request-timeout=1800 connect-timeout=300 socket-timeout=600 user=djangoproject group=wharton
WSGIProcessGroup django-project-dev-https
WSGIScriptAlias / /path/to/django/djangoproject/html/django-project-dev/config/wsgi.py process-group=django-project-dev-https application-group=%{GLOBAL}
WSGIImportScript /path/to/django/djangoproject/html/django-project-dev/config/wsgi.py process-group=django-project-dev-https application-group=%{GLOBAL}
<Directory /path/to/django/djangoproject/html/django-project-dev/config>
Require all granted
</Directory>
Alias /static/ /path/to/django/djangoproject/html/django-project-dev/static/
<Directory /path/to/django/djangoproject/html/django-project-dev/static>
Require all granted
</Directory>
# This is required for Django REST Framework Auth Pass Thru
WSGIPassAuthorization On
</VirtualHost>
答案 0 :(得分:1)
对于预加载,而不是:
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess django-project-dev-https python-home=/path/to/django/djangoproject/virtualenvs/django-project-dev request-timeout=1800 connect-timeout=300 socket-timeout=600 user=djangoproject group=wharton
WSGIProcessGroup django-project-dev-https
WSGIScriptAlias / /path/to/django/djangoproject/html/django-project-dev/config/wsgi.py process-group=django-project-dev-https application-group=%{GLOBAL}
WSGIImportScript /path/to/django/djangoproject/html/django-project-dev/config/wsgi.py process-group=django-project-dev-https application-group=%{GLOBAL}
仅使用:
WSGIDaemonProcess django-project-dev-https python-home=/path/to/django/djangoproject/virtualenvs/django-project-dev request-timeout=1800 connect-timeout=300 socket-timeout=600 user=djangoproject group=wharton
WSGIScriptAlias / /path/to/django/djangoproject/html/django-project-dev/config/wsgi.py process-group=django-project-dev-https application-group=%{GLOBAL}
在process-group
上使用application-group
和WSGIScriptAlias
足以触发WSGI脚本文件的预加载。 WSGIImportScript
执行了相同的操作,但如果您在WSGIScriptAlias
上同时使用这两个选项,则不需要它。在WSGIScriptAlias
上使用这些选项后,您也不需要WSGIProcessGroup
或WSGIApplicationGroup
。
请确保您还添加:
WSGIRestrictedEmbedded On
在VirtualHost
之外,所以你也没有在所有Apache工作进程中设置Python。您只需要在mod_wsgi守护程序进程中使用它。
试一试,看看你到了哪里。
正如你所说:
LogLevel info
Apache配置中的应该导致mod_wsgi更多地记录它正在做什么以及何时加载东西,以便你可以验证发生了什么。