#веб_программирование #ruby
Хочу написать минимальное web-приложение на Ruby. Какой HTTP-сервер для этого можно использовать? Сервер должен быть: Простым в установке и использовании. На бессмысленный пердолинг жалко времени. Поддерживать cgi-скрипты Сервер должен быть под линукс Фреймворки не нужны, от сервера мне нужен только запуск скриптов
Ответы
Ответ 1
Если обязателен CGI почему бы не взять любой сервер, поддерживающий CGI? Только приложение вряд ли получится минимальным. Вам придется изрядно поработать и пописать. Если вы хотите минимальное приложение лучше исходить хотя бы с уровня Rack-приложения - это такой гем (библиотека по-рубишному), который позволяет взаимодействовать с ruby web-серверами. Он де факто стандарт в отрасли, все современные сервера ориентируются на него. Если писать на чистом Rack - у вас будут очень компактные по коду и потреблению памяти Web-приложения на чистом Ruby. Тогда с одной стороны вы получите действительно минимальное приложение, не перегруженное сверх-тяжелыми гемами вроде ActiveSupport, которые разом прибавляют по десятку мегабайт к процессу. При условии, конечно, что сами избежите соблазна их использования. С другой стороны вы получаете доступ ко всей современной Web-инфраструктуре Ruby и его Web-серверам. Плюс вы найдете поддержку сообщества, потому что рубистов, работающих в Web за пределами Rack очень и очень не много. Минимальное Rack-приложение Установите гем rack gem install rack Далее создайте файл config.ru class Hello def call(env) [200, {'Content-type' => 'text/plain'}, ['Hello world!']] end end run Hello.new Запустить сервер можно командой rackup В отчете которой будет сообщено, на каком порту и IP-адресе слушает сервер (все конфигурируется уже на уровне конфигурационного файла Web-сервера). Web-cервера Unicorn - классический fork-сервер, создает несколько процессов. Так как работает исключительно с процессами, потребляет довольно много памяти. Чтобы создать дополнительное соединение, вам нужно скопировать (fork-нуть) целый процесс, а процессов нужно много, так как связь блокирующая - одно соединение - один процесс. Если много медленных клиентов - беда, нужно много процессов и много памяти. Клиенты по-долгу держат соединения и для новых клиентов нужно больше новых соединений, т.е. процессов, а в конце-концов и памяти. Thin - сервер на EventMachine, один мастер-процесс в цикле обходит все соединения и проверяет их в неблокирующем режиме. Не боится медленных клиентов, просто не дожидаясь ответа идет опрашивать других, возвращаясь к текущему на следующем цикле. Выгода заключается еще в том, что он не переключает контекст потоков/процессов, экономя ресурсы при высокой частоте обращений со стороны клиентов. Однако, со стороны backend у него такая же классика, как у Unicorn - если ваше приложение задумается (полезет в базу данных или куда-то по сети) весь процесс встанет и сервер подвиснет. В продакшене не видел, но если отдавать какую-нибудь статику, наверное не плохо справится. Puma - комбинированный вариант, EventMachine и несколько веркеров на backend-стороне. Не боится медленных клиентов и медленных ответов с сервера. Это сервера написанные на Ruby. Статику, как правило, стараются отдать быстрым nginx, динамику передают Ruby-серверу, при необходимости тоже кэшируя страницы.Ответ 2
В случае если необходимость в поддержке, например php(например когда на сервере несколько приложений, в том числе использующие php), то возможна связка apache + phusion passenger(необходимо ограничить количество потоков для passenger, т к иначе быстро съест всю память)
Комментариев нет:
Отправить комментарий