Команда 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 и автоматически использует правильный обработчик