많은 동일한 백엔드 서버에서 호스팅되는 Apache-PHP 애플리케이션의 로드 밸런싱 및 장애 조치에 HAProxy를 사용하고 싶습니다. HAproxy에서 실패한 노드를 감지하고 5xx 오류를 반환하지 않고 단일 HTTP 요청의 컨텍스트에서 활성 노드 그룹에서 이를 제거할 수 있는 방법이 있습니까?
이상적으로 서버는 응답 헤더("Status: Error")를 반환할 수 있으며 HAProxy는 이 헤더를 감지하고 활성 세트에서 해당 특정 노드를 제거해야 합니다.
내 앱에서 5xx 오류를 반환할 수 없습니다.
HAProxy에 이러한 구성이 가능합니까?
답변1
5xx 응답은 여전히 응답이므로 기본적으로 클라이언트에 전달됩니다.
말씀하신 수준에 맞는 제품은 본 적이 없습니다. 아무 것도 존재하지 않는 경우 사용자 지정 사후 응답 규칙을 작성할 수 있는 로드 밸런서가 필요하고, 해당 규칙이 풀에 있는 잘못된 노드의 상태를 수정하고 요청을 풀에 다시 공급할 수 있도록 액세스할 수 있어야 합니다.F5 BigIP,강바닥 StingRay (Zues)확실히 스크립팅 요소와 노드 관리를 제공합니다(f5 예를 들어 아래쪽으로).광택그리고오징어순수 로드 밸런서는 아니지만 백엔드 응답 후 응답을 수정하는 기능도 제공합니다. 하지만 노드/풀 관리에 대한 액세스 권한은 확실하지 않습니다. 또한 5xx 응답과 동일한 방식으로 요청 시간 초과를 처리해야 합니다.
노드 상태를 모니터링하는 데 사용하는 페이지는 애플리케이션 상태를 철저하게 테스트하고 자주 방문할 수 있는 페이지여야 합니다.
가장 가까운 HAProxy는 다음과 같습니다.observe <mode>
이를 통해 일반 트래픽에서 발생하는 오류에 대응할 수 있습니다.
내 앱에서 5xx 오류를 반환할 수 없습니다.
어느 시점에서는 그런 일이 일어날 것입니다.
답변2
나는 Mindthemonkey의 의견 대부분에 동의합니다. 응답을 차단하고 이를 사용자 정의 콘텐츠(502 오류 사용)로 대체할 수도 있지만 이는 약간 제한적입니다(예: 브라우저가 요청을 다시 게시하도록 리디렉션을 보내는 데 사용할 수 있음). 꽤 더러운.
애초에 왜 이 일을 하려고 합니까? "5xx를 반환할 수 없습니다"라고 말하는 것은 잘못된 것입니다. 왜냐하면 어쨌든 그렇게 할 것이고 클라이언트도 정의와 사양에 따라 이 문제를 처리해야 하기 때문입니다. 5xx를 반환할 때 오작동하는 CDN 뒤에 있기 때문입니까? 그렇다면 출력 오류 코드를 다시 작성하고 싶을 수도 있습니다(그러나 사용하는 코드는 모두 매우 구체적인 의미를 갖고 있으므로 주의해야 합니다).
답변3
Praveen, PHP 5.4 이상을 사용하고 있다면 이는 PHP 앱에 도움이 될 것입니다.
PGP 4.3~5.3을 사용하는 경우 대신 header()를 사용할 수 있습니다(사용법은 매뉴얼 페이지를 확인하세요).
기술적으로는 원하는 대로 HAProxy를 구성할 수 있지만 제대로 작동하도록 애플리케이션을 수정하는 것이 더 적절할 것입니다. 이 시점에서 HA 프록시는 이를 거의 자동으로 처리해야 합니다.