명명 된 위치로 DRY, 모듈 식 nginx conf (역 프록시)를 작성하는 방법


25

nginx를 여러 gunicon / mod_wsgi 응용 프로그램 앞에서 물론 서버 정적 파일 앞에서 리버스 캐싱 프록시로 사용하고 있습니다.

내 nginx conf를 빠르게 유지하는 것이 불가능하다는 것을 알게되었습니다. 문제는 비슷하거나 동일한 패턴이 있지만 깨끗하게 유지할 수 없다는 것입니다.

내가 가지고있는 가장 큰 문제 중 하나는 예를 들어 일련의 conf를 그룹화하는 방법으로 명명 된 위치를 사용하고 싶다는 것입니다.

location @django_modwsgi {
    include proxy.conf;
    proxy_pass  http://127.0.0.1:8080;        
}

location @django_gunicorn {
    include proxy.conf; # this could also be included directly in the server {} block?
    proxy_pass  http://gunicorn_builder;
}

NB. 이 문제는 gunicorn과 wsgi를 모두 가지고 있지 않습니다 . 그것은 단지 예일뿐입니다. 다른 하나는 다음과 같습니다.

location @namedlocation_1 {
     some cache settings;
     some cache_key settings;
     ignore some headers;
     expires;
     proxy_pass
}

location @namedlocation_2 {
     other cache settings;
     other cache_key settings;
     ignore some headers;
     expires;
     proxy_pass
}

그러나 이름이 지정된 위치에 전화하는 유일한 방법은 다음과 같습니다.

location /somelocation {
    try_files $uri @named_location;
}

이것은 이미 잘 느끼지 않는다, 나는 할 수 없습니다 , 나는 그것이 명명 된 위치로 직접 이동하려면 정적 파일에 대한보고 가고 nginx를 원한다! 명명 된 위치를 직접 "통화"하는 방법이 있습니까?!

내가 건조 할 수 있다고 생각한 또 다른 방법은 많은 것입니다 include...

location /somelocation {
    include django_unicorn.conf;
}

그러나 이것이 좋은 방법입니까? 매우 일반적인 설정 (예 : 프록시 설정)에 대해서는 괜찮은 것처럼 들리지만 전체 conf를 얻기 위해 다른 파일을 열어야하는 것은 읽기 쉽지 않습니다.

또한 경우에 따라 정규 표현식으로 일부 위치를 그룹화 할 수 있지만 논리적으로 관련이있을 때만 공통 블록을 동일한 블록에 넣을 수없는 경우에만 그렇게하고 싶습니다.

질문

좋은 드라이 nginx 구성을 작성하는 "공식적인"모범 사례가 있습니까?

다음과 같은 패턴을 찾고 싶습니다.

location / {
    common confs
    try_files $uri @name_location
}

** 그러나 다른 위치에 대한 특정 사례를 어떻게 작성합니까? **

conf의 드문 부분과 @named_location의 일반적인 부분으로 여러 위치를 간단히 추가 할 수 있습니까?

location /1/ {
    some cache expire settings;
    NOTHING ELSE;
}

location /2/ {
    some other cache expire settings;
    NOTHING ELSE;
}

location / {
    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

동일한 리소스를 가리키는 다른 URL이있을 때 간단히 다시 쓰면됩니까?

location /1/ {
    rewrite  ^  /3/  last;
}

location /2/ {
    rewrite ^   /4/  last; 
}

location / {
    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

또는 그것들을 모두 한 위치로 그룹화해야합니까?

location / {
    rewrite ^/1/$  /3/  last;
    rewrite ^/2/$   /4/  last; 

    common settings
    try_files
}

location @named_location {
    other common settings for this named location only
    proxy_pass
}

관련

메일 링리스트에서 많이 찾을 수 없었고 위키에서는 그 수가 줄어 들었습니다.

이것은 NGinx 모범 사례 질문과 동일하지는 않습니다 . 매우 일반적인 질문입니다.

다른 하나는 더 관련이 있습니다. 이 Nginx 구성을 어떻게 건조합니까?

답변:


6

nginx map 기능을 사용하여 비슷한 문제를 해결했습니다.

먼저 백엔드 맵에 도메인 이름을 만듭니다.

map $http_host $backend {
  myhost1.tld 192.168.1.100;
  myhost2.tld 192.168.1.101;
  default     upstream_pool1;
}

그런 다음 위치에서지도를 사용하십시오.

location / {
  common settings
  proxy_pass $backend; 
}

$ http_host 대신 다른 변수를 사용할 수 있습니다.이 매뉴얼 참조 : http://nginx.org/en/docs/http/ngx_http_map_module.html


나는 알지 못 map했거나 적어도 나는 이것을 결코 알지 못하고 이것을 이렇게 사용할 수 있다고 생각했습니다 ... 이것에 대해 조금 더 깊이 생각해보고 추가 질문 / 의견이 있는지 확인하십시오!
스테파노

2

명명 된 위치를 직접 "통화"하는 방법이 있습니까?!

적어도 하나 이상의 방법이 있습니다.

location /somelocation {
    error_page 418 = @named_location;
    return 418;
}

이 해킹으로 인해 nginx가 nginx "return"-s를 "@named_location"으로 설정할 때 "/ somelocation"에 설정된 "proxy_read_timeout"을 잊게됩니다.
Denis Ryzhkov

1
418 나는 주전자예요 ?
Walf

0

일부 지시문은 "서버"및 "위치"컨텍스트 모두에 적용 할 수 있으므로 DRY가됩니다.

# The variables below are evaluated on each request,
# allowing to DRY configs of locations.
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Real-IP $remote_addr;

location /special {
    proxy_send_timeout 10m;
    proxy_read_timeout 10m;
    proxy_pass http://pool;
}

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