如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置

Posted

技术标签:

【中文标题】如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置【英文标题】:How to modify NGINX configuration on Deploying app Elastic beanstalk 【发布时间】:2020-09-29 15:00:44 【问题描述】:

我需要向 nginx.conf 添加一些位置,以便环境 URL 指向 app.php。我已经使用 vi 修改了文件。重新启动 NGINX 就可以了。但是我需要在使用 eb deploy 时自动加载此配置。

我已阅读并尝试过: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html

Elasticbeanstalk configuring HTTPS on Single Instance of Python: null values are not allowed in templates

How to configure .ebextensions for nginx location directive?

Amazon Elastic Beanstalk ebextension

我有 /.ebextensions/01_nginx.config

files:
"/etc/nginx/nginx.conf":
    mode: "0000644"
    owner: root
    group: root
    content: |
        My conf file

但该配置不起作用。我尝试通过“/etc/nginx/my_nginx.conf”更改“/etc/nginx/nginx.conf”:文件出现了!所以我尝试用我的自定义文件替换默认文件:

container_commands:
    deleteConf:
        command: "sudo rm /etc/nginx/nginx.conf"
    changeConf:
        command: "sudo cp /etc/nginx/my_nginx.conf  /etc/nginx/nginx.conf"

放置在 01_nginx.config 中先前配置的下方。但是命令不起作用。 nginx.conf 没有被我的删除或替换。我做错了什么?

编辑:我读过 .ebextensions 中的文件是按字母顺序评估的。我想知道是否可能在文件存在之前执行了复制命令。所以我创建了一个新文件 /.ebextensions/02_copy.config 并移到那里

container_commands:
    deleteConf:
        command: "sudo rm /etc/nginx/nginx.conf"
    changeConf:
        command: "sudo cp /etc/nginx/my_nginx.conf  /etc/nginx/nginx.conf"

不走运

【问题讨论】:

这是一个非常常见的问题,在 elasticbean 文档中的记录很差。对于@guimauve 下面的 TLDR 答案,隐藏的文档是他的amazon extended configuration for AMI 2 【参考方案1】:

这个答案适用于 Linux 2。 我花了一整天的时间试图解决这个问题,主要是因为我试图使用旧方法,没有意识到 Linux 2 的情况发生了变化。然后我找到了 guimauve 的答案,但它对我不起作用。看完AWS官方文档https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html 我发现没有必要在 .platform/hooks/deploy 中创建脚本。您只需要在 .platform 中创建一个 nginx 目录并将更新的 nginx.conf 放在那里。第一次尝试这种方法,nginx.conf 被成功覆盖,但我的调用仍然超时。然后我补充说:

proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

在 nginx.conf 的服务器部分,它工作了!呼叫完成,没有超时。

【讨论】:

澄清一下:这是 Amazon Linux 2?并且添加在 nginx.conf 中? 太棒了!感谢分享:)【参考方案2】:

在部署了一整天尝试修改nginx.conf后,直接在/etc/nginx/中创建自定义nginx.conf > 通过 .ebextensions 中的 .config 文件对我不起作用,因为它会被默认文件系统地覆盖。

当我在 /tmp 中创建自定义文件并编写一个替换 /etc/nginx/nginx.confcontainer_command 时,发生了同样的事情>.

您实际上需要创建一个脚本,该脚本将在 部署后、在 elastic beanstalk 写入所有文件之后执行。

如果您使用的是 Amazon Linux 1 环境:

来源:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html

要在部署后执行任何脚本,请将以下代码放入 .ebextensions

根目录的 .config 文件中

01_write_custom_ng_conf.config

    创建一个目录来存储您的脚本。
commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
    创建修改后的 nginx.conf 文件并将其放在 /tmp 中。
files:
  "/tmp/custom_nginx.conf":
     mode: "000644"
     owner: root
     group: root
     content: |
       # your .conf file
    创建一个脚本,将原始 nginx.conf 替换为您在步骤 1 创建的 /opt/elasticbeanstalk/hooks/appdeploy/post 中的自定义脚本。这应该部署后自动执行。
   "/opt/elasticbeanstalk/hooks/appdeploy/post/update_ng_conf.sh":
     mode: "000644"
     owner: root
     group: root
     content:
       #!/usr/bin/bash
       sudo mv /tmp/custom_nginx.conf /etc/nginx/nginx.conf 

如果您使用的是 Amazon Linux 2 环境:

来源:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

脚本现在从 .platform 中的子文件夹执行,您必须将其放在项目的根目录中,如下所示:

~/your-app/
|-- someFile.py
|-- Procfile
|-- readme.md
|-- .ebextensions/
|   |-- 01_write_custom_ng_conf.config        
`-- .platform/
    |-- hooks
        `-- postdeploy
            `-- 01_update_ng_conf.sh        # Executed post deployment

.ebextensions 的根目录下创建一个 .config 文件。

01_write_custom_ng_conf.config

创建修改后的 nginx.conf 文件并将其放在 /tmp 中。

files:
  "/tmp/custom_nginx.conf":
     mode: "000644"
     owner: root
     group: root
     content: |
       # your .conf file

.platform/hooks/postdeploy 中创建一个小脚本并将权限更改为 755

01_update_ng_conf.sh

#!/usr/bin/bash

# Replace the original nginx.conf by our custom one
sudo mv /tmp/custom_nginx.conf /etc/nginx/nginx.conf

# Restart nginx to apply modifications
sudo service nginx restart

这对我来说在 Amazon Linux 2 Python 3.7 环境上工作得很好。不确定你的,但这应该是一样的。

确保您的 .config 文件缩进完美,因为解析器并不总是检测到错误并且代码不会被执行。

【讨论】:

我放弃了这样做。我需要部署应用程序,所以我做了不同的事情。但是当我尝试这个时,我没有达到文档的那个钩子部分。它适用于@nikhilswami,所以我会接受答案。谢谢! 虽然这是公认的答案,但这不是在 Amazon Linux 2 上执行此操作的方法。有关正确方法,请参阅 AWS docs(“反向代理配置”部分),即.platform/nginx/ 中的 nginx 配置文件(在您的源包中)。

以上是关于如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在部署时使用 Elastic Beanstalk 指定敏感环境变量

如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置

如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?

发生故障时如何查看 AWS Elastic Beanstalk 部署过程日志

如何以编程方式获取部署到 Elastic Beanstalk 环境的应用程序版本

如何将 node.js 应用程序部署到 AWS Elastic Beanstalk