我试图将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; } }
所以我的理解是,这个应该做的是:
@fallback并使用上游HTTP代理发出HTTP请求。 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文件来做我想要的?