Как Phusion Passenger повторно использует потоки и процессы? - PullRequest
10 голосов
/ 05 мая 2009

Я настраиваю веб-сервер Apache2, на котором запущено несколько веб-приложений Ruby on Rails с Phusion Passenger. Я знаю, что Passenger создает процессы Ruby для обработки запросов. У меня есть следующие вопросы:

  • Если одновременно обрабатывать более одного запроса, будет ли Passenger порождать несколько процессов или несколько потоков (Ruby)? Как мне настроить его так, чтобы он всегда вызывал однопоточные процессы?
  • Если у меня есть два приложения на Rails, представьте, что запрос для приложения A переходит к процессу 1, а затем приходит запрос для приложения B. Возможно ли, что процесс 1 также обработает этот запрос? Когда и как это возможно? Другими словами, разрешено ли одному процессу обрабатывать запросы для нескольких приложений Rails?
  • У меня одно и то же приложение Rails, экспортированное по нескольким URL-адресам и нескольким виртуальным хостам (например, http: // и https://).. Будет ли один и тот же процесс обслуживать разные виртуальные хосты? (Ответ на этот вопрос, похоже, да, Я установил глобальную переменную при ответе на запрос к виртуальному хосту A, и мне удалось получить значение в виртуальном хосте B.)

Ответы [ 2 ]

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

Вообще говоря, Passenger порождает новые процессы путем разветвления ApplicationSpawner, в котором предварительно загружена в память инфраструктура и код приложения, или FrameworkSpawner, в котором только есть код платформы.

Пассажир, насколько я знаю, не занимается потоками. Вместо этого, по мере увеличения нагрузки на приложение, оно будет разветвлять ApplicationSpawner этого приложения и инициализировать другой экземпляр. Когда нагрузка уменьшается, один или несколько экземпляров приложения уничтожаются.

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

Итак, чтобы ответить на ваши вопросы:

  • Он будет обслуживать их последовательно, а затем запускать дополнительные процессы, если решит, что нагрузка достаточно высока.

  • Нет. Один процесс может принадлежать только одному Rails-приложению.

  • Я немного отрывочен, но ваш эксперимент имеет смысл. Пассажир должен быть достаточно умен, чтобы понять, что, несмотря на то, что он работает из разных мест в конфигурации сервера, вы говорите об одном и том же приложении. Вероятно, он основан на пути к файловой системе приложения.

РЕДАКТИРОВАТЬ: Я пошел и прочитал об этом немного. Оказывается, я был в основном прав, но технические детали были немного не в порядке. См. Пассажирская документация

6 голосов
/ 22 мая 2009

Да, Берк прав. В случае третьего вопроса Phusion Passenger распознает приложения по их корневому пути. Поэтому, даже если у вас есть два виртуальных хоста, если они оба указывают на один и тот же DocumentRoot, Phusion Passenger будет считать, что это одно и то же приложение.

...