Повільний початковий запуск сервера під час використання Phusion Passenger та Rails


87

Щоб перейти на вагон Phusion Passenger, ми налаштували проміжний сервер для невеликого додатка для рейок, щоб перевірити ситуацію.

Поки що це було дуже приємно використовувати, це робить встановлення / налаштування та розгортання програм легким. Проблема в тому, що веб-сайт, який ми використовуємо, потрапляє не дуже часто, і, схоже, він вимикає сервери у фоновому режимі. Це означає, що коли хтось заходить на сайт, йому дуже довго чекати, поки він не запустить новий сервер для обробки запиту. Ми прочитали документацію, спробували кілька різних налаштувань (режими smart / smart-lv2, пасажирський час тощо) і досі не знайшли реального рішення.

Проаналізувавши результати Google, ми не можемо знайти корисну інформацію. На даний момент у нас є завдання cron, яке робить запит щораз частіше, намагаючись підтримувати роботу серверів.

Хто-небудь ще стикався з цією проблемою, і чи є у вас порада щодо її вирішення?


Я також знайшов цей самородок на сайті пасажирських документів: modrails.com/documentation/…
dewrich

@dewrich Я знайшов інструмент ( wekkars.com ), який робить саме те, що робить твій cronjob
SteenhouwerD,

Відповіді:


119

Те, що відбувається, полягає в тому, що ваш додаток та / або програма розширення додатків вимикаються через час очікування. Щоб обробити ваш новий запит, пасажир повинен запустити нову копію вашої програми, що може зайняти кілька секунд, навіть на швидкій машині. Щоб вирішити проблему, існує кілька варіантів конфігурації Apache, якими ви можете підтримувати свою програму.

Ось конкретно, що я робив на своїх серверах. PassengerSpawnMethod та PassengerMaxPreloaderIdleTime - варіанти конфігурації, які є найбільш важливими у вашій ситуації.

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

Використовуючи "розумний" режим нересту та вимикаючи PassengerMaxPreloaderIdleTime, Passenger постійно зберігатиме в пам'яті 1 копію вашої програми (після першого запиту після запуску Apache). З цієї копії Applicationбуде forkвидалено окремих слухачів , що є наддешевою операцією. Це відбувається так швидко, що ви не можете зрозуміти, чи доводилося вашому додатку створювати слухач.

Якщо ваш додаток несумісний із розумним нерестом, я рекомендую зберігати великий PassengerPoolIdleTime і періодично відвідувати ваш сайт, використовуючи curl та cronjob, monit або щось інше, щоб слухач залишався живим.

Passenger Керівництво користувачем є дивовижною посиланням на ці та додаткові параметри конфігурації.

редагувати : якщо ваш додаток несумісний із розумним нерестом, є кілька нових опцій , які дуже приємні

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

Отже, якщо ви поєднаєте PassengerPreStart та PassengerMinInstance, Passenger оберне 3 екземпляри відразу після завантаження apache і завжди буде тримати щонайменше 3 екземпляри, тому ваші користувачі рідко (якщо взагалі коли-небудь) бачать затримку.

Або, якщо ви використовуєте розумний нерест (рекомендується) з PassengerMaxPreloaderIdleTime 0 уже, ви можете додати, PassengerPreStartщоб отримати додаткові переваги від негайного запуску.

Велике спасибі героям на phusion.nl !


Щиро дякую за вашу відповідь. Я вважаю, що ми спробували більшість із цих налаштувань, але, можливо, не у правильній комбінації. Завтра я пройду тестування та повернусь.
tsdbrown

Це круто. У мене була та сама проблема з установкою Nginx / Phusion Passenger, і це надзвичайно допомогло мені.
Скотт Андерсон,

Я спробував це налаштування і не бачу покращення продуктивності, але наш додаток використовує RMagick. Чи є для цього обхідні шляхи? Чому це не працює з RMagick?
Замок Чіп

1
RailsSpawnMethodприпинено на користь PassengerSpawnMethod modrails.com/documentation/…
paulus

1
Привіт, у мене така сама проблема, і я хотів би спробувати цю конфігурацію, але я не знаю, де ця конфігурація повинна бути розміщена. Дякую!
joseramonc

41

Просто, якщо користувачі сервера nginx натрапляють на це питання, і директиви 'PassengerMaxRequests', і 'PassengerStatThrottleRate' не перекладаються на nginx. Однак інші роблять:

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

HTH!

EDIT rails_spawn_methodзастаріло в пасажирі 3 замість використання

passenger_spawn_method smart; 

все інше просто добре до сьогодні.


7
Дякую за це. Одне, на що слід звернути увагу, це те, що мені довелося набивати put_pool_idle_time у моєму головному nginx.conf іншими глобальними налаштуваннями, а не просто в конкретній конфігурації сайту, де було ввімкнено reils.
Скотт Андерсон,

але помилка пасажира 4:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk

4

Ви також можете використовувати PassengerMinInsistance:

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstance

Це можна поєднати з PassengerPreStart


З документації: "Вам слід встановити для цієї опції ненульове значення, якщо ви хочете уникнути потенційно тривалого часу запуску після простою веб-сайту протягом тривалого періоду." Здається, ідеальна відповідь на питання ОП.
Чак

2

RE:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

Просто щось додати, і це може бути корисним.

Методом ікру за замовчуванням у поточному випуску є "smart-lv2", який пропускає нерестовик фреймворка, тому встановлення часу очікування нерестовика фреймворку все одно не матиме ефекту, якщо ви явно не встановите метод спауна на "розумний".

Джерело: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1


1

Якщо ваш хост є спільним сервером, таким як мій, ви не можете змінити налаштування і застрягли в роботі cron.


Для цього конкретного додатка, на щастя, це не так. Але я буду це пам’ятати на майбутнє, дякую.
tsdbrown

1

У мене також була ця проблема, але мені не вдалося змінити параметри пасажира, оскільки я не мав дозволу на запис у цей файл. Я знайшов інструмент ( http://www.wekkars.com ), який забезпечує швидке реагування мого додатка. Можливо, це також може бути рішенням для вас.


0

перевірити версію пасажира. це був RailsSpawnMethod<string>для старих версій .

Якщо так (якщо я добре пам’ятаю), замініть Passenger на Rails у всіх директивах конфігурації або шукайте старі документи для пасажирів, щоб отримати докладнішу інформацію

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