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>