Медленный начальный запуск сервера при использовании Phusion Passenger и Rails - PullRequest
87 голосов
/ 12 мая 2009

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

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

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

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

Ответы [ 7 ]

118 голосов
/ 12 мая 2009

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

40 голосов
/ 24 февраля 2010

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

НТН!

РЕДАКТИРОВАТЬ rails_spawn_method устарела в пассажире 3 вместо этого используйте

passenger_spawn_method smart; 

все остальное просто хорошо до даты.

4 голосов
/ 16 февраля 2011

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

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

Это можно комбинировать с PassengerPreStart

2 голосов
/ 13 мая 2009

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

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

1 голос
/ 13 марта 2012

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

1 голос
/ 13 мая 2009

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

0 голосов
/ 15 декабря 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...