Назад | Перейти на главную страницу

Правильный способ настройки фильтрации Nginx с помощью ProxyPass

Я использую Nginx для прокси-доступа к моему приложению wsgi, обслуживаемому Circus.

Я хочу разрешить трафик в это приложение для некоторых URL-адресов приложения только для определенного IP-адреса.

Пока это выглядит так:

server {
    listen   80;
    server_name  service.dev;
    access_log  /var/log/service.access.log;
    error_log  /var/log/service.error.log debug;

    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass         http://127.0.0.1:9000/;
    }

    location /admin/ {
        allow 192.168.5.0/24;
        deny all;
    }
}

Но не работает. Если у меня есть права, я получаю ошибку 404 вместо proxy_pass.

Вы знаете, как я могу это сделать без необходимости каждый раз копировать / вставлять конфигурацию proxy_pass?

Спасибо.

РЕДАКТИРОВАТЬ 2

Согласно комментариям VBart, я изменил записи в try_files к $uri @proxy_to_app. Это позволяет избежать путаницы в порядке названных местоположений (они всегда должны идти последними). Имейте в виду, что если /admin/ каталог существует локально, он будет использоваться вместо прокси.

РЕДАКТИРОВАТЬ

если ты действительно хотите использовать именованное местоположение, чтобы избежать дублирования proxy_pass для каждого местоположения вы можете использовать следующее:

server {
    listen       80;
    server_name  service.dev;
    access_log   /var/log/service.access.log;
    error_log    /var/log/service.error.log debug;

    location / { 
        # Catch all 
        try_files $uri @proxy_to_app;
    }   

    location /admin/ {
        # /admin/ only
        allow 192.168.5.0/24;
        deny  all;
        try_files $uri @proxy_to_app;
    }   

    location @proxy_to_app {
        proxy_set_header  Host $http_host;
        proxy_redirect    off;
        proxy_pass        http://127.0.0.1:9000;
    }   
}

Это что-то вроде взлома, try_files требует как минимум двух параметров, в первую очередь он будет искать локальный путь с таким же $uri (если вы хотите заменить локальные файлы). Во втором случае я указал /dev/null как второй путь; это никогда не будет использовано.

ОРИГИНАЛ

Попробуйте эту конфигурацию:

server {
    listen       80;
    server_name  service.dev;
    access_log   /var/log/service.access.log;
    error_log    /var/log/service.error.log debug;

    # Proxy settings
    proxy_set_header   Host $http_host;
    proxy_redirect     off;

    location / {
        # Catch all
        proxy_pass     http://127.0.0.1:9000/;
    }

    location /admin/ {
        # /admin/ only
        allow 192.168.5.0/24;
        deny  all;
        proxy_pass     http://127.0.0.1:9000/;
    }
}

В location / блок должен улавливать только те URI, которые впоследствии не совпадают в других блоках местоположения.