如何从 Amazon Elastic Beanstalk 中删除一些 Apache 设置?

Posted

技术标签:

【中文标题】如何从 Amazon Elastic Beanstalk 中删除一些 Apache 设置?【英文标题】:How to remove some Apache settings from Amazon Elastic Beanstalk? 【发布时间】:2016-02-23 17:27:49 【问题描述】:

我对 Elastic Beanstalk 有一个奇怪的问题。我将一个 Django 项目部署到一个自动扩展的 EC2 实例。

.ebextensions 目录中,我有一个python.config 文件,最后有以下几行:

option_settings:
  "aws:elasticbeanstalk:application:environment":
    DJANGO_SETTINGS_MODULE: "myapp.settings_eb_staging"
    "PYTHONPATH": "/opt/python/current/app/django-myapp:$PYTHONPATH"
  "aws:elasticbeanstalk:container:python":
    WSGIPath: myapp/wsgi.py
    NumProcesses: 3
    NumThreads: 20
  "aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "myapp/static/"
    "/favicon.ico": "myapp/static/site/img/favicon.ico"

当我部署项目时

$ eb deploy

部署过程创建了这个 Apache 配置,可以在 /etc/httpd/conf.d/wsgi.conf 找到:

Alias /favicon.ico /opt/python/current/app/myapp/static/site/img/favicon.ico
<Directory /opt/python/current/app/myapp/static/site/img/favicon.ico>
Order allow,deny
Allow from all
</Directory>

这显然是错误的,因为favicon.ico 是一个文件,而不是一个目录。

所以我尝试从python.config 文件中删除最后一行:

"/favicon.ico": "myapp/static/site/img/favicon.ico"

然后重新部署项目。

问题在于 Apache 指令仍然存在。我也尝试手动删除该指令,但在下一次部署后它再次出现。我什至尝试重建环境,但它仍然创建了错误的 Apache 配置指令。

我怎样才能摆脱它?

【问题讨论】:

【参考方案1】:

原来wsgi.conf配置文件可以被.ebextensions/python.config文件覆盖。这就是我所做的:

    通过eb ssh SSH 到EC2 实例,并通过cat /etc/httpd/conf.d/wsgi.conf 获取wsgi.conf 的内容。

    创建一个文件.ebextensions/wsgi.conf 并将上一步的内容复制到那里。删除关于静态目录和 favicon 的 Apache 指令。

    修改.ebextensions/python.config并添加命令将wsgi.conf复制到/tmp/目录(部署过程中可能会用到):

    container_commands:
      01_refresh_apache_conf:
        command: "cp .ebextensions/wsgi.conf /tmp/wsgi.conf"
      02_migrate:
        command: "source /opt/python/run/venv/bin/activate && python manage.py migrate --noinput"
    leader_only: true
      03_collectstatic:
        command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
    
    option_settings:
      "aws:elasticbeanstalk:application:environment":
        DJANGO_SETTINGS_MODULE: "myapp.settings_eb_staging"
        "PYTHONPATH": "/opt/python/current/app/django-myapp:$PYTHONPATH"
      "aws:elasticbeanstalk:container:python":
        WSGIPath: myapp/wsgi.py
        NumProcesses: 3
        NumThreads: 20
      "aws:elasticbeanstalk:container:python:staticfiles":
        "/static/": "myapp/static/"
    

    提交到 git 并使用 eb deploy 进行部署。

附:要显示静态目录中的网站图标,我必须在 base.html 模板中添加其完整路径:

<link rel="shortcut icon" href=" STATIC_URL site/img/favicon.ico" />

【讨论】:

【参考方案2】:

您可以将自己的 wsgi.conf (httpd conf) 复制到父目录,这样您的文件将被使用而不是默认文件。

container_commands:
  03_wsgireplace:
    command: 'cp . ebextensions/wsgi.conf ../wsgi.conf'

【讨论】:

以上是关于如何从 Amazon Elastic Beanstalk 中删除一些 Apache 设置?的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Elastic Beanstalk 工作器层

无法从 Elastic Beanstalk 连接到 Amazon SimpleDB

Amazon Elastic Beanstalk 如何采用自定义 python 命令?

如何在 Amazon 的 Elastic Beanstalk 上安装 Python 脚本?

如何卸载 Amazon Elastic Beanstalk 命令行界面?

Amazon Elastic MapReduce - 从 S3 到 DynamoDB 的大量插入非常慢