nginx本身不自带memc模块,需手动编译集成memc-nginx-module第三方模块,配置包含模块加载、memc_pass通道定义及与srcache联动实现自动缓存闭环。

确认并安装 memc-nginx-module
该模块由 OpenResty 团队维护,不能通过 `apt` 或 `yum` 直接安装。必须在编译 Nginx(或 OpenResty)时显式添加:
- 下载源码:
git clone https://github.com/openresty/memc-nginx-module.git - 重新编译 Nginx(或使用 OpenResty):
./configure --add-module=/path/to/memc-nginx-module ...
(若已用 OpenResty,它默认已集成此模块,可跳过) - 验证是否生效:
nginx -V 2>&1 | grep memc应输出包含模块路径
配置 memc_pass 与 key 规则
核心是让 Nginx 知道往哪写、用什么 key 写。注意:`memc_pass` 不是读缓存指令,而是**执行 memcached 命令的通道**,配合 `set $memc_cmd` 和 `set $memc_key` 使用:
- 定义上游 Memcached:
upstream memc_backend { server 127.0.0.1:11211; } - 在 location 中设定命令和键:
location /cache-set {<br> set $memc_cmd set;<br> set $memc_key "myapp:$arg_id";<br> set $memc_exptime 300;<br> memc_pass memc_backend;<br> }
此处会向 Memcached 写入一条 5 分钟有效期的键值对 - key 建议含业务标识(如
myapp:)和动态参数,避免冲突
搭配 srcache 实现透明缓存(关键加速点)
单独用 `memc` 只能手动写,真正实现“动态页面自动缓存”需结合 `srcache-nginx-module`:
- `srcache` 负责拦截响应,提取内容并调用 `memc` 写入;也负责请求前查缓存并直接返回
- 典型配置片段:
location / {<br> srcache_request_cache_control on;<br> srcache_fetch_skip $skip_cache;<br> srcache_store_skip $skip_cache;<br> srcache_store_statuses 200 301 302;<br> srcache_fetch_request_uri $scheme://$host$request_uri;<br> srcache_store_request_uri $scheme://$host$request_uri;<br> srcache_response_cache_control off;<br> srcache_fetch GET /memc_get;<br> srcache_store PUT /memc_set;<br> }<br> location = /memc_get { internal; set $memc_cmd get; set $memc_key $args; memc_pass memc_backend; }<br> location = /memc_set { internal; set $memc_cmd set; set $memc_key $args; set $memc_exptime 600; memc_pass memc_backend; } - 这样,首次请求 PHP 页面后,响应会被自动存入 Memcached;后续请求命中即返回,完全绕过 PHP-FPM
调优与注意事项
避免踩坑,重点关注几个硬性限制和行为细节:
- Memcached 单 value 大小上限为 1MB,超大会静默失败,建议对大响应做截断或改用 Redis
- 所有 `memc_*` 指令(如 `memc_connect_timeout`)默认单位是秒,但部分旧版本文档写毫秒,务必以
nginx -t校验语法 - 不推荐在 `http` 块全局设 `memc_pass`,必须限定在 `location` 或 `if` 内,否则配置无效
- 调试时加日志:
error_log /var/log/nginx/memc.log debug;,开启 debug 级别可看到 key 构造与命令执行过程











