У нас есть NGINX, работающий с большим количеством виртуальных хостов (~ 600). К сожалению, каждый из рабочих NGINX использует большой кусок внутренней памяти (~ 6 ГБ)
При проверке памяти (строк) он дает дублирующуюся метаинформацию, которую вы обычно находите в сертификатах SSL (дублированные до более чем 100 000 раз). Мы используем только несколько разных сертификатов.
Я подозревал, что виновником может быть ssl_session_cache. Он установлен на
ssl_session_cache общий: SSL: 10 м;
что неплохо увеличило бы использование памяти (10 МБ * 600 = 6 ГБ), но согласно документам http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache
Кэш с таким же именем может использоваться на нескольких виртуальных серверах.
И увеличение этого значения, по-видимому, не влияет на использование памяти.
Мы также сильно полагаемся на lua-resty, но это не должно повлиять на то, как обрабатывается SSL?
Вы знаете, что могло вызвать такое высокое использование памяти?
версия nginx: openresty / 1.13.6.1
Мы использовали Openresty в основном для аутентификации. Поскольку мы подозревали, что Openresty вызывает чрезмерное использование памяти, мы извлекли все части lua с помощью auth_request
Теперь у нас есть nginx, который возвращается к openresty для аутентификации.
При том же количестве хостов и SSL-сертификатов у нас теперь гораздо меньше памяти (~ 150 МБ на одного рабочего вместо 6 ГБ). Также openresty использует незначительный объем памяти. Так что, похоже, была некоторая проблема с openresty в сочетании с другими частями нашей конфигурации.
Хотя это не совсем ответ на исходный вопрос, это полезный обходной путь для нас и, надеюсь, для всех, кто столкнется с этой проблемой.
Я предполагаю, что это происходит потому, что nginx имеет отдельную память, выделенную для настроек каждого виртуального сервера, и эта область памяти включает копию используемого сертификата. Это означает, что даже если у вас есть только несколько отдельных сертификатов, они дублируются в памяти, когда используются на отдельных виртуальных серверах.
Кэш сеанса SSL не содержит данных сертификата, он содержит только данные сеанса для активных сеансов SSL между клиентами и сервером.