mod_wsgi启动速度过慢?
我正在开发一个用Django做的网站,生产环境下使用mod_wsgi。因为几乎没有访客,所以每次我访问网站时,mod_wsgi都会启动并打开Python进程,这个过程大约需要1到2分钟才能完全加载。
有没有什么办法可以让它在第一次启动时不那么慢?这是一个常见的问题,还是可能是我的配置出了问题?
2 个回答
再补充一点,这里有些细节。你不应该使用预先分叉的 MPM,因为这样会导致每个预先分叉的进程都会产生一个 mod_wsgi 进程。
解决这个问题的最佳方法是使用工作者 MPM 以守护进程模式运行 WSGI 进程。
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#using-mod-wsgi-daemon-mode
补充:
还要注意,你必须指定组,否则每个 HTTPD 进程似乎会在所有连接关闭后创建自己的 mod_wsgi 进程。
WSGIScriptAlias / /usr/local/apache2/htdocs/ABC.com/build/wsgi.py
WSGIPassAuthorization On
WSGILazyInitialization Off
WSGIDaemonProcess ABC.com user=apache group=apache display-name=%{GROUP} processes=1 threads=256
WSGIProcessGroup ABC.com
即使你使用了不太理想的配置,比如嵌入模式和Apache的prefork MPM,加载时间也不应该这么长。不过,如果你把Apache进程的MaxRequestsPerChild设置为1,那情况可能会更糟。
建议你确保使用mod_wsgi的守护进程模式,并且运行一个多线程的进程(这也是WSGIDaemonProcess的默认设置)。这样可以确保只有一个Django实例,而不是每个Apache服务器进程都有一个。
为了确认你所做的设置,建议你编辑一下你的提问,贴出你当前Apache配置的片段,展示如何设置mod_wsgi的部分。同时也要说明你是使用Apache的prefork还是worker MPM,可以通过运行'httpd -V'来判断,并告诉大家你使用的是什么平台。
顺便问一下,你有没有试过一个简单的hello world WSGI程序来验证你的安装是否成功?可以参考这个链接:'http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide'。还有,你有没有尝试用一个空的Django网站,而不是你真实的网站,来看看问题是不是出在你的修改上?