Como posso servir HTML e JSON com o nginx durante o “modo de manutenção”?

1

Eu tenho uma configuração nginx para um aplicativo web PHP e gostaria de fazer com que ela sirva a um propósito adicional, e não consigo encontrar uma maneira de realizá-lo. Minha configuração atual do nginx faz o seguinte:

  • Reescreve / e /intro/* para páginas HTML estáticas para um site de "marketing" não acionado por PHP
  • Tenta carregar /maintenance.html se presente no disco, que só existe durante as implementações
  • Se /maintenance.html não existe, envia solicitações para o PHP via FastCGI

O resultado final é que as páginas estáticas permanecem disponíveis durante as implantações, e o aplicativo PHP de back-end pode ser interrompido para manutenção enquanto as implementações acontecem. A parte importante do bloco server config se parece com:

rewrite ^/$ /marketing/index.html last;
rewrite ^/intro/(.*)$ /marketing/$1.html last;

try_files $uri /maintenance.html @webapp;
location @webapp
{
    rewrite ^(.*)$ /index.php?url=$1 last;
}

include php.conf;

( php.conf config processa location ~ \.php$ locais e faz toda a configuração usual de fastcgi_param . Não há nada específico para o projeto, por isso não postei esse bloco.)

O que eu gostaria de poder fazer além do descrito acima é quando o "modo de manutenção" está ativado, atende /maintenance.html para solicitações HTTP padrão, mas responde com algum JSON ao manipular solicitações AJAX. Descobri que posso devolver com segurança conteúdo rudimentar ao fazer:

if ($http_x_requested_with = XMLHttpRequest)
{
    return 503 '{"maintenance":true}';
}

No entanto, isso obviamente acontece com todas solicitações, não apenas aquelas em que /maintenance.html está sendo exibido. Parece que vou precisar de alguma bandeira em algum lugar, já que try_files não permite que você faça coisas adicionais, dependendo do arquivo ou local selecionado.

Existe alguma maneira de o nginx ser configurado para retornar detalhes do modo de manutenção HTML e JSON?

Editar: Pensando mais nisso, seria interessante mover maintenance.html de try_files completamente, para que ele possa ser exibido com um status 503 em vez de 200.

    
por Collin Allen 20.05.2013 / 20:15

0 respostas

Tags