エラスティックビーンズトークで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;
}
その部分は、 ここ について読むことができるように、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
うまくいけば、それが役立つでしょう。