gpt4 book ai didi

amazon-web-services - elastic beanstalk 奇怪的 nginx 配置

转载 作者:行者123 更新时间:2023-12-03 14:33:48 24 4
gpt4 key购买 nike

我正在尝试在弹性 beantalk 上遵循 nginx 的配置,有些事情没有加起来。

  • 该实例在安全组中打开端口 80,因此我假设所有传入流量都来自该端口
  • cat/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf 中的 nginx 配置指出:
    server {
    listen 8080;
    location / {
    proxy_pass http://nodejs;
    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;
    }
    gzip on;
    }

    8080端口?那个是从哪里来的?我试图弄乱它,这是实际有效的指令。
  • server_name 不见了,但 tt 你放什么都没关系。如果我自己在 server_name 中输入任何值,则此服务器规则仍将匹配所有请求,即使是那些未远程重新设置 server_name 值的请求。
  • 在连接到实例本身时,似乎两个端口都在服务:

    [ec2-user@ip-172-31-45-222 ~]$ sudo netstat -lnptu

    tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 22506/nginx

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 22506/nginx

  • 再一次,8080 从未在安全组中打开,因此弹性负载均衡通过端口 80 进入内部。流量是否神奇地从 80 转到 8080?有什么想法吗?

    最佳答案

    您忘记查看该 nginx 配置的一部分:

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

    那部分是告诉 nginx 创建一组名为 nodejs 的服务器。如您所见 here .

    8081 是 NodeJS 运行的端口(如果你使用 sample application 为例)。

    您可以通过查看 Elastic Beanstalk 日志来验证这一点:
    -------------------------------------
    /var/log/nodejs/nodejs.log
    -------------------------------------
    Server running at http://127.0.0.1:8081/

    然后,如果我们继续 nginx.conf 文件,我们可以看到您已经发布的内容:
    server {
    listen 8080;

    location / {
    proxy_pass http://nodejs;
    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;
    }


    }

    这告诉 nginx 使用 proxy pass module将所有从端口 8080 传递到我们的上游组 nodejs它在端口 8081 上运行。这意味着端口 8081 仅用于在本地访问它,但端口 8080 是让外部实体与 nginx 通信的端口,然后将内容传递到 nodejs。

    不直接暴露 NodeJS 的一些原因可以在 this StackOverflow answer 中找到。 .

    使用端口 8080,因为它是 HTTP alternate port即“通常用于 Web 代理和缓存服务器,或用于以非 root 用户身份运行 Web 服务器”。

    这就解释了端口。现在是 ELB 的问题以及事情是如何相互交流的。

    由于安全组只允许访问端口 80,因此设置了一条 iptables 规则,将端口 80 转发到端口 8080。这允许非 root 用户绑定(bind)到端口 8080,因为较低的端口号需要 root 权限。

    您可以通过运行以下命令来验证这一点:
    [ec2-user@ip-xxx-xx-xx-x ~]$ sudo iptables -t nat -L
    Chain PREROUTING (policy ACCEPT)
    target prot opt source destination
    REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080

    Chain INPUT (policy ACCEPT)
    target prot opt source destination

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination
    REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080

    Chain POSTROUTING (policy ACCEPT)
    target prot opt source destination

    总而言之,当您加载 CNAME 时,负载均衡器将流量重新路由到端口 80 上的给定实例,这是通过安全组允许的,然后 iptables 将其转发到端口 8080,这是 nginx 正在使用的端口将流量传递到端口 8081 的代理,该端口是 NodeJS 的本地端口。

    这是一个图表:
    incoming connections
    -> :80 - Load Balancer
    -> :80 - Security group
    -> :80 -> :8080 - EC2 instance, iptables forward
    -> :8080 -> :8081 - nginx, proxy pass
    -> :8081 - nodejs, your app

    希望这会有所帮助。

    关于amazon-web-services - elastic beanstalk 奇怪的 nginx 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070088/

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