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.