所有 Nginx 虚拟主机都可以共享相同的 ssl_session_cache 吗?

Posted

技术标签:

【中文标题】所有 Nginx 虚拟主机都可以共享相同的 ssl_session_cache 吗?【英文标题】:Can all Nginx vhosts share the same ssl_session_cache? 【发布时间】:2016-09-12 17:29:53 【问题描述】:

对我来说,the nginx docs about how ssl_session_cache works 有点不清楚。我想知道这是不是:

ssl_session_cache shared:SSL:10m;

http 块或每个 server(即虚拟主机)块中声明,导致 1) 一个名为 SSL 的全局缓存, 10 MB 大。或者 2) 在每台服务器一个 10 MB 缓存中,所有缓存的总大小 = num 个服务器 x 10 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 缓存?

如果是每台服务器,那么有没有办法为所有服务器配置一个全局缓存呢? (如果不可能,那为什么不呢,以防有人知道?)在我看来,这似乎会导致更有效的内存使用。 (因为一台服务器有很多客户端,然后可以使用本来专用于其他可能有零客户端的服务器的内存。)

【问题讨论】:

你找到答案了吗? @HassanBaig 还没有,没有。也许如果有人研究源代码。 【参考方案1】:

查看 ngx_http_ssl_session_cache 在nxg_http_ssl_module.c 中的 ssl_session_cache 实现,它创建了一个名为“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;

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

[emerg] the size 52428800 of shared memory zone "SSL" conflicts with already declared size  4194304 in /etc/nginx/nginx.conf:37

详细信息(添加了 KajMagnus)

共享内存区被添加here:

  sscf->shm_zone = ngx_shared_memory_add(cf, &name, n,
                                         &ngx_http_ssl_module);

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


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

【讨论】:

谢谢!多年来我一直在想。我编辑了答案并添加了一些细节。

以上是关于所有 Nginx 虚拟主机都可以共享相同的 ssl_session_cache 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apache和Nginx比较

nginx模块记录

lamp架构nginx常见配置:虚拟主机ssl权重backup相关算法添加

lamp架构nginx常见配置:虚拟主机ssl权重backup相关算法添加

lamp架构nginx常见配置:虚拟主机ssl权重backup相关算法添加

nginx做安全的虚拟主机