手动停止mod_wsgi启动的进程,并监视正在运行的进程数

Bas*_*asj 11 python apache mod-wsgi wsgi bottle

知道不建议在生产中运行Bottle或Flask应用程序,python myapp.py --port=80因为它只是一个开发服务器.

我认为也不建议运行它python myapp.py --port=5000并将其链接到Apache:RewriteEngine On,RewriteRule /(.*) http://localhost:5000/$1 [P,L](或者我错了?),因为WSGI是首选.

所以我现在正在设置Python app <-> mod_wsgi <-> Apache(没有gunicorn或其他工具来保持简单).

问题:当使用WSGI时,我知道它是Apache,mod_wsgi并且会myapp.py在请求到来时自动启动/停止运行足够的进程,但是:

  1. 我该如何手动停止这些流程?
  2. 更一般地说,有没有办法监控它们/知道mod_wsgi启动的进程当前还在运行多少?(其中一个原因是检查进程是否在请求后终止或是否继续运行)

例:

  • 我做了一些更改myapp.py,并且我想重新启动运行它的所有进程,这些进程已由mod_wsgi启动(注意:我知道mod_wsgi可以观察源代码的更改,并重新启动,但这仅适用于对其进行的更改. wsgi文件,而不是.py文件.我已经读过touch myapp.wsgi可以解决这个问题,但更一般地说我希望能够手动停止并重新启动)

  • 我想暂时停止整个应用程序myapp.py(它的所有实例)

我不想用service apache2 stop它,因为我也用Apache 运行其他网站,而不仅仅是这个(我有几个VirtualHosts).出于同样的原因(我使用Apache运行其他网站,而某些客户端可能同时下载1 GB文件),我不希望这样做service apache2 restart会对使用Apache的所有网站产生影响.

我正在寻找比kill pidSIGTERM等更清洁的方式(因为我读过它不建议在这种情况下使用信号).

注意:我已经阅读了如何从mod_wsgi执行优雅的应用程序关闭,它有所帮助,但这里是补充问题,而不是重复.


我目前的Python Bottle + Apache + mod_wsgi设置:

  • 安装:

    apt-get install libapache2-mod-wsgi
    a2enmod wsgi      # might be done automatically by previous line, but just to be sure
    
    Run Code Online (Sandbox Code Playgroud)
  • Apache配置(来源:Bottle doc):

    <VirtualHost *:80>
      ServerName example.com
      WSGIDaemonProcess yourapp user=www-data group=www-data processes=5 threads=5
      WSGIScriptAlias / /home/www/wsgi_test/app.wsgi
      <Directory />
        Require all granted
      </Directory>
    </VirtualHost>
    
    Run Code Online (Sandbox Code Playgroud)

    应该有多达5个进程,是吗?正如之前在问题中所述,如何知道有多少正在运行,如何阻止它们?

  • /home/www/wsgi_test/app.wsgi(来源:Bottle doc)

    import os
    from bottle import route, template, default_app
    
    os.chdir(os.path.dirname(__file__))
    
    @route('/hello/<name>')
    def index(name):
        return template('<b>Hello {{name}}</b>!', name=name)
    
    application = default_app()
    
    Run Code Online (Sandbox Code Playgroud)

Evh*_*vhz 2

部分取自这个问题,添加display-nameWSGIDaemonProcess以便您可以使用如下命令来获取它们:

\n\n
ps aux | grep modwsgi\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其添加到您的配置中:

\n\n
Define GROUPNAME modwsgi\nWSGIDaemonProcess yourapp user=www-data group=www-data processes=5 threads=5 display-name=%{GROUPNAME}\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新

\n\n

有几个原因导致 ps 不给你DaemonProcess display-name.
\n如文档所示:

\n\n
\n

display-name=value 定义使用 ps 命令列出进程时为守护进程显示的不同名称。如果值为\n %{GROUP},则名称将为 (wsgi:group),其中 group 将被替换\n 为守护进程进程组的名称。

\n\n

请注意,只能显示所提供值的字符数,\n 与执行进程的 argv0 最初占用的字符数相同。任何超出此范围的内容都会被截断。

\n\n

此功能可能无法按照描述在所有平台上工作。通常,它还需要具有 BSD 传统的 ps 程序。因此,在某些版本的 Solaris UNIX 上,/usr/bin/ps 程序\xe2\x80\x99 无法工作,但 /usr/ucb/ps\n 可以。其他可以显示该值的程序包括 htop。

\n
\n\n

你可以:

\n\n

设置display-name较小的长度:

\n\n
WSGIDaemonProcess yourapp user=www-data group=www-data processes=5 threads=5 display-name=wsws\n
Run Code Online (Sandbox Code Playgroud)\n\n

并尝试通过以下方式找到它们:

\n\n
ps aux | grep wsws\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者将其设置为%{GROUP}并使用守护进程进程组的名称 (wsgi:group) 进行过滤。

\n