在 ElasticBeanstalk 配置中设置 Python WSGIDaemon --maximum-requests 值

Posted

技术标签:

【中文标题】在 ElasticBeanstalk 配置中设置 Python WSGIDaemon --maximum-requests 值【英文标题】:Set Python WSGIDaemon --maximum-requests value in ElasticBeanstalk Configuration 【发布时间】:2020-12-02 16:21:37 【问题描述】:

我正在寻找有关如何在运行 Django 的 AWS ElasticBeanstalk Python 环境中设置 --maximum-requests 值的说明。请注意,此环境未使用 Linux 2 映像,因此 gunicorn 不是一个选项,也不是使用 procfile。

maximum-requests=nnn 定义请求数量的限制 守护进程应在关闭和重新启动之前处理。

这可能用于定期强制重启 WSGI 应用程序 当您遇到与 Python 对象引用相关的问题时的处理 计数周期,或不正确使用内存缓存,这会导致 不断增长的内存。

如果这个选项没有定义,或者定义为 0,那么守护进程 进程将是持久的,并将继续为请求提供服务,直到 Apache 本身已重新启动或关闭。

避免在处理 很多流量。这是因为不断的重启和 重新加载 WSGI 应用程序可能会导致不必要的负载 系统和影响性能。仅当您没有 由于内存使用问题的其他选择。尽快停止使用 内存问题已解决。

您可以将优雅超时选项与此选项结合使用 减少活动请求的可能性的选项 由于使用此选项而发生重新启动时中断。

【问题讨论】:

你是如何运行你的 WSGI 守护进程的?添加一些配置/代码以显示您正在运行的内容。我有一个通过 supervisord 运行 uwsgi 的 EB 项目,该项目在进程启动时通过 max-requests。我想你会做类似的事情。 我相信 EB 正在运行它。我没有做任何事情来启动 WSGI 守护进程。哪些配置文件会有所帮助? 如果您在 EB 中运行 django,通常会使用 docker 来构建您的应用程序。现在您说您没有使用 Linux 2 平台,因此了解如何构建应用程序并运行它以了解如何自定义 WSGI 守护程序会很有帮助。 EB 正在构建应用程序并运行它。这是一个 Django 应用程序,所以我只在本地运行 python manage.py runserver。这会让你有更多的洞察力吗?我实际上只是设置了 WSGI.py 文件的路径,然后进行了 eb 部署。 我认为您可能是在建议我使用这种方法运行 Django。 docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgiuwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html 【参考方案1】:

您必须替换使用 WSGIDaemonProcess 指令的 Apache 服务器配置。

通过 SSH 连接到运行弹性 beanstalk 应用程序的 EC2 实例并切换到配置目录 /etc/httpd/conf.d/

在那里寻找包含WSGIDaemonProcess的文件。

grep -rnwl . -e 'WSGIDaemonProcess'

替换您的 elasticbeanstalk 应用程序配置中匹配文件的内容。

生成配置的位置(在应用部署的暂存阶段)可以通过shell命令方便地获取:

/opt/elasticbeanstalk/bin/get-config container -k wsgi_staging_config

.ebextensions/wsgi.config

files:
  /opt/elasticbeanstalk/hooks/appdeploy/pre/05_wsgi.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      # Set max-requests option in generated wsgi.conf
      sed -i -e '/WSGIDaemonProcess wsgi/ a\
      \ \ maximum-requests=1000 \\
      ' $(/opt/elasticbeanstalk/bin/get-config container -k wsgi_staging_config)

【讨论】:

谢谢!我今天会试试看! 据我所知,这不会覆盖 /etc/httpd/conf.d/wsgi.conf。我在 .ebextensions 文件夹中创建了一个 wsgi.config 文件,并将匹配的文件 pat 设置为“/etc/httpd/conf.d/wsgi.conf” 刚找到这篇文章...哦,孩子...forums.aws.amazon.com/thread.jspa?threadID=163369【参考方案2】:

为了实现这一点,我必须在我的 .ebextensions 文件夹中创建一个包含以下内容的配置。

您需要从服务器复制 wsgi.conf 文件,以确保您首先拥有正确的 EB 设置。

files:
  "/opt/elasticbeanstalk/local/override_wsgi_conf.py":
    mode: "000755"
    owner: root
    group: root
    content: |
        #!/usr/bin/env python
        import os
        import sys
        sys.path.append(os.path.dirname(
            os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
        import config
    
        MY_APACHE_TEMPLATE = r'''
        # Customized wsgi.conf.  If you're seeing this, good!
 
        LoadModule wsgi_module modules/mod_wsgi.so
        WSGIPythonHome /opt/python/run/baselinenv
        WSGISocketPrefix run/wsgi
        WSGIRestrictEmbedded On

        <VirtualHost *:80>

        Alias /static/ /opt/python/current/app/static/
        <Directory /opt/python/current/app/static/>
        Order allow,deny
        Allow from all
        </Directory>


        WSGIScriptAlias / /opt/python/current/app/key_collector_backend/wsgi.py


        <Directory /opt/python/current/app/>
        Require all granted
        </Directory>

        WSGIDaemonProcess wsgi processes=3 threads=20 maximum-requests=10000 display-name=%GROUP \
        python-home=/opt/python/run/venv/ \
        python-path=/opt/python/current/app user=wsgi group=wsgi \
        home=/opt/python/current/app
        WSGIProcessGroup wsgi
        </VirtualHost>

        LogFormat "%h (%X-Forwarded-Fori) %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined

        WSGIPassAuthorization On
        WSGIApplicationGroup %GLOBAL

        '''


        def main():
            try:
                WSGI_STAGING_CONFIG = config.get_container_config('wsgi_staging_config')
                print 'Overriding WSGI configuration in %s' % WSGI_STAGING_CONFIG
                open(WSGI_STAGING_CONFIG, 'w').write(MY_APACHE_TEMPLATE)
            except Exception, e:
                config.emit_error_event(config.USER_ERROR_MESSAGES['badappconfig'])
                config.diagnostic("Error generating config during configdeploy/pre: %s"
                                    % str(e))
                sys.exit(1)
    
    
        if __name__ == '__main__':
            config.configure_stdout_logger()
            main()
 
commands:
 
  5_app_deploy_dir:
    command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/pre"
  5_config_deploy_dir:
    command: "mkdir -p /opt/elasticbeanstalk/hooks/configdeploy/pre"
 
  10_app_deploy_file:
    command: "cp -p /opt/elasticbeanstalk/local/override_wsgi_conf.py /opt/elasticbeanstalk/hooks/appdeploy/pre/90_override_wsgi_conf.py"
 
  20_config_deploy_file:
    command: "cp -p /opt/elasticbeanstalk/local/override_wsgi_conf.py /opt/elasticbeanstalk/hooks/configdeploy/pre/90_override_wsgi_conf.py"

查看此线程以获取完整的详细信息。 https://forums.aws.amazon.com/thread.jspa?threadID=163369

【讨论】:

哈,我看到它需要在部署阶段之一被覆盖。

以上是关于在 ElasticBeanstalk 配置中设置 Python WSGIDaemon --maximum-requests 值的主要内容,如果未能解决你的问题,请参考以下文章

在弹性豆茎中设置静态文件

运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?

运行 AWS Deep Learning Base AMI (Amazon Linux 2) 时,如何在 Elastic Beanstalk 中设置 WSGI?

如何在 Elastic Beanstalk 上的 Rails 4 Puma 应用程序中设置 RDS_DB_NAME

在控制台中设置 Elastic Beanstalk 环境变量与从部署中传递它们

Django AWS RDS 环境变量未在 Elastic Beanstalk 中设置