Apacheでロードバランシングを設定しましたhttpd
。
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName xxx.xxx.xxx.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://xxx.xxx.xxx.xxx:8080/
ProxyPassReverse / http://xxx.xxx.xxx.xxx:8080/
</VirtualHost>
:8080
tomcat
同じホストで実行されているApacheアプリケーションサーバー。私が働いているところではログ保存要件があるので、すべてをApacheに変更すると、分析するhttpd
のにかなり良いと思いました。
エンドユーザーが持つ可能性のあるリンクやブックマークを損なうことなく、すべての公開要求がポート80を通過するようにします。すべてがポート80を介してアプリケーションに入っているように見えるように、いくつかのポート変換を実行してこれを行います。上記のロードバランシングを考慮せずに、テーブルに次のルールを追加しましたnat
。
-A PREROUTING -i eth0 -p tcp -m tcp --dport 8080 -j REDIRECT --to-ports 80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 8081 -j REDIRECT --to-ports 80
問題は、またはhttpd
を介してアプリに直接アクセスできることです:8080
。各ルールのパケット数も増加するので、明らかに一致します。
私の質問はこれです:これが無限ループを生成しないのはなぜですか?
:8080
要求が転送され、要求httpd
自体が を通過して要求を取得しようとするため、:8080
新しい履歴書の書式を再指定するまでループが続行されます。
答え1
答えはにあります-i eth0
。
もしあなたが17.98.65.28
IPであると仮定し、接続するためにhttpdを設定していてもeth0
、トラフィックは実際にはそれを通過せずにeth0
使用されますlo
。
その理由は、ボックス自体が所有するIPにルーティングされたときにトラフィックが通過するためですlo
。
ip route get 17.98.65.28
dev lo
そのアドレスにトラフィックを送信するためにどのインターフェイスが使用されるかを示すthisを含む行が表示されます。
たとえば、私のラップトップには次のものがwlan0
あります10.252.28.62
。
$ ip route get 10.252.28.62
local 10.252.28.62 dev lo src 10.252.28.62
cache <local>