Назад | Перейти на главную страницу

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

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

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

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

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

socket: Too many open files (24)

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

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

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

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

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

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

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

Кэшированный в ОЗУ файл по-прежнему остается файлом!

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