Почему до сих пор нет жизнеспособного mod_ruby для Apache?

StackOverflow https://stackoverflow.com/questions/75001

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

class HelloWorld
  def call(env)
    [200, {"Content-Type" => "text/plain"}, ["Hello world!"]]
  end
end

Есть один: mod_ruby, но он не обслуживался около 2 лет.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top