首页 > 解决方案 > 在 ElasticBeanstalk 配置中设置 Python WSGIDaemon --maximum-requests 值

问题描述

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

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

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

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

避免将其设置为处理大量流量的站点上的少量请求。这是因为 WSGI 应用程序的不断重启和重新加载可能会导致系统上不必要的负载并影响性能。仅当您因内存使用问题而别无选择时才使用此选项。解决任何内存问题后立即停止使用它。

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

标签: pythonpython-3.xamazon-web-servicesamazon-elastic-beanstalkwsgi

解决方案


为了做到这一点,我必须在我的 .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-For}i) %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" 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


推荐阅读