nginx/memcached 用于缓存 Web 代理

nginx/memcached 用于缓存 Web 代理

我正在尝试将 nginx 设置为 HTTP 代理之上的缓存层 - 以及 memcached 来执行实际缓存。这里的目标是我们有一个内部应用程序,它将频繁传出HTTP 请求,我们希望使用 nginx+memcached 作为 Web 代理来加快对这些传出的客户端请求的响应。(特别是因为许多请求可能是多余的)。

关于如何设置 nginx 和 memcached 的文档和信息很多,但我遇到了一个问题,因为我的特定用例似乎不太常见。大多数教程、示例等都假设读者运营网站,想使用nginx+memcached来提高网站性能。

但我的用例不同。我只想使用 nginx 作为 Web 缓存代理,并使用 memcached 作为缓存的实际存储层。同样,我对加快性能不感兴趣传入请求网站 - 我有兴趣加快传出来自内部应用程序的 HTTP 请求。

因此,尽管网上似乎有很多教程解释如何将 nginx 设置为Web 缓存代理,以及在线的许多教程解释如何将 nginx+memcached 设置为高性能缓存网络服务器,但似乎没有太多方法解释如何将 nginx 设置为使用 memcached 进行实际缓存的 Web 缓存代理。

好的,所以我尝试阅读字里行间的内容并自己弄清楚。我在开发机上本地安装了 nginx 和 memcached。我还使用“增强的 Nginx Memcached 模块”,而不是 nginx 自带的 nginx+memcached 模块,因为显然开箱即用的版本不缓存 HTTP 标头(这似乎使得它在实践中无法使用,除非我在这里遗漏了什么)。

所以我的文件的相关部分nginx.conf是:

upstream some-upstream-proxy {
    server proxy.giant-corporation.com:82;
}

upstream memcached_upstream {
    server 127.0.0.1:11211;
    keepalive 20;
}

server {
    listen       80 default_server;
    server_name my-cache-proxy;

   location @fallback {
        proxy_pass http://some-upstream-proxy;
        proxy_cache my_cache;
        proxy_redirect default;
        proxy_set_header Host      $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location / {
        set $enhanced_memcached_key "$request_uri";
        set $enhanced_memcached_key_namespace "$host";
        set $enhanced_memcached_use_add 1;
        set $enhanced_memcached_expire $http_memcached_expire;
        enhanced_memcached_hash_keys_with_md5 on;
        enhanced_memcached_pass memcached_upstream;

        error_page 404 = @fallback;
    }
}

因此,我的理解是,这应该做如下事情:

  1. 向 nginx 发出 HTTP 请求。
  2. Nginx 在 memcached 中查找该 URI。如果找到该 URI,则返回缓存的响应数据。
  3. 如果它没有找到 URI 后,它会返回@fallback 并使用上游 HTTP 代理发出 HTTP 请求。
  4. 然后它缓存该请求memcached并将响应返回给客户端。

所以我的nginx.conf文件似乎是大多除了最后一步外,我做了我想做的事情。它看起来像是在为 URI 添加一个条目,但实际缓存的值似乎为 0 字节。

例如,如果我使用上述nginx.conf文件运行 nginx 和 memcached,然后我说:

 curl http://www.google.com/ --proxy http://localhost:80

...我从 Google 获取实际响应数据。然后,如果我检查 memcached 统计信息,我会看到:

STAT cmd_get 21
STAT cmd_set 1

每次请求之后,我看到的数值cmd_get都在增加。但如果我进行实际的 memcached 转储,我会看到:

$ memcached-tool localhost:11211 dump
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 1
Dumping bucket 1 - 1 total items
add __ns__www.google.com 0 1479132450 1
0

因此,我看到 nginx 确实在与 通信memcached,并且已成功插入我请求的 URI。但它似乎并没有真正缓存从 http 代理服务器获得的响应。它只有一个 0 字节条目www.google.com

那么...我这里缺少什么步骤?我该如何修改nginx.conf文件来做我想做的事情?

相关内容