Nginx의 위치에 여러 프록시 엔드 포인트 제공


14

하위 경로 /api가 다른 끝점으로 이동 하는 단일 위치에서 서비스하려는 API 끝 점이 몇 개 있습니다 . 특히 webdis를에서 사용할 수 /api있고 독점 API를 에서 사용할 수 있기를 원합니다 /api/mypath.

redis 명령 이름과 충돌하지 않을 가능성이있는 하위 경로를 사용하고 충돌을 피하기 위해 API 디자인을 완전히 제어 할 수 있기 때문에 webdis API와의 충돌에 대해 걱정하지 않습니다.

다음은 해킹 한 테스트 서버의 구성 파일입니다.

server {
  listen 80;
  server_name localhost;
  server_name 192.168.3.90;
  server_name 127.0.0.1;

  location / {
    root /home/me/src/phoenix/ui;
    index index.html;
  }

  # temporary hardcoded workaround
  location = /api/mypath/about {
    proxy_pass http://localhost:3936/v1/about;
  }

  location /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:7379/;
  }

  # tried this but it gives "not found" error
  #location ^~ /api/mypath/ {
  #  rewrite ^/api/mypath/(.*)$ /$1 break;
  #  proxy_pass http://localhost:3936/v1/;
  #}
  #
  #location ^~ /api {
  #  rewrite ^/api/(.*)$ /$1 break;
  #  proxy_pass http://localhost:7379/;
  #}
}

/api/mypath/*포트 3936의 엔드 포인트로 이동하고 포트 7379로 모든 요청을 처리하도록 해결 방법을 변경하려면 어떻게 해야합니까?


무슨 소리 야 tried this to no avail? 해당 위치 지시문을 활성화하면 어떻게 되었습니까? 접속 시간 초과? 위치가 일치하지 않습니까?
— masegaloeh

아아 프롬프트에 감사드립니다. 오류를 발견하지 못했습니다. 추가 조사에서 오류가 API에서 발생하여 작동하고 있습니다! : D 그러나 재 작성 규칙은 URL에 v1을 추가해야하기 때문에 분명히 아닙니다 ( localhost / api / mypath / v1 / about ) ... :(
— hamstar

답변:


24

이를 위해 다시 쓰지 않아도됩니다.

server {
  ...

  location ^~ /api/ {
    proxy_pass http://localhost:7379/;
  }
  location ^~ /api/mypath/ {
    proxy_pass http://localhost:3936/v1/;
  }
}

nginx 설명서 에 따르면

위치는 접두사 문자열 또는 정규식으로 정의 할 수 있습니다. 정규식은 선행 ~*수정 자 (대소 문자 구분 안 함) 또는 ~수정 자 (대소 문자 구분 일치)로 지정됩니다. 주어진 요청과 일치하는 위치를 찾기 위해 nginx는 먼저 접두사 문자열 (접두사 위치)을 사용하여 정의 된 위치를 확인합니다. 그중 가장 긴 일치하는 접두사가있는 위치가 선택되어 기억됩니다. 그런 다음 구성 파일에 나타나는 순서대로 정규식이 검사됩니다. 정규식 검색은 첫 번째 일치시 종료되고 해당 구성이 사용됩니다. 정규식과 일치하는 것이 없으면 이전에 기억 된 접두사 위치의 구성이 사용됩니다.

가장 긴 일치 접두사 위치에 ^~수정자가 있으면 정규식이 검사되지 않습니다.

따라서 시작하는 모든 요청 /api/mypath/은 가장 긴 일치하는 접두사 위치 이므로 항상 두 번째 블록에서 제공됩니다 .

두 번째 블록이 일치하지 않으므로 첫 번째 블록이 가장 긴 일치하는 접두사 위치가 되므로 /api/바로 뒤에 mypath/나오는 요청 은 항상 첫 번째 블록에서 처리 됩니다.


2
당신은 위치 수정을 보면 ( =, ~*, ~,과 ^~)는 직관적 보일 수 ^~제외 정규 표현식 (이후는 ~정규 표현식 매치를 나타냅니다) ... 그러나, 당신이 기억하는 경우, ^정규식 문자 클래스 내부 (예를 들어 [^a-z]) 을 Negate 그 클래스 (예 에서 (az의 문자를 제외한 모든 문자)를 의미합니다 . 마찬가지로 ^~정규 표현식 위치 블록을 무효화합니다.
— Doktor J

6

알았습니다. "찾을 수 없음"오류가 nginx에서 발생한다고 생각했지만 실제로는 내 API에서 발생했습니다. 누군가 관심이 있다면 이것은 내 솔루션입니다.

server {
  listen 80;
  server_name localhost;
  server_name 192.168.3.90;
  server_name 127.0.0.1;

  location / {
    root /home/me/src/phoenix/ui;
    index index.html;
  }

  # automatically go to v1 of the (grape) API
  location ^~ /api/mypath/ {
    rewrite ^/api/mypath/(.*)$ /v1/$1 break;
    proxy_pass http://localhost:3936/;
  }

  location ^~ /api {
    rewrite ^/api/(.*)$ /$1 break;
    proxy_pass http://localhost:7379/;
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.