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 上的数据库