Coloque nginx no modo de manutenção para determinados IPs

1

Devido à maneira como as instruções if funcionam em nginx (sem aninhamento, sem várias condições), não consigo descobrir uma maneira de combinar esses dois recursos:

  • Usando o módulo Geo do nginx, tenho uma lista de ips permitidos
  • No meu sistema de arquivos, se eu touch appname em um determinado diretório, o aplicativo entra automaticamente no 503 modo de manutenção.

Isso é o que eu gostaria de fazer, mas não é permitido no nginx:

location / {
    if (-f /var/www/maintmode/appname && $allowed_ip = no) {
        return 503;
    }   
    try_files $uri;
}

Se o acima fosse possível no nginx, qualquer pessoa na lista de permissão_do_logo do módulo Geo poderia ignorar o 503 e conseguir usar o site normalmente. Então, quando verificado, o aplicativo está funcionando rm appname do diretório de manutenção e o modo de manutenção 503 termina.

O benefício desse método seria touch uando um único arquivo ativa / desativa o modo maint sem precisar modificar um conf e recarregar o nginx.

Alguma idéia de como posso fazer algo assim funcionar?

    
por xref 01.04.2015 / 22:17

2 respostas

0

Então, graças à dica da HD, aqui está como eu resolvi essa:

Aproveitou este fato do formulário Geo docs: Quando o padrão não é especificado, o valor padrão será uma string vazia.

geo $allowed_client {
    10.0.0.0/8 allowed;
}

server {
    ...
    set $appname app1;
    location / {
        $maintmode "${appname}${allowed_client}"
        if (-f /var/www/maintmode/$maintmode) {
            return 503;
        }
        try_files $uri $uri/;
    }
}

para que eu ainda possa touch app1 no comando maint desligar um aplicativo específico, porque se tivermos um IP válido $maintmode = app1allowed , o que passará pelo 503. Todos os outros IPs terão $maintmode = app1 , o que cairá no 503. Obrigado HD!

    
por 02.04.2015 / 01:07
2

Se você já usa geo, você deve ter algo assim:

geo $client {
    default not_allowed;
    10.0.0.0/8 allowed;
}

Então, em vez de usar /var/www/maintmode/appname , você pode usar:

location / {
    if (-f /var/www/maintmode/$client) {
        return 503;
    }
    try_files $uri $uri/;
}

Se o arquivo /var/www/maintmode/not_allowed existir, a página entrará no modo de manutenção, exceto os endereços IP na lista permitida.

    
por 01.04.2015 / 23:59

Tags