Как определить обработчик стойки - PullRequest
5 голосов
/ 28 сентября 2011

Rackup успешно запускает любое приложение Rack через стандартный обработчик Rack.Например:

class RackApp  
  def call(environment)    
  [
    '200', 
    {'Content-Type' => 'text/html'}, 
    ["Hello world"]
  ]
  end 
end
run RackApp.new

Но из-за стоек выдается "NoMethodError at / undefined метод" call "для nil: NilClass", когда в последней строке вместо этого используется встроенный обработчик CGI Rack:

Rack::Handler::CGI.run RackApp.new

То же самое возражает против других встроенных обработчиков Rack.например, Rack :: Handler :: Thin, Rack :: Handler :: FastCGI, даже Rack :: Handler :: WEBrick (который Rack выбирает выше в режиме по умолчанию).

Какой здесь правильный синтаксис?

Ответы [ 2 ]

7 голосов
/ 28 сентября 2011

Команда rackup читает файл конфигурации и запускает сервер.Методы Rack::Handler::XXX.run также запускают сервер независимо от команды rackup (CGI немного отличается, поскольку на самом деле это не сервер).

Что происходиткогда вы изменяете строку

run RackApp.new

на

Rack::Handler::CGI.run RackApp.new

и запускаете rackup следующим образом.Сервер запускается и анализирует файл конфигурации.Когда строка Rack::Handler::CGI.run RackApp.new достигнута, она выполняется так же, как и любой другой код Ruby.В случае обработчика CGI это вызывает приложение и записывает вывод в стандартный вывод, как если бы он выполнялся как скрипт CGI (посмотрите на свой терминал, когда вы запустите rackup).После этого сервер 'rackup' запускается как обычно, но без приложения для запуска.Когда вы пытаетесь получить доступ к странице, вы получаете NoMethodError, поскольку приложение имеет значение nil.

Использование Rack::Handler::Thin аналогично, но в этом случае, поскольку Thin на самом деле является веб-сервером, он запускается ибудет обслуживать RackApp, но прослушивает порт Thin по умолчанию 8080 (не по умолчанию в стойке 9292).После остановки Thin (например, с помощью Ctrl-C) сервер для установки в стойку по умолчанию (Mongrel или Webrick) начнет прослушивать порт 9292, снова без указания приложения, поэтому вы получите NoMethodError.

Если вы запустите измененный'config.ru' в виде простого сценария Ruby, вместо того, чтобы использовать rackup, вы увидите такое же поведение, но без запуска сервера rackup.(Сначала вам потребуется стойка, поэтому используйте ruby -rrack config.ru).В случае CGI вывод одного вызова вашего приложения будет распечатан на консоли, в Thin - случае Thin будет запущен для обслуживания вашего приложения.

Чтобы указать сервер для использования с rackup, выможно использовать опцию -s, например, rackup -s thin запустит приложение с использованием Thin (на этот раз для порта по умолчанию в стойке 9292).Вы также можете сделать rackup -s cgi, но это не будет работать каким-либо полезным способом - он просто выводит html страницы ошибки на консоль.

CGI

Если выПопытка запустить ваше приложение в качестве CGI есть несколько вариантов.Вам необходимо создать скрипт CGI, который вызывает ваше приложение, используя обработчик CGI.Сам по себе это может быть скрипт ruby, который вызывает Rack::Handler::CGI.run напрямую, фактически вы можете использовать ваш измененный config.ru напрямую (вы можете сначала переименовать его и добавить явную строку require 'rack').

В качестве альтернативыВы можете использовать скрипт оболочки, который затем вызывает rackup config.ru.В этой ситуации стойка обнаруживает, что она работает как CGI и автоматически использует правильный обработчик

1 голос
/ 28 сентября 2011
...