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 구성을 어떻게 건조합니까?
답변
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
답변
명명 된 위치를 직접 “통화”하는 방법이 있습니까?!
적어도 하나 이상의 방법이 있습니다.
location /somelocation {
error_page 418 = @named_location;
return 418;
}
답변
일부 지시문은 “서버”및 “위치”컨텍스트 모두에 적용 할 수 있으므로 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;
}