所有Nginx vhosts都可以共享相同的ssl_session_cache吗?

Kaj*_*nus 7 ssl https virtualhost nginx

对我来说,Nginx关于如何ssl_session_cache工作的文档有点不清楚.我想知道这是否:

ssl_session_cache shared:SSL:10m;
Run Code Online (Sandbox Code Playgroud)

http块中或在每个 server(即虚拟主机)块中声明,导致1)一个名为SSL的单个全局高速缓存,大10 MB.或者2)每个服务器一个10 MB缓存,所有缓存的总大小= num servers x 10 MB.

文档:

共享
所有工作进程之间共享的缓存.高速缓存大小以字节为单位指定; 一兆字节可以存储大约4000个会话.每个共享缓存都应具有任意名称.可以在多个虚拟服务器中使用具有相同名称的缓存.

如果只有一个缓存,那么我想将其大小乘以服务器数量.所以,如果我有5个服务器(即5虚拟主机),那么我将ssl_session_cachehttp块:

ssl_session_cache shared:SSL:50m;   # 10 * 5 = 50
Run Code Online (Sandbox Code Playgroud)

所以,问题是:ssl_session_cache shared:SSL:10m;每个服务器创建一个10 MB缓存,还是为所有服务器创建一个10 MB缓存?

如果是每台服务器,那么对于所有服务器,是否无法为一个单一的全局缓存配置?(如果不可能,为什么不,如果有人知道?)对我来说好像这会导致更有效的内存使用.(因为一台拥有许多客户端的服务器可以使用本来专用于其他可能暂时没有客户端的服务器的内存.)

小智 6

综观实施ssl_session_cache通过ngx_http_ssl_session_cachenxg_http_ssl_module.c它创建了一个名为“SSL”一个共享内存区,即一个SSL会话缓存。对ssl_session_cache 的任何后续调用都会检索先前配置的名为“SSL”的共享内存区域,而不是创建一个新区域(cmp. ngx_shared_memory_add in ngx_cycle.c)。


这可以通过为相同的名称配置不同的大小来轻松验证,如下所示:

...
ssl_session_cache shared:SSL:4m;

server {
    ...
    ssl_session_cache shared:SSL:50m;
}
Run Code Online (Sandbox Code Playgroud)

这会导致错误消息,例如:

[emerg] the size 52428800 of shared memory zone "SSL" conflicts with already declared size  4194304 in /etc/nginx/nginx.conf:37
Run Code Online (Sandbox Code Playgroud)

细节 (已添加 KajMagnus)

共享内存区域在此处添加:

  sscf->shm_zone = ngx_shared_memory_add(cf, &name, n,
                                         &ngx_http_ssl_module);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,不同的names 会导致创建不同的缓存。因此,一个人可以拥有许多不同的共享内存缓存,每个缓存都有自己唯一的名称。但是,每个服务器只能使用一个共享 SSL 内存区域——结构shm_zone上每个 SSL 服务器配置只有一个ngx_http_ssl_srv_conf_t *sscf


tl;dr SSL 会话缓存是在 http 还是服务器级别声明并不重要。只要为缓存分配了相同的名称,就会使用相同的缓存。为了防止同名缓存出现错误消息,必须始终使用相同的大小。