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 配置文件的主要内容,如果未能解决你的问题,请参考以下文章