【问题标题】:elastic beanstalk weird nginx configurationelastic beanstalk 奇怪的 nginx 配置
【发布时间】:2014-11-22 02:04:17
【问题描述】:

我正在尝试在弹性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?有什么想法吗?

【问题讨论】:

    标签: amazon-web-services nginx amazon-elastic-beanstalk


    【解决方案1】:

    您忘记查看该 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 传递到我们在端口 8081 上运行的上游组 nodejs。这意味着端口 8081 仅用于在本地访问它,但端口 8080 是让我们在外面实体与 nginx 对话,然后将内容传递到 nodejs。

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

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

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

    由于安全组只允许访问端口 80,因此设置了一个 iptables 规则将端口 80 转发到端口 8080。这允许非 root 绑定到端口 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
    

    希望对您有所帮助。

    【讨论】:

    • 但是 nginx 以 root 身份运行,所有 nginx 示例的配置总是 80,这就是为什么我很困惑,beanstalk 环境有什么特别之处。
    • 当然不是 所有 nginx 的配置都在端口 80 上运行。使用端口 80 编写教程比在不同的端口上运行它要简单一些一个 iptable 过滤器。 Elastic Beanstalk 没有什么特别之处,它就是我们所选择的。
    • 这是对 nodejs 应用程序的 ElasticBeanstalk nginx 设置的一个很好的解释,尤其是最后的 iptables 步骤。
    • 谢谢!我很感激@Jessedc
    • @JoshDavis 你能帮我弄清楚如何将纯 tcp 请求(非 http)代理到在不同端口上运行的节点 tcp 服务器。我怎样才能在弹性豆茎中实现这一点
    猜你喜欢
    • 2015-02-23
    • 2020-08-27
    • 2020-07-18
    • 2019-09-24
    • 2018-12-29
    • 2021-08-22
    • 2021-11-24
    • 2020-11-05
    • 2017-04-01
    相关资源
    最近更新 更多