2017-01-10 1 views
0

우리는 균등하게 소수의 응용 프로그램을 SOA 패턴 아래에 가지고 있습니다. 동질성 때문에 Nginx에서 하나의 구성을 통해 모든 SOA 개의 응용 프로그램을 프록시 할 수있는 깔끔한 패턴을 정의 할 수있었습니다. Nginx 구성에 따라 절대적으로 DNSmasq과 함께 절대적인 경이로움을 수행하여 anything.yourdomain.devel을 해결합니다. a.stackoverflow.devel, b.stackoverflow.devel 도메인을 만들고지도를 통해 지정된 포트를 통해 프로젝트 폴더 아래의 적절한 앱 서버에 라우팅합니다.Nginx 구성의 업스트림 블록에서 서버 포트를 노출하는 방법?

worker_processes 2; 

    events { 
     worker_connections 1024; 
    } 

    http { 

      map $host $static_content_root { 
      hostnames; 
      default /path/to/project/folder; 
      # For typical standalone apps living in your project directory 
      # *.myapp.local.devel -> /path/to/project/myapp/public 
      ~^([^\.]+\.)*(?<app>[^\.]+)\.devel$ /path/to/project/folder/$app/public; #rails pattern 
      } 

      map $app $devel_proxy_port1 { 
      default 3000; 
      domain1 3000;   
      domain2 4000; 

      } 

      map $app $devel_proxy_port2 { 
      default 3001; 
      domain1 3001; 
      domain2 4001; 
      } 

      server { 
      listen 127.0.0.1; 
      server_name ~^([^\.]+\.)*(?<app>[^\.]+)\.[^\.]+.devel$; 


      location/{ 
       root $static_content_root; # Using the map we defined earlier 
       try_files $uri $uri/index.html @dynamic; 
      } 

      location @dynamic { 
       proxy_http_version 1.1; 
       proxy_set_header Upgrade $http_upgrade; 
       proxy_set_header Connection "upgrade"; 
       proxy_set_header Host $http_host; 
       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; 
       proxy_set_header X-Forward-Proto http; 
       proxy_set_header X-Nginx-Proxy true; 
       proxy_redirect off; 
       proxy_pass http://127.0.0.1:$devel_proxy_port1; 
      } 
      } 
     } 

이제 Nginx에 부하 분산 장치 뒤에 여러 서버를 시뮬레이션하기 위해있다. 내가 직접 하나의 서버 : 포트 쌍을 가리키는보다는 상류를 가리키는 프록시 구성을 다음과 같은 생각.

proxy_pass http://backend; 

upstream backend { 
    server http://127.0.0.1:$devel_proxy_port1; 
    server http://127.0.0.1:$devel_proxy_port2; 
} 

나는 일하는 것이 위의 생각하지만 항상 상류 컨텍스트 내에서 블록을 사용할 수없는 지도의 변수를 암시 다음과 같은 오류를 방출한다.

[emerg] 69478#0: invalid host in upstream "http://127.0.0.1:$devel_proxy_port1" in /usr/local/etc/nginx/nginx.conf:57 

이 예상되는 행동인가?

답변

0

예, 변수는 업스트림 내부에서 사용할 수 없습니다. 당신은 다른 이름 (upstream backend, upstream backend_domain 등)와 몇 상류 블록을 만들 map 통해 업스트림 이름을 확인하고 proxy_pass이 변수 넣을 수 있습니다 : 당신이 proxy_pass 내부 $app를 사용하여 map 블록을 건너 뛸 수 있습니다 어떤 경우에는

upstream backend { 
server http://127.0.0.1:3000; 
server http://127.0.0.1:3001; 
} 

upstream backend_domain1 { 
server http://127.0.0.1:3002; 
server http://127.0.0.1:3003; 
} 

upstream backend_domain2 { 
server http://127.0.0.1:3004; 
server http://127.0.0.1:3005; 
} 

... 

upstream backend_domain30 { 
server http://127.0.0.1:3060; 
server http://127.0.0.1:3061; 
} 

map $app $devel_proxy { 
default backend; 
domain1 backend_domain1; 
domain2 backend_domain2; 
... 
domain30 backend_domain30; 
} 

... 
proxy_pass $devel_proxy; 
... 

을 : proxy_pass backend_$app;를 , $app 값에 대한 추가 점검이 필요합니다. 또한 map은 동일한 응용 프로그램에 서로 다른 "도메인"을 매핑 할 수 있습니다.

+0

내가 물어 본 요점은 업스트림 블록 내부에서 매개 변수화 된 포트를 얻는 것입니다. 모든 단일 앱에는 포트 쌍이 할당되며 도메인의 이름 식별자에 따라 포트에서 가져옵니다. dmitry.stackoverflow.com은 stackoverflow.com 도메인에 dmitry라는 이름을 가지고 있으며 포트 쌍에 매핑 된 stackoverflow에 많은 이름이 많이 있습니다. 당신의 대답이 그 시나리오로 충분합니까? 어떻게 보이지? – kaji

+0

각 이름 식별자에 대해 별도의 업스트림을 만들어야합니다. –

+0

한 응용 프로그램이 3000 및 3001 포트에 바인딩되어 있지만 업스트림 내 포트가 $ app의 맵 블록에 따라 포트를 동적으로 할당 할 수 있도록 변수가 필요한 경우 작동하는 것으로 알고 있습니다. $ 앱은 첫 번째 게시물의 첫 번째지도 블록을 기준으로 30 개의 다른 값을 가질 수 있습니다. 간결을 위해, 나는 단지 $ app ie에 가능한 두 가지 가치를 보여 주었다. domain1 and domain2 – kaji