【问题标题】:How to change nginx config in amazon elastic beanstalk running a docker instance如何在运行 docker 实例的亚马逊弹性 beanstalk 中更改 nginx 配置
【发布时间】:2014-07-05 18:23:17
【问题描述】:

在我登录并设置 cookie 后,我收到错误 502。当我阅读日志时,我收到错误:

014/05/17 01:54:43 [error] 11013#0: *8 upstream sent too big header while reading response
header from upstream, client: 83.248.134.236, server: , request: "GET /administration
HTTP/1.1", upstream:

经过一番快速谷歌搜索后,我发现: http://developernote.com/2012/09/how-i-fixed-nginx-502-bad-gateway-error/

我想尝试将 fastcgi_buffers 和 fastcgi_buffer_size 设置为不同的值。 但是我如何在亚马逊 elasticbeanstalk 中的 nginx 上设置变量?

nginx 服务器在我的 docker 实例之前。

【问题讨论】:

    标签: codeigniter amazon-web-services nginx amazon-elastic-beanstalk docker


    【解决方案1】:

    亚马逊实际上建议编辑 nginx 部署文件的暂存版本。有几个位于/tmp/deployment/config/,一个用于编辑一般的“http”上下文,还有一些用于配置服务器的不同方面。

    我想将缓存功能附加到默认代理服务器,因此我编写了一个.ebextensions 配置文件来替换#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf,然后在部署期间将其复制到/etc/nginx/conf.d。如果文件足够简单,您可以内联文件,但我将我的文件放在 S3 中,以便不同的应用程序将其拉下并使用它。这是配置文件:

    commands: 
      01-get-nginx-conf-file:
        command: aws s3 cp s3://<bucket-name>/custom-nginx.conf /home/ec2-user
    
    container_commands:
      01-replace-default-nginx-config:
        command: mv -f /home/ec2-user/custom-nginx.conf /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
    

    【讨论】:

    • 经过各种不同的尝试之后,这一次就像一个魅力。无需在正确的时间重新启动 nginx,也无需担心脚本会被覆盖,只需在源代码处覆盖即可。漂亮。
    • 你给这个文件取什么名字有关系吗?另外,您如何将自定义 nginx 配置文件部署到 S3?有没有办法让 eb deploy 将文件从您的机器复制到 S3 存储桶,而不是手动复制它?我确定您可以为此创建另一个 S3 存储桶,但我想使用为我创建的同一个 EBS 存储桶。
    • 文件名的唯一限制是它以 .config 结尾:docs.aws.amazon.com/elasticbeanstalk/latest/dg/…。不确定我是否理解第二部分。您只需将其复制到 S3 一次,然后每次部署时将其从 S3 复制到您的实例。如果您根本不想使用 S3,您可以将整个文件内联粘贴,但这有点脆弱,因为您的应用程序现在不共享同一个集中式文件。
    • 你知道我是否可以使用 /var/app/current 中的文件吗?我不确定这发生在部署生命周期的哪个位置 - 即我的文件是否还在那里。
    • ^ 在回答我的问题时,这样做对我不起作用。
    【解决方案2】:

    我还需要修改nginx配置。

    1. 创建一个脚本,修改nginx配置(可能你想要/etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker.conf)并重启nginx服务(service nginx restart)。
    2. 您需要在编写完这个 nginx 配置文件之后执行该脚本,也就是在执行正常的 ebextensions 之后。这是未记录在案的,但 Evan 分享了如何做到这一点 here:本质上,您使用 ebextension 将脚本复制到带有钩子的目录中,该钩子会在适当的时间执行。

    一个示例 ebextension 配置是 .ebextensions/01modify_nginx.config:

    container_commands:
      copy:
        command: "cp .ebextensions/01rewrite_nginx_config.py /opt/elasticbeanstalk/hooks/appdeploy/enact/"
      make_exe:
        command: "chmod +x /opt/elasticbeanstalk/hooks/appdeploy/enact/01rewrite_nginx_config.py"
    

    这对于我的项目现在运行良好(here 是您可以在其中看到它的源代码)。

    【讨论】:

    • 我不得不将编辑脚本 01rewrite_nginx_config.py 重命名为 12_rewrite_nginx_config 才能让它执行得足够晚。
    【解决方案3】:

    另一种扩展 Elastic Beanstalk nginx 配置的方法是在 .ebextensions 目录中创建一个文件,例如命名为 nginx.config,内容如下:

        files:
          "/etc/nginx/conf.d/000_my_config.conf":
          content: |
            upstream nodejsserver {
              server 127.0.0.1:8081;
              keepalive 256;
            }
    
            server {
              listen 8080;
    
              location / {
                proxy_pass  http://nodejsserver;
                proxy_set_header   Connection "";
                proxy_http_version 1.1;
                proxy_set_header        Host            $host;
                proxy_set_header        X-Real-IP       $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
              }
    
              location /myconfig {
                proxy_pass http://my_proxy_pass_host;
              }
            }
    

    /etc/nginx/conf.d/000_my_config.conf 是将在 Elastic Beanstalk EC2 实例上创建的文件名。默认情况下,此配置位于文件 /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf 中。因此,如果您以 000 为前缀,则可以保证您的配置将首先被考虑在内。

    内容是从默认的nginx配置中复制过来的(又是/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf),然后用我自己的配置自定义了。

    【讨论】:

    • 不知道以前的版本,但目前如果你这样做,你会从 Nginx 收到一条讨厌的错误消息,duplicate upstream "nodejs" in /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf:12。不仅如此,您还必须登录到每个 Beanstalk 节点并手动删除 000_my_config.conf 文件。请注意。
    • @TimFulmer :这正是我将上游称为“nodejsserver”而不是“nodejs”的原因。
    • 您可以通过将命令部分添加到同一文件commands: 01remove_backup: command: rm -f [your file](更新标识等)来删除文件
    • 是的,看到这个AWS article解决这个问题
    【解决方案4】:

    一种更简洁的方法(如果您在 Elastic Beanstalk 上使用 Java 或 Go 平台)是在 .ebextensions 的子文件夹中包含您希望更改的 nginx .conf 文件:

    您现在可以在 .ebextensions/nginx 文件夹中放置一个 nginx.conf 文件来覆盖 Nginx 配置。您还可以将配置文件放在 .ebextensions/nginx/conf.d 文件夹中,以便将它们包含在平台提供的 Nginx 配置中。

    Source

    【讨论】:

    • 值得一提的是,此解决方案仅适用于某些 ELB 平台 - JavaGo。如果您使用 Docker Platform 和 nginx 作为代理,您必须使用配置文件(使用 files 关键字)放置在 .ebextensions 中的解决方案
    • @rkarczmarczyk 我快要发疯了。被这个问题困扰了几个小时,谢谢你指出来
    • “ELB”我认为您的意思是 Elastic Beanstalk 而不是 Elastic Load Balancer。我希望他们会支持所有平台! ://
    【解决方案5】:

    自 2022 年 2 月 2 日起更新

    似乎 AWS 在使用 Amazon Linux 2 的较新版本的 Elastic Beanstalk 中更改了一些内容,因此如果您将 EBS 与 Amazon Linux2 一起使用,@jsebfranck 提到的方法不再适用。

    较新的方法是在 zip 包的根目录中创建一个“.platform”文件夹,并将 nginx.conf 文件添加到“./platform/nginx/nginx.conf”,如果在那个位置。

    详情请看这里:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.migration-al.html

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2016-01-29
      • 2016-10-04
      • 2016-05-01
      • 2012-08-19
      相关资源
      最近更新 更多