Nginx的共享内存(shared memory)机制是其高性能架构的核心组件之一,主要用于: - 进程间通信 - 共享数据存储 - 统计信息收集 - 缓存管理
Nginx主要通过以下模块实现共享内存:
http {
# 定义10MB大小的共享内存区,命名为"one"
# 用于存储limit_req模块的限流状态
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
# 定义20MB大小的共享内存区,命名为"cache_zone"
# 用于fastcgi缓存
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=cache_zone:20m inactive=60m;
}
当Nginx启动时,master进程会:
1. 解析配置文件中的共享内存指令
2. 调用ngx_shared_memory_add
函数预分配内存
3. worker进程通过mmap
系统调用映射到同一块物理内存
http {
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=ip_limit burst=20;
proxy_pass http://backend;
}
}
}
共享内存作用: - 存储每个IP地址的请求计数 - 所有worker进程共享同一份限流状态 - 避免单worker限流不准确的问题
http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/cert.key;
}
}
共享内存作用: - 存储SSL会话参数 - 避免每次HTTPS连接都进行完整的SSL握手 - 提高HTTPS性能
通过Nginx模块开发API可以创建自定义共享内存:
typedef struct {
ngx_atomic_t counter;
time_t last_access;
} my_shm_data_t;
static ngx_int_t
ngx_http_mymodule_init(ngx_conf_t *cf)
{
ngx_shm_zone_t *shm_zone;
// 分配1MB共享内存
shm_zone = ngx_shared_memory_add(cf, "my_zone", 1024*1024, &ngx_http_mymodule_module);
if (shm_zone == NULL) {
return NGX_ERROR;
}
shm_zone->init = ngx_http_mymodule_init_zone;
shm_zone->data = NULL;
return NGX_OK;
}
static ngx_int_t
ngx_http_mymodule_init_zone(ngx_shm_zone_t *shm_zone, void *data)
{
my_shm_data_t *shm_data;
if (shm_zone->data) {
// worker进程初始化,直接使用已有数据
return NGX_OK;
}
// master进程初始化
shm_data = ngx_slab_alloc(shm_zone->shm.addr, sizeof(my_shm_data_t));
if (shm_data == NULL) {
return NGX_ERROR;
}
shm_data->counter = 0;
shm_data->last_access = 0;
shm_zone->data = shm_data;
return NGX_OK;
}
合理设置共享内存大小:
监控共享内存使用:
# 查看Nginx共享内存使用情况
nginx -V 2>&1 | grep -o with-debug && \
curl http://127.0.0.1/status # 需要启用status模块
避免频繁锁竞争:
考虑NUMA架构影响:
共享内存不足错误:
nginx: [emerg] could not build the limit_req_zone, you should increase ...
解决方案:增大共享内存区域大小或优化存储结构
内存碎片问题:
worker进程间数据不一致:
通过深入理解Nginx的共享内存机制,可以更好地优化Nginx性能并解决相关的高并发问题。