PHP 백엔드가 있는 Apache용 HTTP 역방향 프록시로 nginx를 사용합니다(웹마스터를 위한 .htaccess 유연성이 필요합니다). Apache 로그에 사용된 http/1.0을 보고 연결 유지 연결을 활성화하는 방법을 찾아보았습니다.
검색을 하다가 Nginx에서 이 블로그 게시물을 찾았습니다.https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives
기본적으로 NGINX는 새로 들어오는 요청이 있을 때마다 업스트림(백엔드) 서버에 대한 새 연결을 엽니다. 이는 안전하지만 비효율적입니다.[...]
기본 동작이 안전하다면 업스트림 연결 유지를 활성화할 때 어떤 위험이 있습니까?
답변1
Keepalive를 통한 연결 프록시는 HTTP 비동기화 공격/요청 밀수로 인해 위험으로 간주됩니다. 이는 백엔드가 프런트엔드와 똑같은 방식으로 다양한 클라이언트 요청을 분할하지 않을 때 발생합니다. 각 요청 후에 연결을 닫는 것은 "안전한" 옵션입니다. 이는 현재 요청이 종료된 시기를 명확하게 나타내기 때문입니다.
보다https://book.hacktricks.xyz/pentesting-web/http-request-smuggling자세한 내용은.
답변2
이미 언급했듯이 KeepAlive는 연결을 캐시하는 최적화입니다. 높은 처리량의 트래픽을 지원하는 것입니다. 나는 그것을 활성화하는 데 어떤 위험도 없다고 생각합니다. 실제로 어떤 경우에도 더 나은 결과를 얻을 것입니다.
답변3
기본 동작, 각 요청에 대한 업스트림 연결 생성은 과부하에 안전하지 않습니다. 다음과 같은 이유 때문에:
- 동일한 클라이언트 자체에서 nginx 서버로 요청이 들어오면 업스트림 서버와의 새로운 연결이 생성되며, 이를 위해 사용 가능한 새로운 로컬 포트가 사용됩니다.
- 요청이 완료되면 해당 로컬 포트의 연결이 설정된 상태에서 120초 동안 TIME_WAIT로 이동합니다. 이는 120초 동안 해당 로컬 포트를 새 요청에 재사용할 수 없음을 의미합니다.
- 이제 두 번째 요청이 동일한 클라이언트에서 오면 1단계를 반복합니다.
- 이런 식으로 무거운 짐을 위해,
- nginx(65k)에서 사용 가능한 모든 로컬 포트를 사용하게 될 수 있습니다.
- 모든 요청에 대한 연결 생성 및 종료는 비용이 많이 드는 작업입니다.
따라서 이를 방지하기 위해 할 수 있는 최선의 방법은 연결을 캐시하여 요청이 오면 업스트림 서버와 동일한 연결을 재사용할 수 있도록 하는 것입니다(마지막 요청에서와 마찬가지로 동일한 로컬 포트에서).
감사합니다 Vj