Как настроить nginx для обслуживания статического содержимого из ОЗУ?

11

Я хочу настроить Nginx в качестве моего веб-сервера. Я хочу, чтобы файлы изображений кэшировались в памяти (RAM), а не на диске. Я обслуживаю небольшую страницу и хочу, чтобы несколько изображений всегда подавались из оперативной памяти. Я не хочу использовать для этого Varnish (или любые другие подобные инструменты), поскольку я считаю, что Nginx имеет возможность кэшировать содержимое в ОЗУ. Я не уверен, как я могу настроить Nginx для этого? Я попробовал несколько комбинаций, но они не сработали. Nginx постоянно использует диск для получения изображений.

Например, когда я попробовал тест Apache для тестирования с помощью следующей команды:

ab -c 500 -n 1000 http://localhost/banner.jpg

Я получаю следующую ошибку:

socket: Too many open files (24)

Я предполагаю, что это означает, что Nginx пытается открыть слишком много файлов одновременно с диска, а ОС не разрешает эту операцию. Может ли кто-нибудь предложить мне правильную конфигурацию?

Vijayendra
источник
Вы почти наверняка догадаетесь неправильно. Кроме того, откуда вы получаете ошибку?
womble
@womble Как я комментирую ниже, проблема может быть параллелизмом. Есть много потоков, пытающихся одновременно, прежде чем контент будет доступен в памяти. Не могли бы вы объяснить, почему вы думаете, что я угадаю?
Виджаендра

Ответы:

9

Если это статический контент, то он будет кешироваться в памяти по умолчанию (если не осталось свободной памяти), только не nginx, а ОС - все, что останется на диске, будет stat ().

Если вы хотите 100% памяти, вы можете просто настроить ramdisk и передавать данные оттуда.

C2H5OH
источник
Да, я понимаю, что содержимое кэшируется в памяти ОС. Но предполагается, что файл уже доступен в памяти. Проблема может быть параллелизмом. Есть много потоков, пытающихся одновременно, прежде чем контент будет доступен из памяти. Как вы думаете?
Виджаендра
1
Это проблема только в том случае, если количество запросов изменяется от 0 до 500 в одно мгновение - как только файл будет прочитан, он будет храниться там до тех пор, пока не потребуется память (наименее недавно использованный файл удаляется из кэша, если память заполнена и требуется новый файл). быть кэшированным). Шансы на то, что происходит в реальной жизни, ничтожны. Если вы уверены, что это реальный риск, используйте вместо этого решение ramdisk, просто обязательно восстанавливайте данные на ramdisk после каждой перезагрузки - ramdisk не является постоянным хранилищем по определению.
c2h5oh
Хорошо, я попробую ramdisk и посмотрю, как это работает. Спасибо за ответ.
Виджаендра
9

После того, как сервер прочитал файл с диска, он будет кэширован в ram (и будет заменен другим файлом, если у вас нет ram), проблема заключается в ограничении вашей учетной записи, вы не можете открыть столько файлов ( запустить 'ulimit -a'),

Если вы хотите изменить этот лимит - читайте о /etc/security/limits.conf

Ави Кейнан
источник
1
Вы правы, лимит открытых файлов был проблемой, так как в моей системе лимит 256. Но мне все еще нужно выяснить, как настроить Nginx для чтения файлов из памяти, а не с диска. Я не хочу менять ограничение на количество открытых файлов и скорее хочу использовать кеш для последующих запросов.
Виджаендра
4
«Я не хочу менять ограничение на количество открытых файлов» - вы делаете это неправильно. О, так очень, очень неправильно.
womble
3
@ Womble Я понимаю, чтобы решить проблему, самое простое решение - изменить лимит. Причина, по которой я не хочу менять это ограничение, состоит в том, чтобы посмотреть, что я могу сделать с конфигурацией, не меняя это ограничение. Я могу улучшить вещи, изменив некоторые другие аспекты кэширования и конфигурации. И, кстати, не могли бы вы привести причины / предложения, утверждая, почему кто-то не прав. Даже в своем первом комментарии вы сделали это без объяснения причин. Это место для профессиональных предложений, пожалуйста, перестаньте относиться к нему как к стене в фейсбуке.
Виджаендра
7

Итак, я знаю, что это действительно старый, но здесь идет.

  1. Nginx не выполняет кеширование памяти «из коробки», для этого вы захотите посмотреть на memcache, я бы порекомендовал для этого пакет openresty: http://openresty.org/. Что вы получаете из коробки (как было сказано выше, это кеш страниц)
  2. Это сообщение об ошибке, я почти уверен, от ab, а не от nginx, ошибки nginx для ограничений файла выглядят так: «ошибка (24: слишком много открытых файлов)». Помните, что в unix сокетах тоже есть файлы, поэтому для пользователя, которого вы запускаете ab, необходимо настроить его ulimit, чтобы этот сеанс запускал ab. Поскольку вы сказали, что ваш лимит составляет 256, вы просите ab использовать 500 подключений, это максимально увеличивает ваш лимит.
Бен Уитакер
источник
Бен Уитакер был прав, проблема возникла из ab, которая пытается создать 500 файлов сокетов <=> (в linux os).
Бачден
2

Файл, кэшированный в ОЗУ, все еще остается файлом!

Попробуйте вместо этого использовать модуль кэша Memcached Nginx. Но все же, 1000 одновременных соединений огромны, как вы думаете, ваш случай?

Томас Деко
источник