【问题标题】:wsgi startup - why two identical processes?wsgi 启动 - 为什么有两个相同的进程?
【发布时间】:2014-01-06 20:20:22
【问题描述】:

我有以下配置:

虚拟主机:

<VirtualHost *:80>
    ServerAdmin rok@localhost
    ServerName lh.test.com

    WSGIScriptAlias / /home/user/myapp/src/wsgi.py application-group='%{GLOBAL}' process-group='%{GLOBAL}'
    WSGIDaemonProcess lh.test.com processes=1 threads=1 display-name=%{GROUP}

    <Directory /home/user/myapp/src>
      <Files wsgi.py>
        Order deny,allow
        Require all granted
      </Files>
      Options All
      AllowOverride All
      Require all granted
    </Directory>

    Alias /static /home/user/myapp/src/static

    ErrorLog /var/log/apache2/lh.test.com-error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel debug
    CustomLog /var/log/apache2/lh.test.com-access.log combined

</VirtualHost>

wsgi.py:

from __future__ import unicode_literals
import os, signal, sys

sys.path.append('/home/user/apps/django-trunk')
sys.path.insert(0, '/home/user/myapp/src')

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

print 'starting up wsgi application...'
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

当我启动 apache 时,由于某种原因它总是启动两个相同的 wsgi 进程:

apache 日志:

Mon Jan 06 21:17:02.895219 2014] [mpm_event:notice] [pid 27628:tid 140594224048000] AH00489: Apache/2.4.6 (Ubuntu) mod_wsgi/3.4 Python/2.7.5+ configured -- resuming normal operations
[Mon Jan 06 21:17:02.895287 2014] [core:notice] [pid 27628:tid 140594224048000] AH00094: Command line: '/usr/sbin/apache2'
[Mon Jan 06 21:17:02.905771 2014] [:error] [pid 27632:tid 140594224048000] starting up wsgi application...
[Mon Jan 06 21:17:02.909542 2014] [:error] [pid 27633:tid 140594224048000] starting up wsgi application...

和ps辅助:

root     27628  0.0  0.0  84196  3100 ?        Ss   21:17   0:00 /usr/sbin/apache2 -k start
www-data 27632  0.1  0.3 470984 24648 ?        Sl   21:17   0:00 /usr/sbin/apache2 -k start
www-data 27633  0.1  0.3 470984 24648 ?        Sl   21:17   0:00 /usr/sbin/apache2 -k start

知道为什么会这样吗?

【问题讨论】:

    标签: wsgi


    【解决方案1】:

    你的 WSGIScriptAlias 指令错误:

    WSGIScriptAlias / /home/user/myapp/src/wsgi.py application-group='%{GLOBAL}' process-group='%{GLOBAL}'
    

    应该是:

    WSGIScriptAlias / /home/user/myapp/src/wsgi.py application-group='%{GLOBAL}' process-group='lh.test.com'
    

    结果是您的应用程序不是在守护程序模式下运行,而是在嵌入式模式下运行,因此在 Apache 子工作进程中运行。因此,您看到多少进程将取决于 Apache MPM 设置。

    更改该指令并设置:

    WSGIRestrictEmebedded On
    

    这将关闭东西在 Apache 子工作进程中运行的能力,如果您填充配置并且没有委派应用程序在守护进程组中正确运行,则会导致错误。

    也去阅读:

    【讨论】:

    • 谢谢格雷厄姆!这是一个改进,我仍然有两个实例开始:[Tue Jan 07 18:24:05.311746 2014] [:info] [pid 11338:tid 139661808760704] mod_wsgi (pid=11338, process='lh.test.com', application =''): 加载 WSGI 脚本'/home/user/myapp/src/wsgi.py'。 [2014 年 1 月 7 日星期二 18:24:05.311746] [:info] [pid 11339:tid 139661808760704] mod_wsgi (pid=11339, process='lh.test.com', application=''): 加载 WSGI 脚本'/home /user/myapp/src/wsgi.py'。但至少现在这与 WSGIScriptAlias 指令的 processes=2 参数相关联。可以这样吗?
    • 您的意思是,如果看到两个,您实际上已将 WSGIDaemonProcess 选项更改为 processes=2。如果您的 processes=1 仍然如图所示,则不应有两个。
    • 是的,在 processes=2 的情况下,我会立即启动两个进程。我认为这是预期的行为?
    • 是的。如果您同时使用 WSGIScriptAlias 的 process-group 和 application-group 参数,则会产生预加载 WSGI 脚本的副作用。如果想要延迟加载而不是仅在收到需要应用程序的第一个请求时,有不同的方法。
    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 2013-07-03
    • 2017-09-25
    • 2016-06-06
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多