Медленный первоначальный запуск сервера при использовании Phusion Passenger и Rails


87

Чтобы сесть за руль Phusion Passenger, мы установили промежуточный сервер для небольшого приложения rails, чтобы все проверить.

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

После просмотра результатов Google мы не можем найти полезную информацию. В настоящее время у нас есть задание cron, которое время от времени отправляет запросы, пытаясь сохранить работу серверов.

Кто-нибудь еще сталкивается с этой проблемой, и вы можете посоветовать, как ее исправить?


Я также нашел этот самородок на сайте пассажирской документации: modrails.com/documentation/…
dewrich

@dewrich Я нашел инструмент ( wekkars.com ), который делает именно то, что делает ваш cronjob
SteenhouwerD

Ответы:


119

Что происходит, так это то, что ваше приложение и / или ApplicationSpawners закрываются из-за тайм-аута. Чтобы обработать ваш новый запрос, Passenger должен запустить новую копию вашего приложения, что может занять несколько секунд даже на быстрой машине. Чтобы решить эту проблему, есть несколько параметров конфигурации 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 или чего-то еще, чтобы слушатель оставался в живых.

Руководство пользователя для пассажиров - отличный справочник по этим и другим параметрам конфигурации.

изменить : если ваше приложение несовместимо с умным нерестом, есть несколько новых опций , которые очень хороши

# 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 и PassengerMinInstances, Passenger будет запускать 3 экземпляра сразу после загрузки apache и всегда будет поддерживать как минимум 3 экземпляра, поэтому ваши пользователи редко (если вообще когда-либо) будут видеть задержку.

Или, если вы уже используете умное создание (рекомендуется) PassengerMaxPreloaderIdleTime 0, вы можете добавить, PassengerPreStartчтобы получить дополнительное преимущество немедленного запуска.

Большое спасибо героям phusion.nl !


Большое спасибо за ответ. Я считаю, что мы пробовали большинство из этих настроек, но, возможно, не в правильной комбинации. Завтра пройду тестирование и вернусь.
tsdbrown

Это круто. У меня была такая же проблема с установкой Nginx / Phusion Passenger, и это мне очень помогло.
Скотт Андерсон

Я пробовал эту настройку и не вижу улучшений производительности, но наше приложение использует RMagick. Есть ли обходные пути для этого? Почему не работает с RMagick?
Chip Castle

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
Спасибо за это. Следует отметить, что я должен был заполнить пассажир_pool_idle_time в моем основном nginx.conf другими глобальными настройками, а не только в конкретной конфигурации сайта, где были включены рельсы.
Скотт Андерсон

но ошибка пассажира 4:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk 09

4

Вы также можете использовать PassengerMinInstances:

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

Это можно комбинировать с 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", который пропускает средство создания инфраструктуры, поэтому установка тайм-аута средства создания инфраструктуры в любом случае не будет иметь эффекта, если вы явно не установите для метода создания значение "smart".

Источник: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1


1

Если ваш хост - это общий сервер, такой как мой, вы не можете изменить настройки и застряли на задании cron.


К счастью, для этого конкретного приложения это не так. Но я запомню это на будущее, спасибо.
tsdbrown

1

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


0

проверить версию пассажира. <string>для старых версий это был RailsSpawnMethod .

Если это так (если я правильно помню), замените Passenger на Rails во всех директивах конфигурации или поищите старые документы для пассажиров для получения более подробной информации.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.