두 개의 서로 다른 업스트림 세트가 필요합니다. 하지만 내 요청은 모두 동일한 URL(동일한 경로)에서 발생합니다. 차이점은 일부 요청에는 특별한 인수가 있고 일부에는 그렇지 않다는 것입니다. 이에 따라 사용할 업스트림을 선택해야 합니다. 다음은 구성 파일 예의 불완전한 부분입니다.
server_name localhost;
root /var/www/something/;
upstream pool1
{
server localhost:5001;
server localhost:5002;
server localhost:5003;
}
upstream pool2
{
server localhost:6001;
server localhost:6002;
server localhost:6003;
}
location /
{
# this is the part where I need help
try_files $uri @pool1;
}
location @pool1
{
include fastcgi_params;
fastcgi_pass pool1;
}
location @pool2
{
include fastcgi_params;
fastcgi_pass pool2;
}
그래서... 제가 모르는 부분은 인수/매개변수가 URL에 있는지 확인하고 이에 따라 위치 pool1 또는 pool2를 사용하는 방법입니다.
이것을 어떻게 구현할 수 있을까요?
감사해요!
답변1
@hellvinz 말이 맞아요. 댓글을 달 수 없어서 다른 답변을 드리겠습니다.
location / {
if($myArg = "otherPool") {
rewrite ^/(.*)$ /otherUpstream/$1 last;
}
try_files $uri pool1;
}
location /otherUpstream {
proxy_pass http://@pool2;
}
$myArg를 테스트 중인 쿼리 매개변수의 이름으로 변경하고 otherPool을 설정한 이름으로 변경해야 할 것 같습니다. 게다가 재작성은 테스트되지 않았기 때문에 나도 틀렸을 수도 있지만 아이디어는 얻을 수 있습니다.
답변2
나는 이것의 대체 버전을 제안하고 싶습니다.만약 없이성명. 나는 이것이 오래된 질문이라는 것을 알고 있지만 미래의 Google 직원에게는 이것이 여전히 도움이 될 수 있습니다.
나는 이것이 또한 업스트림을 선택하는 방식을 바꾸는 것을 의미한다는 것을 인정해야 합니다. 그러나 나는 이것을 하는 데에 문제가 있다고 볼 수 없습니다.
아이디어는 요청과 함께 사용자 정의 HTTP 헤더(X-Server-Select)를 보내는 것입니다. 이를 통해 nginx는 올바른 풀을 선택할 수 있습니다. 헤더가 없으면 기본값이 선택됩니다.
구성은 다음과 같을 수 있습니다.
upstream pool1
{
server localhost:5001;
server localhost:5002;
server localhost:5003;
}
upstream pool2
{
server localhost:6001;
server localhost:6002;
server localhost:6003;
}
# map to different upstream backends based on header
map $http_x_server_select $pool {
default "pool1";
pool1 "pool1";
pool2 "pool2";
}
location /
{
include fastcgi_params;
fastcgi_pass $pool;
}
원천:nginx는 http 헤더를 기반으로 다른 백엔드를 사용합니다.
미래의 나로 돌아온 후 추가됨: 서버를 쉽게 테스트하려면 크롬에 확장 프로그램을 설치할 수 있습니다(ModHeader를 사용합니다)을 사용하면 요청 헤더를 수정할 수 있습니다.