Nginx 的 memcached_pass 指令可直接从 Memcached 读取缓存并返回客户端,降低延迟与后端负载;仅支持 GET 请求,需在 location 中配置,key 默认为 $uri,未命中返回 404,须确保缓存值为纯响应体且无非法头信息。

使用 Nginx 的 memcached_pass 指令,可以在不经过后端应用(如 PHP、Python)的情况下,直接从 Memcached 读取缓存数据并返回给客户端,大幅降低响应延迟和后端负载。这种方式适用于内容稳定、可预生成并存入 Memcached 的场景,比如静态 HTML 片段、API 响应体、配置信息等。
memcached_pass 的基本用法
该指令必须放在 location 块中,且仅支持 HTTP GET 请求。Nginx 会将请求 URI(或自定义 key)作为 Memcached 的 key,发起 get 查询;若命中,直接返回 value 内容,并自动设置 Content-Type 为 text/html(除非显式覆盖)。
- 默认 key 是
$uri,但可通过set $memcached_key "xxx";自定义 - 未命中时默认返回 404,可用
error_page 404 = @fallback;回退到后端 - 需确保 Memcached 中存储的数据不含额外换行或空格,否则可能破坏 HTTP 响应格式
关键配置示例与说明
以下是一个典型配置片段:
upstream memcached_backend {
server 127.0.0.1:11211;
}
<p>server {
location /cache/ {
set $memcached_key "$uri";
memcached_pass memcached_backend;
error_page 404 = @dynamic;</p><pre class="brush:php;toolbar:false;"> # 可选:显式设置 Content-Type,避免浏览器解析错误
add_header Content-Type "text/html; charset=utf-8";
}
location @dynamic {
# 转发给后端生成内容,并在写入响应前存入 Memcached
proxy_pass http://app_backend;
# (配合 Lua 或后端逻辑实现 set 操作)
}}
注意:memcached_pass 本身只负责读,不支持写;缓存写入需由上游应用或 Lua 模块(如 ngx_http_lua_module)完成。
常见问题与规避方法
实际部署中容易遇到几个典型问题:
-
缓存值含非法头信息:Memcached 存的是纯 body,不能包含
HTTP/1.1 200 OK或Content-Type:等头行,否则会导致 Nginx 响应解析失败 -
URI 含查询参数未处理:默认
$uri不含$args,如需区分带参请求,应设为"$uri?$args"或哈希化处理 -
超时与连接失败无降级:建议配合
memcached_next_upstream error timeout invalid_response实现简单重试 -
无法设置过期时间或缓存控制头:需在写入缓存时由业务侧控制 TTL,并通过
add_header补充Cache-Control等响应头
适用场景与替代建议
适合用于:
– 页面片段级缓存(如导航栏、广告位)
– 高频低更新配置项(如站点开关、灰度规则)
– JSON API 的只读响应缓存(需确保前端能正确解析)
不适合用于:
– 需要动态 Cookie / Session 判断的个性化内容
– 频繁更新或实时性要求极高的数据
– 大文件(Memcached 单 key 默认上限 1MB,且内存成本高)
如需更灵活的缓存控制(如主动刷新、分级缓存、复杂 key 构造),建议结合 ngx_http_lua_module 使用 resty.memcached 库,或改用 proxy_cache + 后端 Cache-Control 策略。

















