gpt4 book ai didi

amazon-web-services - 在 AWS Linux 2 上运行的 NGINX 配置中访问 Elastic Beanstalk 环境属性

转载 作者:行者123 更新时间:2023-12-04 11:32:05 28 4
gpt4 key购买 nike

我之前在 AWS Linux AMI 上有过这个工作,但在 AWS Linux 2 上没有运气。
我需要在 EB 应用程序部署期间从 Nginx 配置文件访问我的环境属性。它是一个单实例节点服务器。
我使用 AWS Linux AMI 是这样做的,并且没有问题:
.ebextensions/00_options.config

option_settings:
aws:elasticbeanstalk:application:environment:
DOMAIN: socket.example.com
MASTER_DOMAIN: https://example.com
etc..
.ebextensions/10_proxy.config
... some configs ...

files:

/etc/nginx/conf.d/proxy.conf:
mode: "000644"
owner: root
group: root
content: |

upstream nodejs {
server 127.0.0.1:8081;
keepalive 256;
}

map $http_origin $cors_header {
hostnames;
default "";
`{"Fn::GetOptionSetting": {"Namespace": "aws:elasticbeanstalk:application:environment", "OptionName": "MASTER_DOMAIN"}}` "$http_origin";
}

server {

listen 80;
listen 8080;

server_name `{"Fn::GetOptionSetting": {"Namespace": "aws:elasticbeanstalk:application:environment", "OptionName": "DOMAIN"}}`;

location ~ /.well-known {
allow all;
root /usr/share/nginx/html;
}
location / {
return 301 https://$host$request_uri;
}
}

etc..


.... some more configs ....

我不包括上面的大部分配置,因为它们不相关。
所以当我之前这样做时,一切都按预期进行。配置文件插入了我的属性并在 /etc/nginx/conf.d/proxy.conf 中创建了文件文件夹。

现在有了 AWS Linux 2,规范发生了变化,我们必须在 .platform/nginx/conf.d 中添加我们的 Nginx 配置文件。文件夹位于我们的应用程序包根文件夹中。
Here the reference (见 反向代理配置 )
所以我创建了一个 proxy.conf上面提到的位置中的文件,内容是之前插入的 /etc/nginx/conf.d/proxy.conf .

.platform/nginx/conf.d/proxy.conf
upstream nodejs {
server 127.0.0.1:8081;
keepalive 256;
}

map $http_origin $cors_header {
hostnames;
default "";
`{"Fn::GetOptionSetting": {"Namespace": "aws:elasticbeanstalk:application:environment", "OptionName": "MASTER_DOMAIN"}}` "$http_origin";
}

etc...
然后问题就开始了..
本次初试抛出 unexpected "{" in /var/proxy/staging/nginx/conf.d/proxy.conf:11对我。
之后我尝试了很多东西。用 ${MASTER_DOMAIN} 试过了并弄乱了新的 EB AWS Linux 2 hooks (参见上面的链接 平台 Hook )。一切都无济于事,似乎您无法从 Nginx 配置访问属性。我读过一篇来自 Nginx 的文章或文档,今天提到了类似的东西,但我再也找不到了(做了很多谷歌搜索)。

我还尝试创建一个配置文件,就像我在工作版本中所做的那样,目的是将临时文件保存在包含属性的某处,然后将此文件包含在所需的 .platform/nginx/conf.d/proxy.conf 中。文件,因为我开始认为没有办法将它们直接包含在新规范中。
.ebextensions/10_proxy.config
... some configs ....

files:

/var/proxy/staging/custom_folder/proxy.conf:
mode: "000644"
owner: root
group: root
content: |

etc...
.platform/nginx/conf.d/proxy.conf
include custom_folder/proxy.conf;
带着这个想法我做了很多废话,我创建了 hooks用于创建( mkdir )目录,我试图在其中临时保存导致新权限错误的文件。我无法为 prebuild 授予适当的权限, postdeploy文件,但这是另一个问题。
还有更多的尝试和失败......

但后来我读过(也来自上面的链接):
“如果您将代理配置为向多个应用程序进程发送流量,您可以配置多个 环境属性 ,并在 代理配置 和您的应用程序代码中使用它们的值。”
希望回来了..这是否意味着我实际上 CAN 直接将环境变量添加到位于 .platform 中的 Nginx 配置中目录? ......我不知道......你知道吗?

我可以继续描述我整夜尝试的所有事情,所以我会在这里停下来。我希望你明白这个问题。如果不问我,我会尽力使这一切都可以理解。
在与这个问题作斗争 14 小时后,我的头脑也不再很清楚了。我需要休息一下。
如果你做到了最后感谢你的时间和帮助将不胜感激。

最佳答案

概括
一种方法是在 .platform/hooks/postdeploy 中创建一个 shell 脚本。 .
这是一个简化示例,假设您有一个名为 MASTER_DOMAIN 的 Elastic Beanstalk 环境属性。 :

#!/bin/bash

# write nginx config file
cat > /etc/nginx/conf.d/elasticbeanstalk/test.conf << LIMIT_STRING
location /test/ {
default_type text/html;
return 200 "nginx variable: \$host, and EB env property: $MASTER_DOMAIN";
}
LIMIT_STRING

# restart nginx service so the config takes effect
systemctl restart nginx.service
location此示例中的块可以替换为 nginx content来自 .ebextensions/10_proxy.config在原帖中。不需要 Fn::GetOptionSetting东西虽然。
我认为您还需要 .platform/confighooks/postdeploy 中的重复脚本.
详情如下。
(对不起文字墙)
nginx中的环境变量
实际上,正如在 here 中讨论的那样和 here ,不可能(开箱即用)在 http 中使用 os 环境变量, server , 或 location nginx 配置文件中的块。有一些变通方法,例如使用 lua、perl 或模板,但我们不讨论这些。这部分与 AWS 无关。
在 Amazon Linux AMI (AL1) 的 OP 原始配置中,使用 files .ebextensions/10_proxy.config 中的部分,他们实际上是在部署过程中使用 shell 脚本编写 nginx 配置文件。 shell 脚本扩展了环境变量,但结果 proxy.conf for nginx 实际上并没有访问任何环境变量。
这就是它适用于 AL1 的原因。
平台 Hook
现在,对于 Amazon Linux 2 (AL2),我们可以使用 .platform/hooks 中的 shell 脚本执行类似的操作。和 .platform/confighooks文件夹。
这些 .platform钩子(Hook)脚本作为 root 执行用户,并且他们有权访问 Elastic Beanstalk (EB) 环境属性。 EB 环境属性可以像普通操作系统环境变量一样访问,因此无需使用 Fn::GetOptionSetting东西。
基本上,我们需要创建一个 shell 脚本,用 content 写入一个文件。来自您的原创 .ebextensions/10_proxy.config .但是,我们需要考虑两个问题:
  • 我们应该使用 prebuild , predeploy , 或 postdeploy钩?
  • 我们的 nginx 的正确目标目录是什么 proxy.conf文件?

  • 文件位置
    要回答这些问题,我们必须引用 AWS 文档 Extending Elastic Beanstalk Linux platforms ,特别是 Instance deployment workflow部分。

    ... The current working directory (cwd) for platform hooks is the application's root directory. For prebuild and predeploy files it's the application staging directory, and for postdeploy files it's the current application directory. If one of the files fails (exits with a non-zero exit code), the deployment aborts and fails.


    这很有趣,但留下了一些问题,例如“应用程序暂存目录”在哪里?我们可以通过检查我们的部署日志文件之一来填补空白。基于我们的 eb-engine.log ,这是在应用程序部署期间平台 Hook 和 nginx 配置文件发生的情况(跳过了很多细节):
  • 源包从 S3 下载并解压到 /var/app/staging/
  • 平台 Hook 在 .platform/hooks/prebuild/被执行
  • 代理服务器配置复制自 /var/app/staging/.platform/nginx//var/proxy/staging/nginx
  • 平台 Hook 在 .platform/hooks/predeploy/被执行
  • 代理服务器启动,配置从/var/proxy/staging/nginx/复制过来至 /etc/nginx
  • 平台 Hook 在 .platform/hooks/postdeploy/被执行

  • 请注意,部署后应用程序位于 /var/app/current .
    基于以上,有几种选择:
  • .platform/hooks/postdeploy 中创建一个 shell 脚本写入 /etc/nginx/conf.d/proxy.conf .
    这个阶段nginx服务已经在运行,所以我们需要重启才能使配置生效。
    下面是一个最小的测试示例。在本例中,我们写入 elasticbeanstalk子目录,因为我们只想添加一个 location内默认 server堵塞。然后我们可以访问/test/浏览器中的页面,以检查配置是否有效。
    我们使用一些 bash io redirection ( << , > ) 写入 nginx 配置文件。
    请注意,我们需要转义任何 nginx 变量,例如$host变成 \$host ,否则 shell 会将它们解释为环境变量。
    另请注意,shell 脚本需要具有执行权限,如 More about platform hooks 下所述。在文档中。
    #!/bin/bash

    cat > /etc/nginx/conf.d/elasticbeanstalk/test.conf << LIMIT_STRING
    location /test/ {
    default_type text/html;
    return 200 "nginx variable: \$host, and EB env property: $MASTER_DOMAIN";
    }
    LIMIT_STRING

    systemctl restart nginx.service
  • 或者,我们可以在 .platform/hooks/predeploy 中创建一个 shell 脚本。写入 /var/proxy/staging/nginx/conf.d/proxy.conf .
    这种情况下不需要重启nginx服务,因为这个钩子(Hook)是在应用服务器配置之前执行的。

  • 谨防:
    不确定这是错误还是设计功能,但我们新创建的 proxy.conf在配置部署(与应用程序部署相反)后消失,除非我们在 .platform/confighooks/postdeploy 中放置重复的脚本目录。不是很干...
    编辑:AWS 支持确认我们需要 hooks 中的重复脚本和 confighooks在这种情况下。 application example在文档中还显示了 hooks 中的一些重复项(至少是重复的文件名)和 confighooks .
    免责声明:这是在新创建的单实例 EB 环境中进行测试的,其中“Python 3.7 在 64 位 Amazon Linux 2/3.1.5 上运行”,使用所有默认配置和默认 AWS Python 示例应用程序(仅使用我们的自定义 Hook 进行扩展)。

    关于amazon-web-services - 在 AWS Linux 2 上运行的 NGINX 配置中访问 Elastic Beanstalk 环境属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61602765/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com