我希望减少服务器的负载。
我已经设置好了 php 文件,所以每当有人第一次访问某个特定页面时,它都会将 html 输出缓存到我的 /cache 文件夹中的 whatever.htm 文件中。
我使用 nginx 作为我的 apache 服务器(仅提供 php 文件)的“前端”。
是否可以设置 nginx 以便:
1) 如果请求了 index.php,则首先检查 /cache 文件夹中是否存在 index.htm - 如果存在,则改为提供该页面。如果不存在,则将请求传递给 apache。
2) 我只希望 nginx 检查缓存文件夹中的特定文件名集(而非所有 php 文件)——可以通过这种方式设置数组或类似内容吗?(仅检查 index.php、contact.php、faq.php 等请求的缓存)
3) 如果提供 .htm“缓存”文件,是否可以使其看起来仍然提供 .php 文件?我只是不希望扩展在地址栏中显示 .htm,并开始出现搜索引擎重复内容问题。
任何帮助,将不胜感激!
答案1
好吧,因为你的应用程序自己控制缓存文件,所以你可以使用try_files
指示:
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
}
对于对此的请求,whatever.php
将检查是否cache/whatever.php.html
存在,如果存在则返回。否则,请求将转到 PHP。
选择。坦率地说,这种方法是可行的,但它相当冗长,如果你决定绕过某些请求的缓存,它会更加冗长。例如,如果有一个参数,你想直接转到 PHP,该怎么办debug
:whatever.php?debug
?
Nginx 对此问题有一个很好的答案,即其内置缓存。假设您使用 FastCGI 来提供 PHP,则 Nginx 配置将如下所示:
# 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;
}
Nginx 文档是这里