Jak skonfigurować lokalizacje nginx w celu udostępniania typowych opcji konfiguracji?

37

Jak skonfigurować wspólny blok konfiguracji dla zestawu lokalizacji?

    location / {

            proxy_pass        http://127.0.0.1:9000/;
            proxy_redirect    off;
            proxy_set_header  Host             $http_host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

            proxy_cache cache-test;
            proxy_cache_valid 200 302 24h;
            proxy_cache_valid 404 60s;
            add_header X-Cache-Status $upstream_cache_status;

    }


    location /api/0.1/user{
            proxy_cache_key /user/$http_authorization;
    }

Teraz, jeśli spróbuję uzyskać dostęp do /api/0.1/user, dostanę 404, ponieważ nie przekazuje żądania do 127.0.0.1:9000

sieć mózgowa
źródło

Odpowiedzi:

53

Utwórz wspólną konfigurację proxy i dołącz w razie potrzeby.

/etc/nginx/api_proxy.conf

proxy_pass        http://127.0.0.1:9000/;
proxy_redirect    off;
proxy_set_header  Host             $http_host;
proxy_set_header  X-Real-IP        $remote_addr;
proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

proxy_cache cache-test;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 404 60s;
add_header X-Cache-Status $upstream_cache_status;

Twój plik konfiguracyjny hosta

...
location /api/0.1/user {
    include /etc/nginx/api_proxy.conf;
    proxy_cache_key /user/$http_authorization;
}
...
SleighBoy
źródło
1
+1, ale tylko jedna uwaga: okazuje się, że możesz w ten sposób uwzględnić całą konfigurację, w tym całą lokalizację nginx.org/en/docs/ngx_core_module.html#include
odpowiednik
... lub mój przykład github.com/equivalent/scrapbook2/tree/master/examples/…
odpowiednik8
11

Większość zmiennych konfiguracyjnych proxy_ * jest również dozwolonych w kontekście serwera, więc można je przenieść w górę, aby udostępnić te same ustawienia w kilku lokalizacjach.

Jednak proxy_pass powinien być używany tylko w obrębie lokalizacji. Powinieneś więc mieć przynajmniej tę dyrektywę w każdej lokalizacji, opcjonalnie zastępując wartości niektórych dodatkowych zmiennych proxy_ *.

Vadym S. Khondar
źródło
To nie zadziała, jeśli masz proxy_set_headerdyrektywy specyficzne dla lokalizacji, ponieważ „Te dyrektywy są dziedziczone z poprzedniego poziomu wtedy i tylko wtedy, gdy na bieżącym poziomie nie zdefiniowano dyrektyw proxy_set_header”. nginx.org/en/docs/http/…
Emerson Farrugia