ssl - 所有 Nginx 虚拟主机都可以共享同一个 ssl_session_cache 吗?

标签 ssl nginx https virtualhost

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

ssl_session_cache shared:SSL:10m;

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

文档:

shared
a cache shared between all worker processes. The cache size is specified in bytes; one megabyte can store about 4000 sessions. Each shared cache should have an arbitrary name. A cache with the same name can be used in several virtual servers.

如果只有一个缓存,那么我想将其大小乘以服务器数量。所以,如果我有 5 个服务器(即 5 个虚拟主机),那么我会在 http block 中放置 ssl_session_cache 并且:

ssl_session_cache shared:SSL:50m;   # 10 * 5 = 50

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

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

最佳答案

查看 ngx_http_ssl_session_cachenxg_http_ssl_module.c 中实现的 ssl_session_cache它创建一个名为“SSL”的共享内存区域,即一个 ssl session 缓存。对 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);

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


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

关于ssl - 所有 Nginx 虚拟主机都可以共享同一个 ssl_session_cache 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37262154/

相关文章:

nginx - 如何增加页面超时以防止504错误?

ssl - Lighttpd:仅启用了 SSLv3,但使用了 TLSv1.2

symfony - 在 vhost 或 security.yml/routing.yml 中强制使用 SSL 时无限循环

javascript - 你从哪里包含 jQuery 库?谷歌 JSAPI? CDN?

python - kafka-python 生产者 - SSL 连接失败 - 仅限 Trustore

ssl - 主服务器和故障转移服务器是否需要单独的 SSL 证书?

github - Jenkins 和 GitHub 网络钩子(Hook) : HTTP 403

macos - Nginx 未运行。没有这样的文件或目录消息 -Mac

rest - 如何使用证书 golang 发送 https 请求

ssl - Fiddler 访问 HTTPS 页面失败