Nginx 역방향 프록시 모드에서는 페이지가 완전히 로드되지 않거나 502 불량 게이트웨이가 직접 발생할 수 있습니다.
502 불량 게이트웨이가 발생하는 상황이 많이 있는데, 주로 일부 nginx 관련 시간 제한 설정 문제로 인해 발생합니다. 다음에서는 주의를 기울여야 하는 비교적 드문 상황에 대해 설명합니다.
외관 환경
nginx는 역방향 프록시 모드에서 작동하며 80이 아닌 포트를 수신합니다(이는 매우 중요합니다. 80이 아닌 포트를 수신한다는 것은 사용자가 여러 가상 호스트 구성을 준비하고 있음을 의미하는 경우가 많습니다). , 그러나 이 상황에 국한되지 않음), IP 형식의 액세스(도메인 이름 액세스의 경우에도 존재해야 하며 이는 확인되지 않았습니다).
특정 문제
여러 요소가 포함된 페이지에 액세스(정적 HTML 페이지 이상을 의미하며 클라이언트는 종종 이미지, CSS 형식 등과 같은 여러 요소를 서버에 요청함) 클라이언트가 액세스한 페이지가 불완전하고 이미지 스타일 및 기타 요소가 부족하며 502 잘못된 게이트웨이 오류가 반환됩니다.
문제 분석
이 문제를 처음 접했을 때 호스트 필드 값이 불법이고 백엔드 서버에 의해 차단되었다고 생각한 이유는 다음과 같습니다. 🎜>
1. nginx 수신 주소가 1.1.1.1:2001이고 프록시 주소가 2.2.2.2이며 프록시 서버가 다음과 같이 업스트림에 구성되어 있다고 가정합니다.
1.1.1.1:2001;
듣기
서버 2.2.2.2
}
프록시 패스 http://backend1
2. 위 구성에서 Wireshark를 통해 패킷을 캡처하면 클라이언트가 nginx 프록시에 액세스합니다. 즉, 1.1.1.1:2001의 경우 요청한 호스트는 Host:1.1.1.1입니다. 백엔드 서버의 호스트입니다. Host:backend1
(Nginx 공식 문서에서는 프록시 서버에 전달된 요청 헤더에 필드를 다시 정의하거나 추가할 수 있다고 언급합니다. 값에는 텍스트, 변수 및 이러한 지시어는 현재 수준에 정의된 Proxy_set_header 지시어가 없는 경우에만 이전 수준에서 상속됩니다. 기본적으로proxy_set_header 호스트두 개의 필드만 재정의됩니다. 프록시_세트_헤더 호스트 $proxy_host
proxy_set_header Connection close;
$host가 설정된 경우 nginx가 백엔드 서버에 액세스하는 데 사용하는 호스트는 1.1.1.1입니다. 두 경우 모두 백엔드 서버가 보안상의 이유로 요청 패킷의 호스트 필드를 제한하는 경우(2.2.2.2만, 즉 서버 자체의 주소가 합리적임) 호스트 필드에 대한 모든 잘못된 액세스가 거부되거나 리다이렉션이나 다른 처리를 반복하면 정상적인 접근이 불가능하기 때문에 이 문제를 접했을 때 백엔드 서버에서 제한을 가했다는 생각이 들었습니다.
3. 생각해 보면 백엔드 서버가 액세스 패키지의 호스트 필드를 실제로 제한한다면 불완전한 페이지 로딩이 없어야 합니다. 결국 특정 요소는 제한하지만 다른 요소는 제한하지 않는 서버가 거의 없습니다. 추가 패킷 캡처 분석을 통해 클라이언트가 처음으로 여러 요소가 포함된 페이지를 방문한 후 서버는 클라이언트에게 페이지에 포함된 다른 요소의 주소를 알려줍니다. 완전한 정보를 제공하고 서버는 클라이언트의 다른 요소 주소의 ip:port가 nginx가 서버와 통신하는 데 사용하는 호스트 필드와 정확히 동일하다는 것을 알려줍니다(nginx가 역방향 프록시를 수행하는 경우 이해할 수 있음). 포트가 호스트에 설정되지 않은 경우 기본값은 80입니다(이것이 nginx가 종종 포트 80을 수신하는 이유입니다. 문제 없음). 클라이언트는 이 반환된 주소를 기반으로 페이지 요소를 얻습니다.
4. 그래서 위 상황에서 Proxy_set_header Host $host가 설정되어 있으면 클라이언트가 페이지의 다른 요소에 접근할 수 있는 주소는 여전히 http://1.1.1.1/…이 되는 것을 알 수 있습니다. 하지만 여기에 문제가 있습니다. nginx 수신 포트는 1.1.1.1:2001이고 새 액세스는 1.1.1.1:80(http 포트 기본값은 80, https 기본값은 443)이므로 요청은 nginx를 통해 프록시가 될 수 없습니다. .
$host:$server_port는 nginx가 수신하는 포트를 추가합니다. 에게 .
Postscript이번에는 Host 필드에 대한 서버의 제한이 액세스에 영향을 미치지 않는 것으로 밝혀졌지만 개인적으로 호스트 필드는 주목할 가치가 있습니다. 예, nginx는 불법 호스트에 대한 액세스를 직접 거부할 것을 공식적으로 권장합니다. ').addClass('사전 번호 매기기').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); }); 위 내용은 완전히 로드되지 않거나 502 불량 게이트웨이를 표시하는 nginx 페이지와 불량 게이트웨이의 내용을 포함하여 nginx 역방향 프록시 포트 번호가 누락된 내용을 소개한 내용입니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.