要让Nginx高效读取Memcached,核心是正确使用memcached_pass:键构造需干净统一(如md5("$uri?$args")),只存raw body;连接超时须收窄(connect/send/read分别设300ms/200ms/500ms);必须配置多节点upstream、memcached_next_upstream及error_page降级;缓冲与压缩需匹配数据特征,避免重复gzip。
要让 Nginx 高效读取 Memcached,核心不是“加功能”,而是把 memcached_pass 用对、配稳、降风险。它本身不写缓存、不处理逻辑,只做精准键查与透传响应,性能上限取决于连接控制、键构造和降级兜底是否到位。
Memcached 存的是纯响应体,不能带 HTTP 头;Nginx 读到非法内容(如含 HTTP/1.1 200 OK)会直接解析失败,返回 502。因此键设计和后端写入逻辑必须严格对齐:
$uri?$args 或哈希化(如 md5("$uri?$args"))作为 $memcached_key,避免带参请求命中同一缓存memcached_gzip_flag 2,并确保写入时 flag 设为 2(表示 gzip 编码)默认 60 秒超时在高并发下极易拖垮整个 upstream,尤其 Memcached 是内存服务,响应应在毫秒级。建议按实际链路压测结果下调:
memcached_connect_timeout 300ms:建连超时不宜超过 500ms,否则说明网络或服务异常memcached_send_timeout 200ms:命令发出后等待 ACK 的时间memcached_read_timeout 500ms:接收响应体的总耗时上限(含网络抖动)http 或 location 块中,优先在 location 级别覆盖memcached_pass 本身无重试机制,单点故障即中断。配合 memcached_next_upstream 和 error_page 才能真正可用:
upstream memcached_backend { server 127.0.0.1:11211; server 10.0.1.2:11211; }
memcached_next_upstream error timeout invalid_response not_found;
error_page 404 502 504 = @dynamic;,将未命中或失败请求转给后端生成并写缓存default_type,否则空响应可能被识别为 binary,导致浏览器乱码Memcached 返回内容长度波动大,小响应要快,大响应要稳:
memcached_buffer_size 8k 覆盖多数 HTML/JSON 场景;若缓存含 Base64 图片等大体,可提至 32k,但不宜超过 64k(避免内存碎片)memcached_flags_to_last_modified on,让后端写入时附带 Unix 时间戳 flag,Nginx 自动设 Last-Modified,支持 304 协商缓存gzip on 与 Memcached 的 memcached_gzip_flag 必须互斥启用