在 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