nginx - se a hora atual estiver entre

1

Desejo desativar o acesso a um aplicativo durante um determinado período do dia.

É possível fazer algo assim no Nginx?

if(hour > '04:00:00' && hour < '05:00:00') {
    root /var/www/maintenance;
} else {
    root /var/www/site;
}
    
por the_nuts 01.05.2017 / 17:10

3 respostas

3

Eu só consigo pensar em 2 maneiras de fazer isso (além do cron mudar o symlink):

1) link

2) Crie um aplicativo PHP / Python / Whatever muito pequeno que retorne 200, se não as horas de manutenção, e 403, caso contrário. Use o módulo http auth. link

    
por 01.05.2017 / 18:53
1

Basta criar um script bash para atualizar um arquivo e defini-lo como um cronjob, por exemplo:

#!/usr/bin/env bash

SiteStatus="$1"
SiteStatusConfig="/etc/nginx/status.conf"

if [ "$SiteStatus" = "maintenance" ]; then
    echo "root /var/www/maintenance;" > $SiteStatusConfig
else
    echo "root /var/www/site;" > $SiteStatusConfig
fi
nginx -s reload

Depois é só colocar na configuração do seu site nginx (substituindo a diretiva root ):

include status.conf;

Em seguida, o cronjob:

0 4 * * * /opt/scripts/nginx-site-script.sh maintenance
0 5 * * * /opt/scripts/nginx-site-script.sh

Tentar fazer isso no nginx, através de uma instrução if e similares pode atrasar o nginx, já que o nginx avalia o bloco do servidor (armazenado na memória) com cada requisição.

    
por 01.05.2017 / 19:31
1

A abordagem que eu geralmente uso para isso é incluir um manipulador de tempo de inatividade sempre que eu habilitar um aplicativo em nginx. Aqui está o exemplo de configuração:

location /app_1/ {
    proxy_pass http://127.0.0.1:8001/;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    error_page 502 =200 /502-app_1-maintenance.html;
}
location /502-app_1-maintenance.html {
    root /var/www/html/error;
    try_files $uri /502-app_1-maintenance.html;
}

Sempre que o nginx não puder se conectar ao app_1 na porta 8001, ele produzirá um erro 502. Esse erro é redirecionado via error_page 502 =200 /502-app_1-maintenance.html; para uma página personalizada no segundo bloco de localização que contém uma mensagem simples "Aplicativo 1 em manutenção". Os visitantes receberão essa página personalizada "Em manutenção" sempre que o app_1 estiver inativo. Isso lida perfeitamente com tempos de inatividade não agendados e programados.

Neste exemplo, o código de resposta para o usuário para esta página de manutenção é um 200 (OK), no entanto, você pode alterar isso para uma resposta de erro, se preferir alterando =200 para o código de retorno de sua escolha.

Você também pode adicionar um pouco de javascript para que a página seja recarregada periodicamente. Como o URL da página de manutenção é o mesmo que o URL do aplicativo, quando o app_1 voltar a ficar on-line, ele substituirá a página de manutenção no próximo recarregamento automático.

No seu caso, como você deseja desabilitar o acesso público durante determinados períodos, você pode combinar essa configuração nginx com um desligamento programado do aplicativo via crontab. Se você quisesse, poderia levar seu aplicativo para uma porta diferente enquanto fazia a manutenção. Contanto que não esteja escutando em sua porta usual, os visitantes verão a página Under Maintenance.

    
por 02.05.2017 / 05:32

Tags