Maneira correta de configurar a filtragem Nginx com ProxyPass

2

Estou usando o Nginx para passar o proxy ao meu aplicativo wsgi servido com o Circus.

Quero permitir o tráfego para esse aplicativo para alguns URLs do aplicativo apenas para algum endereço IP.

Por enquanto, é assim:

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

Mas isso não funciona. Se eu tiver o direito, recebo um erro 404 em vez do proxy_pass.

Você sabe como posso fazer isso sem precisar copiar / colar a configuração proxy_pass a cada vez?

Obrigado.

    
por Natim 14.11.2013 / 10:49

1 resposta

3

EDIT 2

De acordo com os comentários da VBart, alterei as entradas em try_files para $uri @proxy_to_app . Isso evita qualquer confusão sobre a ordem dos locais nomeados (eles sempre devem vir por último). Esteja ciente de que, se o diretório /admin/ existir localmente, isso será usado em vez do proxy.

EDITAR

Se você realmente quiser usar um local nomeado para evitar a duplicação de proxy_pass para cada local, use o seguinte:

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

É um pouco de hack, try_files requer pelo menos dois parâmetros, na primeira instância ele procurará um caminho local com o mesmo $uri (se você quiser substituir arquivos locais). Na segunda instância, eu especifiquei /dev/null como o segundo caminho; isso nunca será usado.

ORIGINAL

Experimente esta configuração:

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

O bloco location / deve capturar somente URIs que não são correspondidos posteriormente em outros blocos de localização.

    
por 14.11.2013 / 11:19