Nginx Worker 进程通过 master 分配的共享内存(mmap + MAP_SHARED)实现跨进程缓存协同,各 worker 以相对偏移访问同一物理内存;需显式声明 keys_zone 等命名 zone,由 slab 分配器管理并提供原子操作与锁机制保障安全读写。

Nginx 的 Worker 进程之间不共享内存地址空间,但通过共享内存(Shared Memory)机制实现缓存数据的跨进程可见与协同,本质是所有 Worker 读写同一块物理内存区域,而非各自维护副本。
共享内存由 master 统一分配并继承
master 进程启动时调用 mmap() 分配一块 MAP_SHARED | MAP_ANONYMOUS 内存,初始化为零;随后 fork 出多个 worker 进程。由于 Linux 的写时复制(COW)机制:
- 只读访问时,所有 worker 共享同一物理页,无拷贝开销
- 写操作仅对修改页做私有拷贝,不影响其他 worker 对原始共享区的读取
- 各 worker 虚拟地址可能不同,Nginx 内部统一用相对偏移量定位数据,避免指针失效
缓存功能依赖显式声明的 zone 区域
共享内存不是自动启用的,必须通过模块指令显式创建命名区域:
-
proxy_cache_path keys_zone=cache_one:50m;:为 proxy 缓存元数据(key、过期时间、状态)分配共享内存 -
fastcgi_cache_path keys_zone=fcgi_cache:20m;:同理用于 FastCGI 缓存索引 -
lua_shared_dict rate_limit 10m;:供 Lua 脚本使用,支持原子增减和 TTL 管理 -
ssl_session_cache shared:SSL:10m;:TLS 会话复用专用区域,所有 worker 共址访问哈希表
这些 zone 必须定义在 http 块顶层,重复定义或参数冲突会导致未定义行为。
安全读写靠内置抽象层保障
直接操作裸内存危险,Nginx 提供结构化支持:
- 底层使用 slab 分配器管理内存,避免碎片与越界
- 计数类操作(如
incr)默认走ngx_atomic_fetch_add,无需加锁 - 复合更新(如更新缓存状态+时间戳)需包裹
ngx_shmtx_lock/unlock自旋锁 - 哈希表、红黑树等结构由模块注册回调构建,字段严格按偏移布局
大小需预估,不可运行时扩容
共享内存容量在配置中固定,上线前必须合理估算:
- keys_zone:每 1MB 约存 8000–12000 个 key(取决于 key 长度)
- ssl_session_cache:默认 1MB 支持约 4000 个 session;10MB 可支撑数万个
- 过小 → 哈希冲突高、条目被 LRU 强制淘汰;过大 → 浪费内存、降低 slab 效率
reload 会清空 zone(除非 zone 定义未变),TTL 过期由后台惰性回收,不阻塞请求。


















