对我来说,Nginx 文档关于
ssl_session_cache
如何工作,有点不清楚。我想知道这是不是:
ssl_session_cache shared:SSL:10m;
在
http
块或 each server
(即虚拟主机)块中声明,会产生 1) 一个名为 SSL 的单个全局缓存,大小为 10 MB。或者 2) 每台服务器一个 10 MB 缓存,所有缓存的总大小 = 数量服务器 x 10 MB。
文档:
共享
所有工作进程之间共享的缓存。缓存大小为 以字节为单位指定; 1 MB 可以存储大约 4000 个会话。每个 共享缓存应该有一个任意名称。同名缓存 可以在多个虚拟服务器中使用。
如果只有一个缓存,那么我想将其大小乘以服务器数量。因此,如果我有 5 台服务器(即 5 个虚拟主机),那么我会将
ssl_session_cache
放在 http
块中,并且:
ssl_session_cache shared:SSL:50m; # 10 * 5 = 50
那么问题来了:
ssl_session_cache shared:SSL:10m;
是为每台服务器创建一个 10 MB 缓存,还是为所有服务器创建一个 10 MB 缓存?
如果是针对每台服务器,那么是否没有办法为所有服务器配置一个全局缓存? (如果不可能,那么为什么不呢,万一有人知道呢?)在我看来,这似乎会导致更有效的内存使用。 (因为一台服务器有许多客户端,然后可以使用原本专用于目前可能有零个客户端的其他服务器的内存。)
看看
nxg_http_ssl_module.c中ngx_http_ssl_session_cache的
ssl_session_cache
的实现,它创建了一个名为“SSL”的共享内存区域,即一个ssl会话缓存。
对
ssl_session_cache
的任何后续调用都会检索先前配置的名为“SSL”的共享内存区域,而不是创建新的共享内存区域(cmp。ngx_cycle.c中的ngx_shared_memory_add)。
这可以通过为同一个名称配置不同的大小来轻松验证,如下所示:
...
ssl_session_cache shared:SSL:4m;
server {
...
ssl_session_cache shared:SSL:50m;
}
这会导致错误消息,例如:
[emerg] the size 52428800 of shared memory zone "SSL" conflicts with already declared size 4194304 in /etc/nginx/nginx.conf:37
详细信息(已添加 KajMagnus)
共享内存区域被添加到这里:
sscf->shm_zone = ngx_shared_memory_add(cf, &name, n,
&ngx_http_ssl_module);
正如您所看到的,不同的
name
会导致创建不同的缓存。因此,一个人可以拥有许多不同的共享内存缓存,每个缓存都有自己唯一的名称。但是,每台服务器只能使用一个共享 SSL 内存区域 — 每个 SSL 服务器配置在 shm_zone
结构上只有一个 ngx_http_ssl_srv_conf_t *sscf
。
tl;博士 SSL 会话缓存是否在 http 级别或服务器级别声明并不重要。只要为缓存分配相同的名称,就使用相同的缓存。为了防止同名缓存出现错误消息,必须始终使用相同的大小。