web-dev-qa-db-ja.com

弾性beanstalk奇妙なnginx構成

エラスティックビーンズトークで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になりますか?ここで何が起こっているのかアイデアはありますか?

16
Dmitry Fink

あなたはそのnginx設定の一部を見ることを忘れています:

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

その部分は、 ここ について読むことができるように、nodejsと呼ばれるサーバーのグループを作成するようにnginxに指示しています。

8081は、NodeJSが実行されているポートです(たとえば、 サンプルアプリケーション を使用する場合)。

これは、ElasticBeanstalkログを確認することで確認できます。

-------------------------------------
/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を直接公開しない理由のいくつかは、 このStackOverflowの回答 にあります。

ポート8080が使用されるのは、「Webプロキシとキャッシングサーバー、またはWebサーバーをroot以外のユーザーとして実行するために一般的に使用される」 HTTP代替ポート であるためです。

それはポートを説明します。今ELBの問題と物事が互いにどのように話しているか。

セキュリティグループはポート80でのアクセスのみを許可しているため、ポート80をポート8080に転送するように設定されたiptablesルールがあります。これにより、ポート番号が小さいほどルート権限が必要になるため、非ルートがポート8080にバインドできます。

これは、次のコマンドを実行して確認できます。

[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はそれをnginxが使用しているポートであるポート8080に転送します。 NodeJSのローカルポートであるポート8081にトラフィックを渡すためのプロキシ。

これが図です:

incoming connections
-> :80             - Load Balancer
-> :80             - Security group
-> :80   -> :8080  - EC2 instance, iptables forward
-> :8080 -> :8081  - nginx, proxy pass
-> :8081           - nodejs, your app

うまくいけば、それが役立つでしょう。

43
Josh Davis