是否所有Nginx vhosts都可以共享相同的ssl_session_cache



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

ssl_session_cache shared:SSL:10m;

http块或每个server(即虚拟主机)块中声明,会导致1)一个名为SSL的全局缓存,大小为10MB。或者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兆的缓存?

如果是每台服务器,那么就没有办法为所有服务器配置一个全局缓存吗?(如果不可能,为什么不呢,以防有人知道?)在我看来,这似乎会提高内存使用效率。(因为一台服务器有很多客户端,所以可以使用专用于其他服务器的内存,而这些服务器目前可能没有客户端。)

查看ngx_http_ssl_session_cache在nxg_http_ssl_module.c中的ssl_session_cache的实现,它创建了一个名为"ssl"的共享内存区域,即一个ssl会话缓存。对ssl_session_cache的任何后续调用都会检索以前配置的名为"ssl"的共享内存区域,而不是创建一个新的共享内存区(ngx_cycle.c中的cmp.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内存区域——在ngx_http_ssl_srv_conf_t *sscf结构上,每个SSL服务器配置只有一个shm_zone


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

最新更新