缓存 404-NGINX 还是 Varnished?

缓存 404-NGINX 还是 Varnished?

我正在寻找一种解决方案,可以在 Web 服务器上长期(几天/几周)缓存 404。我当前的设置是 NGINX,使用 memcached_pa​​ss 代理和 PHP-FPM 来提供未缓存的页面(PHP 也将内容写入 memcached)。网络上的爬虫似乎都喜欢我的页面,每天会生成几千个 404 请求。它们都直接命中 PHP,因为我无法将 404 响应标头信息与 memcached 中的内容一起缓存,因此 memcached_pa​​ss 查找总是失败。

我如何缓存所有返回 404 的请求?Nginx 的 HTTPProxModule 是我想要的吗?还是我应该选择 Varnish?

从我目前的观点来看,我并不想改变我的全部的设置并从 nginx 中删除 memcached_pa​​ss 指令。到目前为止,它非常简洁,因为 php 决定请求是否可以(应该)缓存在 memcached 中。在必要时刷新缓存也非常容易。

我当前的 NGINX 配置文件:

server {
    listen       80;
            server_name  _;


            gzip  on;
            gzip_http_version 1.0;
            gzip_vary on;
            gzip_comp_level 6;
            gzip_proxied any;
            gzip_types text/plain text/html text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    location / {
                    gzip  on;
        default_type  "text/html; charset=utf-8";
                    charset         utf-8;
                    add_header  Content-Encoding    gzip;

         if ($request_method = GET)
        {
                expires      max;
                set $memcached_key $http_host$request_uri;
                memcached_pass     127.0.0.1:11211;
                error_page         404 = @fallback;
                #error_page 502 = @fallback;
                break;
        }

        root   /var/www/html/;
        index  index.php index.html;

        if (!-e $request_filename) {
            rewrite  ^/(.*)$  /index.php?q=$1  last;
            break;
        }

    }



    location @fallback {
                    internal;
        root   /var/www/html/;
        index  index.php index.html;

        if (!-e $request_filename) {
            rewrite  ^/(.*)$  /index.php?q=$1  last;
            break;
        }


    }

    location ~ \.php$ {
        root   /var/www/html/;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
                 include /etc/nginx/fastcgi_params;
    }


}

Nginx 或 Varnish 的示例配置就很好了。

谢谢你! :)

答案1

Varnish 默认缓存 404,因此不需要任何配置(初始的基本 Varnish 配置除外)——除非后端提供 Varnish 认为不可缓存的回复。

如果是这种情况,您可以使用 VCL 对答复进行必要的更改,并强制将其缓存。

我没有提供任何例子,因为确实没有例子可举。

答案2

如果您想通过 nginx 进行此操作,可以这样做:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_valid

相关内容