연결을 위해 포트를 수신하는 애플리케이션이 있지만 업데이트 등을 위해 가끔 끄는 경우가 있습니다. 프로그램이 실행 중이면 포트에 대한 요청이 애플리케이션으로 전송되고, 프로그램이 실행되고 있지 않으면 요청이 다른 애플리케이션으로 전달되도록 시스템을 구성하는 방법을 원합니다(아마도 "일시적으로"를 반환함). 사용할 수 없음") 메시지). 이것을 달성하는 가장 쉬운 방법은 무엇입니까?
대상 컴퓨터에 대한 루트 액세스 권한이 없으므로 iptables
.
답변1
귀하의 질문은 두 프로그램이 동일한 컴퓨터에서 교대로 실행되어 동일한 포트에 바인딩된다는 것을 의미합니다. 이것은 나쁜 생각입니다. 이 작업을 수행하려고 하면 TIME_WAIT
문제(일명 2MSL)가 발생하게 됩니다.이 기사문제를 설명합니다. (Windows 중심이지만 여기서 논의하는 내용의 대부분은 모든 TCP/IP 스택에 적용됩니다.)
BSD 소켓 API는 이 보호를 해제하는 방법( )을 제공 setsockopt(SO_REUSEADDR)
하지만 이는 그렇게 하는 것이 합리적인 경우 중 하나가 아닙니다.
대신, 고가용성 사용자와 동일한 방식으로 문제에 접근하십시오.역방향 프록시세계와 "실제" 백엔드 서버.
HTTP 세계에서 이 문제를 해결하는 인기 있는 방법은 다음과 같습니다.nginx. 백엔드 서버가 다운되면 클라이언트에 정적 콘텐츠를 제공하도록 구성할 수 있습니다. 프로토콜이 HTTP, IMAP 또는 POP와 같은 것이라면 nginx를 그대로 사용할 수 있습니다. 그렇지 않은 경우 사용자 정의 프록시 서버를 구축할 수 있습니다.
올바른 작동을 위해서는 두 개의 TCP 포트가 필요할 수 있습니다. 프록시는 공용 IP의 공용 포트 번호에 바인딩됩니다. 백엔드 서버는 localhost 인터페이스의 보조 포트에만 바인딩됩니다. 이러한 방식으로 트래픽은 프록시를 통해서만 공용 네트워크에서 백엔드 서버에 도달할 수 있습니다.
두 프로그램 모두 동일한 포트에 바인딩할 수 있도록 작성된 경우 바인딩을 이스케이프할 수 있습니다. 예를 들어, 공용 IP가 이고 1.2.3.4
공용 서비스 포트가 인 경우 2345
역방향 프록시가 IP에만 바인딩되고 "실제" 서버가 포트에만 바인딩되면 두 프로그램 모두 포트에 바인딩될 수 있습니다. 둘 중 하나가 (0.0.0.0)에 바인딩되는 경우 다른 포트가 필요합니다.2345
1.2.3.4
127.0.0.1
INADDR_ANY
클라이언트가 항상 동일한 프로그램(프록시 서버)과 통신하기 때문에 이는 2MSL 문제를 해결합니다. 네트워크 스택은 2MSL 시간 내에 지워진 길 잃은 패킷을 어떻게 처리할지 혼동하지 않습니다.
역방향 프록시의 변형은 다음과 같습니다.로드 밸런서, 여기서도 작동합니다. 로드 밸런서는 지능적으로 트래픽을 다른 시스템으로 라우팅하도록 설계되었습니다. 이러한 종류의 프록시는 애플리케이션이 언젠가 수평적으로 확장되어야 한다고 생각하는 경우 적합합니다. 모든 일반 애플리케이션 서버가 다운되었을 때 특별한 "서비스 다운" 호스트로 트래픽을 보내는 방법을 알고 있는 로드 밸런서를 선택하게 됩니다.
로드 밸런서 솔루션 변형의 주요 문제점은 범용 로드 밸런서가 프록시하는 모든 백엔드 서비스가 동일한 포트 번호를 사용하고 IP만 다르다고 맹목적으로 가정할 수 있다는 것입니다. 그러나 보다 유연한 로드 밸런서를 얻거나 공유 서버에 대해 여러 IP를 얻을 수 있습니다.