Servidor proxy reverso Nginx não está servindo corretamente a página inicial armazenada em cache

1

Eu tenho configurado recentemente um novo servidor para um cliente de desenvolvimento da web e me deparo com um problema interessante. O site tem um tráfego bastante alto, mas o CMS é bastante pesado e ineficiente na geração de páginas em tempo real. Essa página lenta é carregada de forma bastante significativa quando uma página precisa ser gerada diretamente do CMS. Infelizmente, o CMS está vinculado ao Apache por vários motivos, portanto, a exibição de páginas por meio do nginx não é uma opção viável. Além disso, o arquivo .htaccess do Apache para o CMS é necessariamente um pouco complexo e envolvido, portanto, as solicitações atendidas pelo Apache são relativamente lentas.

Devido a esses fatores, estou configurando o nginx como um servidor proxy reverso e escrevi um plug-in para o CMS que renderizará páginas em HTML estático, para serem armazenadas em um diretório de cache específico onde quer que seja razoável. Minha intenção é configurar o nginx para atender pedidos de um arquivo em cache diretamente, evitando assim o apache (e, mais importante, evitando o CMS) por completo.

Até agora, esse processo transcorreu tranquilamente, e eu tenho o nginx servindo com sucesso os arquivos em cache gerados pelo CMS (com uma resposta agradável de 25ms, comparado aos 500+ ms do CMS) e passando para o CMS se um cache arquivo não existe, todos com uma exceção: a página inicial. Por algum motivo, os blocos de localização da página inicial não parecem estar sendo ativados.

Aqui está a configuração do site (anônima):

# reverse proxy config for example.com, serves all non-dynamic files
server {
        listen 80;
        server_name     example.com www.example.com;
        root            /var/www/example.com/;

        add_header "X-Index-0" "block-0";

        location ^~ ^(index)?\.?(htm|html|php|asp|aspx)?$ {
                try_files /var/www/example.com/cache/index.html @apache;
                add_header "X-Index-1" "block-1";
        }

        location / {
                try_files /var/www/example.com/cache/index.html @apache;
                add_header "X-Index-2" "block-2";
        }

        location ~ ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|js|ttf|woff|svg|otf)$ {
                etag on;
                expires 30d;
        }

        location ~ ^(.+\.html)$ {
                root /var/www/example.com/static-cache;
                add_header "X-Cache-Hit" $uri;
                try_files $1 @apache;
                expires 7d;
        }

        location @apache {
                add_header              'X-Block-Apache' 'block';
                proxy_set_header        'Host' $host;
                proxy_set_header        'X-Forwarded-From' $proxy_add_x_forwarded_for;
                proxy_pass http://127.0.0.1:8080;
        }
}

O problema é que cada solicitação para a raiz do site (example.com) é roteada para o bloco @apache, apesar da presença do /var/www/example.com/cache/index.html (verificado por abri-lo em um editor de texto com o mesmo usuário nginx é executado como). Eu adicionei as linhas add_header a cada bloco de localização em uma tentativa de entender os blocos de localização que estão sendo ativados e em que ordem. Infelizmente, o único cabeçalho que estou obtendo em resposta à solicitação é o 'X-Block-Apache', indicando para mim que nenhum dos blocos de localização direcionados à raiz do site (e quaisquer solicitações de arquivos de índice) estão sendo ativados .

Essa impressão é reforçada pelo fato de que acessar link me dá um cabeçalho 'X-Cache-Hit' e é muito obviamente servido de nginx (algo como 15x a velocidade em comparação com a página sendo servida a partir do CMS). No entanto, o primeiro bloco de localização não deve ser acionado neste caso? O que posso fazer para que o arquivo de índice seja exibido apropriadamente no nginx se visitar example.com não parece acionar o bloco "location /"?

Obrigado por qualquer ajuda!

    
por Wesley Cripe 05.03.2014 / 19:12

1 resposta

1

Seu try_files está tentando carregar o arquivo que você especificou, /var/www/example.com/var/www/example.com/cache/index.html , que não existe.

Lembre-se de especificar o caminho relativo ao documento root .

try_files /cache/index.html @apache;
    
por 05.03.2014 / 20:13