현재 저는 약 20개의 서버에 수백 개의 웹 애플리케이션이 분산되어 있고, Pound 및 Haproxy를 실행하는 이들 앞에 역방향 프록시가 있습니다. Pound는 http에서 https로의 리디렉션과 SSL 암호화를 수행한 다음 Tomcat을 실행하는 백엔드 서버 중 하나로 전달하도록 각 사이트에 설정된 규칙이 있는 Haproxy로 전달합니다. 모든 사이트는 동일한 도메인에 있습니다(예: www.domain.com/webapp1, www.domain.com/webapp2).
Pound와 Haproxy는 원래 호스팅 제공업체에 의해 설정되었습니다. 이제 Pound에 대한 불만으로 인해 이 설정을 Nginx로 교체하는 것을 고려하고 있습니다. 개발 환경에서 Nginx를 실행하고, https 리디렉션과 SSL을 수행하고, 백엔드로 프록시하기 위한 몇 가지 규칙을 설정했습니다.
저는 이것이 이 문제를 해결하는 가장 좋은 방법인지 아니면 Haproxy가 모든 규칙을 처리하도록 하고 Nginx를 Pound를 대체하도록 구성하는 것이 더 나은지 알아보기 위해 몇 가지 조언을 찾고 있습니다.
내 관심사는 수백 개의 전달 규칙(아래 표시)으로 Nginx를 구성하고 결국 성능 문제가 발생한다는 것입니다. 어떤 제안이라도 환영합니다. 감사합니다.
location /webapp1/ {
proxy_pass http://10.1.9.11:8080;
}
location /webapp2/ {
proxy_pass http://10.1.9.11:8080;
}
location /webapp3/ {
proxy_pass http://10.1.9.12:8080;
}
답변1
나는 그것에 대해 많이 알지 못하지만 성능 문제에 대한 귀하의 우려를 해결할 haproxy
만큼 충분히 알고 있습니다 .nginx
nginx
구성은 친숙한 형식으로 컴파일되어 메모리 struct
에 저장되지만 요청이 있을 때마다 파일을 읽지는 않습니다. 따라서 수백 개의 구성이 location /...
동일한 횟수를 호출하는 것과 거의 같은 strlen()
속도로 실행됩니다 strncmp()
. 이는 소켓 설정에 비해 무시할 수 있는 수준입니다.
웹사이트는매칭 시작 전 정규화=
따라서 연산자( , ~
, *~
, ) 중 하나를 사용하지 않는 한 ^~
일치에 대해 정말 영리한 것은 없습니다 .
~
정규식 일치( , ) 를 사용한 *~
다음 몇 가지 if
논리를 사용하여 서버 간을 결정할 수 upstream
있지만이것은 느린 해결책이 될 것입니다.
반면에 정규식 위치가 하나 이상 있는 경우 ^~
연산자 사용을 고려해야 합니다. 보다SO에 대한 Martin Redmond의 오래되었지만 여전히 관련 있는 답변다양한 연산자와 nginx
이를 일치시키는 방법에 대해 설명합니다.