Devo usar reescrever ou retornar ou proxy_pass no nginx?

3

A documentação do Apache afirma claramente que mod_rewrite deve ser apenas o último recurso. Para nginx , a seção Armadilhas tem exemplos em que o request_uri é essencialmente inalterado.

A situação é esta:

  • Nós (um departamento em um instituto) temos um servidor principal que deve ser atualizado em breve (rodando o Debian 6). Para lidar com a atualização, eu configurei um servidor nginx, que fará com que as partes do proxy funcionem bem para um servidor atualizado e outras para o servidor antigo.
  • O servidor antigo tinha um número de regras ProxyPass (uma quantidade significativa de seu trabalho é proxy). Desejo deslocar todos eles para nginx , pois, como eu entendo, nginx tem mais desempenho na proxy.
  • Um grande número de usuários tem diretórios pessoais de usuários sendo atendidos por outro servidor. Para esses usuários, mas as versões til e não til estão disponíveis (por exemplo, http://my.site/muru e http://my.site/~muru seriam intermediadas por proxy para http://other.server/~muru , mas http://other.server/muru não existe).
  • Várias pastas foram intermediadas por proxy para uma pasta diferente no mesmo servidor. (por exemplo, http://my.site/local-club seria proxy para http://my.site/~local-club ).

Minha principal questão é:

  • Tendo em conta que A e B estão em proxy em C em um servidor diferente, devo usar rewrite ou location com return para redirecionar solicitações para B para A ou continuar intermediando as duas solicitações?
  • Considerando A e B no mesmo servidor, com B sendo intermediado por proxy para A, devo usar reescrever ou retornar para redirecionar B para A?

Redirecionamento (e return ) tem o benefício de indicar claramente a relação entre os dois diretórios.

As regras do meu rewrite parecem:

rewrite ^/B(/.*) /A$1 permanent;

E as regras return :

location ~ ^/B(/.*) {
    return 301 /A$1;
}

Com:

location ~ ^/~(A|D|E|F..)/ {
    proxy_pass https://other.server;
    proxy_redirect default;
}
    
por muru 29.11.2014 / 03:58

1 resposta

3

Isso não importa realmente se o seu servidor nginx lidar com milhares de solicitações por segundo e você quiser evitar que cada requisição gaste tempo de CPU reescrevendo a correspondência de regex. Agora, eu diria que use a maneira mais clara de gravar seus arquivos de configuração até atingir esse limite. Se você não tiver o orçamento para dimensionar sua infraestrutura, seria hora de pensar em enganar sua configuração para ajustá-la ao tráfego. A desvantagem do retorno é que, se você tiver vários redirecionamentos, terminará com uma localização envolvendo uma diretiva de retorno. Usando reescritas, você pode agrupar vários deles em um local genérico e testar no primeiro parâmetro para um padrão mais específico.

Atualização: um exemplo de redirecionamento múltiplo em um local genérico:

location /B {
    rewrite ^/B/foo/(.*)$ /A/newfoo/$1 permanent;
    rewrite ^/B/bar/(.*)$ /A/newbar/$2 permanent;
    rewrite ^/B/(.*)$ /A/$1 permanent;
}
    
por 30.11.2014 / 00:33