nginx / memcached用于caching的Web代理

我试图将nginx设置为HTTP代理上的caching层 – 以及memcached来做实际的caching。 这里的目标是我们有一个内部应用程序,它会频繁地发出 HTTP请求,我们希望使用nginx + memcached作为Web代理来加速对这些传出客户端请求的响应。 (特别是因为许多请求可能是多余的)。

有很多关于设置nginx和memcached的很好的文档和信息,但是我遇到了一个问题,因为看起来我的特殊用例并不常见。 大多数教程,例子等假定读者正在运行一个网站 ,并且想要使用nginx + memcached来提高网站的性能。

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

所以,虽然似乎有很多在线的教程解释了如何将nginx设置为Webcaching代理 ,以及许多在线教程解释了如何将nginx + memcached设置为高性能cachingWeb服务器,但是,似乎很多解释如何将nginx设置为使用memcached执行实际caching的Webcaching代理。

好的,所以我试图在两条线之间读一遍,然后自己弄明白。 我有nginx和memcached都安装在开发盒本地。 我也使用“ 增强的Nginx Memcached模块 ”,而不是nginx自带的nginx + memcached模块,因为很明显,开箱即用的版本不会cachingHTTP头 (这看起来似乎使其在实践中无法使用,除非我在这里错过了一些东西)。

所以我的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. 一个HTTP请求是对nginx进行的。
  2. Nginx在memcached中查找URI。 如果find该URI,则返回caching的响应数据。
  3. 如果找不到URI,它将回落到@fallback并使用上游HTTP代理发出HTTP请求。
  4. 然后,它将该请求caching在memcached ,并将响应返回给客户端。

所以我的nginx.conf文件似乎主要是做我想做的,除了最后一步。 它看起来像是为URI添加条目,但实际的caching值看起来是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。 但它似乎并没有caching从http代理服务器得到的响应。 它只有一个0字节的www.google.com条目。

那么…我在这里错过了什么? 我如何修改我的nginx.conf文件来做我想要的?