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!