Как Phusion Passenger повторно использует потоки и процессы?

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

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

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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