Nginx - serve .htm (se existir) em vez de .php

1

Estou procurando reduzir a carga no meu servidor.

Eu já tenho minha configuração de arquivos php, então sempre que alguém visita uma página em particular, ela armazena em cache a saída html em um arquivo whatever.htm na minha pasta / cache.

Estou usando o nginx como um 'frontend' para o meu servidor apache (que só serve arquivos php).

É possível configurar o nginx para que:

1) Se uma solicitação para index.php for solicitada, primeiro verifique se index.htm existe na pasta / cache - se for o caso, ative essa página. Se não, passe o pedido para o apache.

2) Gostaria apenas que o nginx verifique a pasta cache apenas para um conjunto particular de nomes de arquivos (nem todos os arquivos php) - uma matriz ou algo semelhante pode ser configurado dessa maneira? (apenas verifique o cache para solicitações index.php, contact.php, faq.php, etc)

3) Se servindo um arquivo .htm "cache", é possível fazer parecer que ainda está servindo o arquivo .php? Eu só não quero que a extensão mostre .htm na barra de endereços e comece a ter problemas de conteúdo duplicados com os mecanismos de busca.

Qualquer ajuda seria apreciada!

    
por Dave 25.04.2011 / 20:56

1 resposta

3

Bem, como seu aplicativo controla os próprios arquivos de cache, você pode fazer uso da try_files diretiva:

location ~ \.php$ {
  try_files /cache/$uri.html @php;

  # the directives below will affect cache serving
}

location @php {
  # pass to FastCGI or Apache proxy for PHP rendering
}

Para uma solicitação para whatever.php , isso verificará se cache/whatever.php.html existe e o retornará, se houver. Caso contrário, o pedido vai para o PHP.

Alternativa . Falando francamente, esse método funcionará, mas é bastante detalhado e será muito mais detalhado se você decidir ignorar o cache para algumas solicitações. Por exemplo, e se você quiser ir diretamente para o PHP se houver um argumento debug : whatever.php?debug ?

O Nginx tem uma boa resposta para este problema, seu caching embutido. Supondo que você esteja usando o FastCGI para servir o PHP, a configuração do Nginx ficaria assim:

# you have to declare a cache at "http" level
http {
  fastcgi_cache_path   /path/to/cache  levels=1:2
                       keys_zone=my_cache_id:10m
                       inactive=5m;
}

# server level
location / {
  fastcgi_cache my_cache_id;

  # cache HTTP replies with statuses 200, 302 for 5 minutes:
  fastcgi_cache_valid 200 302 5m;

  # do not cache if there is a "debug" argument or PHP returned HTTP header Pragma:
  fastcgi_no_cache $arg_debug$http_pragma;

  # other FastCGI directives...
  fastcgi_pass localhost:9000;
}

A documentação do Nginx é aqui

    
por 26.04.2011 / 10:21

Tags