Почему еще нет жизнеспособного mod_ruby для Apache? - PullRequest
12 голосов
/ 16 сентября 2008

Как бы ни были популярны Ruby и Rails, похоже, что эта проблема уже решена. JRuby и mod_rails все в порядке, но почему не существует мода Apache для простого Ruby?

Ответы [ 5 ]

23 голосов
/ 16 сентября 2008

Существует Phusion Passenger , надежный модуль Apache, который может запускать Rack приложений с минимальной конфигурацией. Это становится привлекательным для разделяемых хостов, и превращение любой программы в приложение Rack до смешного просто:

Приложение Rack представляет собой объект Ruby (не класс), который отвечает на call. Это занимает ровно один аргумент , окружающая среда и возвращает массив ровно три значения : статус, заголовки и тело.

18 голосов
/ 21 сентября 2008

Основная проблема заключается в следующем: долгое время MRI была единственной выполнимой реализацией Ruby. У MRI есть ряд проблем, которые затрудняют встраивание его в другое приложение (что в основном делает mod_ruby : он встраивает MRI в Apache), особенно многопоточное (которым является Apache). Он не особо ориентирован на многопоточность и имеет глобальное состояние.

Это глобальное состояние означает, например, что если одно приложение Rails изменяет некоторый класс, то все другие приложения Rails, работающие на том же сервере Apache, также увидят этот измененный класс.

Другая проблема заключается в том, что исходный код МРТ нелегко взломать. МРТ уже более 15 лет, и она начинает показывать.

В результате этих проблем mod_ruby никогда действительно не работал должным образом, и в какой-то момент сопровождающие просто сдались.

Интерпретатор PHP на основе C, с другой стороны, был разработан с самого первого дня для запуска в Apache как mod_php. Действительно, для первых двух версий не было даже версии интерпретатора для командной строки, mod_php был only способ запуска PHP.

Phusion Passenger (он же mod_rack, он же mod_rails) решает эту проблему, по сути отказываясь от этой проблемы: они просто запускают отдельную копию MRI в отдельном процессе для каждого приложения. Это прекрасно работает, и не только для Ruby. Он поддерживает WSGI (стандартный интерфейс для Python Web Frameworks), Rack (стандартный интерфейс для Ruby Web Framework) и прямую поддержку Ruby on Rails.

Я надеюсь на mod_rubinius , который, к сожалению, еще не существует. Rubinius изначально разрабатывался как поточно-ориентированный, встраиваемый, без глобального состояния, без использования стека C и т. Д. Он был разработан, чтобы иметь возможность запускать несколько виртуальных машин Rubinius в одном процессе Rubinius. Это делает mod_rubinius бесконечно проще в реализации и обслуживании, чем mod_ruby. К сожалению, конечно, Rubinius еще не выпущен, и настоящая работа над mod_rubinius не может даже начаться, пока не будет выпущен Rubinius. Хорошая новость заключается в том, что у mod_rubinius уже есть больше рабочей силы, чем у mod_ruby, потому что он заплатил разработчикам, работающим над ним с хостинговой компанией Rails, которая отчаянно хочет использовать ее самостоятельно.

5 голосов
/ 16 сентября 2008

Возможно, стоит дважды пояснить мысль Мислава о том, что mod_rails вообще не ограничивается кодом Rails. Новое имя, mod_rack, намного лучше. Тривиально небольшие приложения могут быть стоечными, например:

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end
4 голосов
/ 16 сентября 2008

Существует один: mod_ruby , но он не поддерживается примерно через 2 года.

0 голосов
/ 16 сентября 2008

Существует mod_rails , и он может запускать Rack приложений, что еще вам может понадобиться?

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