Как я могу настроить расположение nginx для совместного использования общих параметров конфигурации?

37

Как я могу настроить общий блок конфигурации для набора местоположений?

    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;
    }

Теперь, если я попытаюсь получить доступ к /api/0.1/user, я получу 404, потому что он не передает запрос на 127.0.0.1:9000

netbrain
источник

Ответы:

54

Создайте общий конфиг прокси и включите по мере необходимости.

/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;

Ваш файл конфигурации хоста

...
location /api/0.1/user {
    include /etc/nginx/api_proxy.conf;
    proxy_cache_key /user/$http_authorization;
}
...
SleighBoy
источник
1
+1, но только одно примечание: оказывается, что вы можете включить всю конфигурацию таким образом, включая всю локацию nginx.org/en/docs/ngx_core_module.html#include
эквивалент 8
... или мой пример github.com/equivalent/scrapbook2/tree/master/examples/…
эквивалент 8
11

Большинство переменных конфигурации proxy_ * также разрешены в контексте сервера, поэтому вы можете перемещать их вверх, чтобы использовать одни и те же настройки в нескольких местах.

Однако proxy_pass следует использовать только внутри локации. Таким образом, вы должны иметь по крайней мере эту директиву в каждом месте, необязательно переопределяя значения некоторых дополнительных переменных proxy_ *.

Вадим Сергеевич Хондарь
источник
Это не будет работать, если у вас есть proxy_set_headerдирективы, зависящие от местоположения, потому что «Эти директивы наследуются от предыдущего уровня тогда и только тогда, когда на текущем уровне не определены директивы proxy_set_header». nginx.org/en/docs/http/...
Эмерсон Farrugia