2009-05-12 2 views
84

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

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

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

Есть ли у кого-нибудь еще проблемы и у вас есть какие-либо советы по исправлению?

+0

Я также нашел этот самородок на сайте пассажирского дока: http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerPreStart – dewrich

+0

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

ответ

114

Что происходит, что ваше приложение и/или ApplicationSpawners закрываются из-за тайм-аута. Чтобы обработать ваш новый запрос, Пассажир должен запустить новую копию вашего приложения, которая может занять несколько секунд даже на быстрой машине. Чтобы устранить проблему, есть несколько параметров конфигурации 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, Пассажир будет держать 1 копию приложения в памяти в любое время (после первого запроса после запуска Apache). Индивидуальный Application слушателей будет fork из этой копии, которая является супер-дешевой операцией. Это происходит так быстро, что вы не можете определить, было ли ваше приложение вынуждено появляться слушателем.

Если ваше приложение несовместимо с умным нерестом, я бы рекомендовал хранить большое значение PassengerPoolIdleTime и периодически нажимать на ваш сайт, используя завиток, cronjob или monit или что-то в этом роде, чтобы слушатель оставался жив.

Passenger User Guide является прекрасной ссылкой для этих и других вариантов конфигурации.

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

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

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

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

+0

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

+0

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

+0

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

1

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

+0

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

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 

Просто что-то добавить, и может быть полезным.

Метод нерестится по умолчанию в текущей версии является «смарт-lv2», который пропускает рамочное Spawner, поэтому установка таймаут рамки порождения не будет иметь эффект в любом случае, если вы не явно установить метод икру в «умный ».

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

38

Просто упаковывают есть какие-либо пользователи 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

Спасибо. Одно дело отметить, что мне пришлось набить user_pool_idle_time в моем основном nginx.conf с другими глобальными настройками, а не только в конкретной конфигурации сайта, где были установлены рельсы. –

+0

, но ошибка на пассажире 4: директива '' пассажир_макс_preloader_idle_time 'является дубликатом' – TangMonk

4

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

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

Это может быть объединено с PassengerPreStart

+0

Из документов: «Вы должны установить этот параметр в ненулевое значение, если вы хотите избежать потенциально длительного времени запуска после того, как веб-сайт простаивает для расширенного период «. Кажется, это идеальный ответ на вопрос OP. – Chuck

0

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

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

1

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

Смежные вопросы