Як налаштувати nginx для обслуговування статичного вмісту з оперативної пам'яті?


11

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

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

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

Я отримую таку помилку:

socket: Too many open files (24)

Я думаю, це означає, що Nginx намагається відкрити занадто багато файлів одночасно з диска, а ОС не дозволяє цю операцію. Чи може хто-небудь запропонувати мені правильну конфігурацію?


Ви майже напевно здогадуєтесь неправильно. Крім того, звідки ви отримуєте помилку?
живіт

@ womble Як я коментую нижче, проблема може бути паралельністю. Є багато потоків, які намагаються одночасно, перш ніж вміст буде доступний в пам'яті. Чи можете ви поясніть, чому ви вважаєте, що я гадаю, що це неправильно?
Vijayendra

Відповіді:


9

Якщо він є статичним контентом, він за замовчуванням зберігатиметься в пам'яті (якщо тільки не залишилося пам'яті), тільки не nginx, а ОС - все, що залишиться на диску, буде stat ().

Якщо ви хочете на 100% рішення пам'яті, ви можете просто налаштувати ramdisk і подати звідти дані.


Так, я розумію, що вміст кешується в пам'яті ОС. Але припущення полягає в тому, що файл вже доступний у пам'яті. Проблемою може бути паралельність. Є багато потоків, які намагаються одночасно, перш ніж вміст стане доступним з пам'яті. Як ти гадаєш?
Vijayendra

1
Це лише проблема, якщо кількість запитів за мить переходить від 0 до 500 - як тільки файл буде прочитаний, він зберігатиметься там, поки не буде потрібна пам'ять (принаймні нещодавно використаний файл видаляється з кешу, якщо пам'ять заповнена, і потрібен новий файл для кешування). Шанси на те, що відбувається в реальному житті, малі. Якщо ви впевнені, що це справжній ризик, використовуйте натомість рішення ramdisk, просто переконайтеся, що відновите дані про ramdisk після кожного перезавантаження - ramdisk не є стійким зберіганням за визначенням.
c2h5oh

Гаразд, я спробую ramdisk і побачу, як це працює. Дякуємо за відгук.
Vijayendra

9

Після того, як сервер прочитав файл з диска, він буде кешований ram (і замінить його різним файлом, якщо у вас немає оперативної пам’яті), проблема полягає в обмеженні облікового запису, ви не можете відкрити стільки файлів ( запустити "ulimit -a"),

Якщо ви хочете змінити цей ліміт - прочитайте про /etc/security/limits.conf


1
Ви маєте рацію, проблема з відкритим лімітом файлів була проблемою, оскільки ліміт - 256 у моїй системі. Але мені ще потрібно розібратися, як налаштувати Nginx на читання файлів із пам'яті, а не з диска. Я не хочу змінювати свій ліміт відкритого файлу, а скоріше бажаю досягти використання кешу для наступних запитів.
Vijayendra

4
"Я не хочу змінювати ліміт відкритого файлу" - ви робите це неправильно. О, так дуже, дуже неправильно.
жіноча

3
@womble Я розумію, щоб виправити проблему, найпростіше рішення - змінити ліміт. Причина, через яку я не хочу змінювати цей ліміт, - це бачити, що найкраще я можу зробити з конфігурацією, не змінюючи ліміт. Я все можу вдосконалити, змінивши деякі інші аспекти кешування та конфігурації. І до речі, чи можете ви, будь ласка, навести свої причини / пропозиції, заявляючи, чому хтось помиляється. Навіть у своєму першому коментарі ви це зробили, не даючи жодних причин. Це місце для надання професійних пропозицій, будь ласка, перестаньте ставитися до цього як до вашої стіни у Facebook.
Vijayendra

7

Тож я знаю, що це справді старе, але ось що.

  1. Nginx не робить кешування пам’яті поза коробкою, ви хочете переглянути мемаш для цього, я б рекомендував пакет openresty для цього: http://openresty.org/. Що ви робите з поля (як відповіли вище, це кеш сторінок)
  2. Це повідомлення про помилку, я майже впевнений, походить від ab не від nginx, помилки nginx для обмежень файлів виглядають таким чином "не вдалося (24: Забагато відкритих файлів)". Пам'ятайте, що в unix-сокетах теж є файли, тому для користувача, у якого запущено ab as, для запуску ab потрібно буде налаштувати його polimit. Оскільки ви сказали, що ваш ліміт - 256, ви просите ab використовувати 500 з'єднань, це збільшить вашу межу.

Бен Уітакер мав рацію, проблема вийшла з ab, які намагаються створити 500 сокетів <=> файлів (в Linux Linux).
bachden

2

Файл, кешований в оперативній пам'яті, все ще є файлом!

Спробуйте використовувати замість них кешований модуль Memcached Nginx. Але все-таки 1000 одночасних з'єднань величезна, на вашу думку, справа у вас?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.