2009-05-04 4 views
11

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

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

ответ

12

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

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

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

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

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

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

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

EDIT: Я немного поучаствовал и прочитал. Оказывается, я был в основном прав, но технические детали были немного прочь. См. Passenger documentation

+0

Платная версия Пассажира теперь имеет возможность создавать потоки и процессы. – Kris

6

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