Beanstalk 部署忽略了我在 .ebextensions 中的 nginx 配置文件

Posted

技术标签:

【中文标题】Beanstalk 部署忽略了我在 .ebextensions 中的 nginx 配置文件【英文标题】:Beanstalk deployment ignores my nginx configuration files in .ebextensions 【发布时间】:2020-08-18 05:08:49 【问题描述】:

我在单实例 Elastic Beanstalk 环境中托管我的 Java Web 应用程序,并添加了几个 ebextension 文件,这些文件在每次部署时成功地为我创建了配置文件。但是,我找不到让 Beanstalk 在 /etc/nginx/etc/nginx/conf.d 目录中添加新配置的方法。

我按照此处描述的步骤操作:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-java.html

我的部署包结构如下:

$ zip -r deploy.zip api-1.0-SNAPSHOT-all.jar .ebextensions
  adding: api-1.0-SNAPSHOT-all.jar (deflated 11%)
  adding: .ebextensions/ (stored 0%)
  adding: .ebextensions/ssl-certificates.config (deflated 37%)
  adding: .ebextensions/https-instance-securitygroup.config (deflated 38%)
  adding: .ebextensions/nginx/ (stored 0%)
  adding: .ebextensions/nginx/conf.d/ (stored 0%)
  adding: .ebextensions/nginx/conf.d/https.conf (deflated 61%)

我的文件几乎是上述指南中示例的一对一副本。

在部署期间,我的两个 *.config 文件都成功执行,但缺少 /etc/nginx/conf.d/https.conf。我试图通过删除 .ebextensions/nginx 目录并将其替换为另一个从头开始创建 /etc/nginx/conf.d/https.conf.config 文件来解决此问题,但这并没有帮助,并且该文件仍然丢失。

我通过 ssh 连接到我的 EC2 实例,这是我在 /var/log/eb-engine.log 中找到的内容:

2020/05/03 19:42:37.754375 [INFO] Executing instruction: configure proxy Nginx
2020/05/03 19:42:37.754393 [WARN] skipping nginx folder under .ebextensions
2020/05/03 19:42:37.754670 [INFO] No plugin in cfn metadata.

我觉得我可能在这里遗漏了一些非常明显的东西,但令人惊讶的是我找不到任何解决问题的方法。想法?谢谢!

【问题讨论】:

我也使用 post-deploy hook 来设置类似的 proxy_pass。最近我发现,如果通过更改 Elastic Beanstalk > Environments > "env-name" > Configuration > Software 中的环境变量重新启动 webapp,Beanstalk 会删除自定义 ngixn 配置文件。你们有同样的问题,ngixn 配置丢失了吗? 【参考方案1】:

我刚刚解决了同样的问题。

配置如下目录结构即可轻松解决问题。

~/my-app/
|-- readme.md
|-- .ebextensions/
|   |-- options.config       # Option settings
|   -- cloudwatch.config     # Other .ebextensions sections, for example 
-- .platform/
    -- nginx/                # Proxy configuration
        |-- nginx.conf
        -- conf.d/
            -- custom.conf
            -- elasticbeanstalk
               |-- server.conf

有关更多信息,请参阅url

我的 /var/log/eb-engine.log 显示了下面的消息行。

Running command /bin/sh -c cp -rp /var/app/staging/.platform/nginx/. /var/proxy/staging/nginx

【讨论】:

这看起来比我的解决方法优雅得多,谢谢!今晚晚些时候我会试一试,如果可行,我会接受。 令人沮丧的是,AWS 的文档似乎落后于其实际平台。 这就是答案 - 我浏览了至少 100 个帖子并花了 72 小时来解决这个简单的问题。 @yuya.tajima 我正在尝试像您一样扩展 nginx 配置,但它不起作用,至少对我而言。正如文档所述 .platform/nginx/ 应该复制到 /etc/nginx/conf.d (nginx配置所在的位置),但它没有。如果你做了任何其他改变,你能解释一下吗?它还在工作吗?我正在考虑使用 Buildfile 复制文件 这对我也有用!只是为了澄清答案的格式有点难以阅读,.platform 目录应该与 .ebextensions 目录处于同一级别【参考方案2】:

我也遇到了同样的问题。 解决方法是将https.conf文件放到.platform/nginx/conf.d/https.conf路径下,然后压缩到部署包中。

请参阅此link 中的“反向代理配置”。

【讨论】:

【参考方案3】:

我觉得我是互联网上唯一遇到这个问题的人。 ;-)

在深入研究日志之后,我意识到 Beanstalk 只是在部署过程的最后覆盖了我的 nginx 配置。这意味着我的.ebextensions 创建的所有文件都丢失了。

我还没有设法找到“合适”的解决方案,但我使用 postdeploy 挂钩解决了这个问题。我的 nginx 配置文件现在在/home/ec2-user 中生成,而不是/etc/nginx,如下所示:

files:
  /home/ec2-user/https.conf:
    content: |
      server 
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      /etc/pki/tls/certs/server.crt;
        ssl_certificate_key  /etc/pki/tls/certs/server.key;

        ssl_session_timeout  5m;

        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers   on;

        location / 
          proxy_pass  http://localhost:5000;
          proxy_http_version 1.1;
          proxy_set_header    Connection          $connection_upgrade;
          proxy_set_header    Upgrade             $http_upgrade;
          proxy_set_header    Host                $host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
          proxy_set_header    X-Forwarded-Proto   https;
        
      

然后在.platform/hooks/postdeploy/99_hack_nginx.sh 中(确保此目录包含在您的部署包中 - 与.ebextensions 相同):

cp /home/ec2-user/https.conf /etc/nginx/conf.d
sudo systemctl reload nginx

确保它具有正确的模式:

chmod +x .platform/hooks/postdeploy/99_hack_nginx.sh

部署并享受您的 HTTPS 流量。

【讨论】:

我有完全相同的探针...它使我们两个人。您是否设法找到更优雅的解决方案? 正确的解决方案是@yuya.tajima 和Sivelli 写的。把 https.conf 放到 .platform/nginx/conf.d/ 中,然后就可以删除 postdeploy 钩子和 ebextensions 中的代码了。

以上是关于Beanstalk 部署忽略了我在 .ebextensions 中的 nginx 配置文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk:Tomcat 忽略了我的 WAR 文件

为啥 Elastic Beanstalk 流量拆分部署策略忽略 HTTP 错误?

使用 Docker 的开发环境并部署到 AWS Elastic Beanstalk

通过 Beanstalk 部署的 Docker 容器无法连接到 RDS 上的数据库

我可以从我的 Elastic Beanstalk 部署中删除 S3 存储桶吗?

Docker Elastic Beanstalk ELB 忽略 .ebextesnions