我正在尝试将 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;
}
}
因此,我的理解是,这应该做如下事情:
- 向 nginx 发出 HTTP 请求。
- Nginx 在 memcached 中查找该 URI。如果找到该 URI,则返回缓存的响应数据。
- 如果它没有找到 URI 后,它会返回
@fallback
并使用上游 HTTP 代理发出 HTTP 请求。 - 然后它缓存该请求
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
文件来做我想做的事情?