Краткий обзор веб-серверов для приложений Ruby
Приложения, разработанные в Ruby, можно развернуть в общий доступ при помощи одного из множества веб-серверов. Каждый веб-сервер уникален и имеет свои преимущества, однако у всех них есть кое-что общее: они основаны на интерфейсе Rack.
Данная статья предлагает краткий обзор популярных веб-серверов для приложений Ruby, а также ознакомит вас со спецификацией Rack и связующим программным обеспечением.
Примечание: Более подробную информацию о связующем программном обеспечении можно узнать здесь.
Интерфейс Rack
В современном мире разработки веб-приложений возможность комбинировать и подбирать соответствующие веб-серверы и другие программы и технологии крайне необходима. В действительности, это чуть ли не самый востребованный аспект любого языка программирования или фреймворка. Пожалуй, проще всего в качестве примера здесь можно привести среды разработки, тестирования и производства приложения – все они должны быть разными.
Для этого в 2007 вышел Rack, модульный интерфейс веб-серверов Ruby. Сегодня он используется многими веб-серверами и фреймворками (Espresso, Mack, Ruby on Rails, Sinatra и т.п.).
Несмотря на соглашения об именовании и различные объяснения для разных языков программирования и доменов, спецификации для взаимодействия приложений очень похожи (если не идентичны). Хотя в отличие от спецификации Python WSGI, по примеру которой созданы Rack и множество других спецификаций, Rack является ещё и промежуточным программным обеспечением.
Промежуточное программное обеспечение Rack (доступно как gem) реализует спецификацию Rack; оно делит входящие HTTP-запросы на различные этапы, затем обрабатывает их по частям, после чего посылает ответ веб-приложения (контроллера). Программа Rack состоит из двух отдельных компонентов: обработчика и адаптера, с помощью которых происходит обмен данными между веб-серверами и приложениями (фреймворками).
Обзор веб-серверов для Ruby
Теперь можно поговорить о наиболее популярных современных веб-серверах, понять их особенности и подобрать наиболее подходящее решение для своего приложения.
Примечание: Веб-серверы расположены в алфавитном порядке.
Phusion Passenger: быстрый веб-сервер и сервер приложений
Многие разработчики Ruby on Rails рекомендуют использовать для поддержки приложений именно Passenger. Это зрелый и многофункциональный сервер, который отвечает самым строгим требованиям развёртывания и позволяет упростить установку и запуск приложения. Он устраняет традиционную архитектуру на основе сервера-посредника путём прямой интеграции в веб-серверы Apache и Nginx. Поэтому в сообществе Ruby (Rails) он также часто упоминается как mod_rails и mod_rack.
Особенности Passenger
Passenger предоставляет возможность работать с несколькими приложениями, размещёнными на одном сервере.
Также он поддерживает обработку медленных клиентов. Passenger помещает все запросы и ответы в буфер, что позволяет предотвратить атаки, засоряющие ресурсы системы.
Веб-сервер Passenger очень популярен и часто используется в среде производства. Кроме того, он имеет активное сообщество, в котором можно получить много полезных советов и подсказок. Компания, занимающаяся разработкой Passenger, предлагает коммерческую поддержку.
Версия Passenger с открытым исходным кодом предоставляет мультипроцессный однопоточный режим, а коммерческая версия поддерживает однопоточный и многопоточный режимы.
Также коммерческая версия предоставляет множество «продвинутых» функций: параллелизм, многопоточность, массовое развертывание, управление ресурсами, ограничение ресурсов и др.
Примечание: Больше информации о Passenger можно найти на сайте проекта. О версии Passenger Enterprise – здесь.
Puma: современный веб-сервер для Ruby
Puma – это высокопроизводительный веб-сервер для приложений Ruby. Он основан на веб-сервере Mongrel, который в своё время добавил несколько революционных функций и во многом повлиял на разработку приложений Ruby. Разработчик Puma (Evan Phoenix) трансформировал операционную структуру Mongrel, перейдя на Rack (и, таким образом, устраняя некоторые проблемы с производительностью), и разработал приложение для поддержки параллелизма.
Особенности Puma
Puma не требует много места и использует мало ресурсов.
Веб-сервер Puma предоставляет несколько режимов работы: он позволяет задать минимальное и максимальное количество потоков, а также поддерживает кластерный режим, в котором вы можете использовать разветвлённые процессы для одновременной обработки запросов.
Он основан на парсере Mongrel и во многом унаследовал его код.
Веб-сервер Puma разработан для Rubinius, но может работать и с JRuby
Он предоставляет простой, но довольно обширный и гибкий набор конфигураций, что позволяет легко подготовить веб-сервер как к разработке, так и к окружению.
«Из коробки» Puma не поддерживает размещения и производства нескольких приложений, но это можно сделать с помощью специального инструмента Jungle.
Примечание: Подробную информацию о Puma можно найти в официальном репозитории кода.
Thin: простой и быстрый HTTP-сервер
Thin – это очень популярный сервер приложений; его создатели утверждают, что это наиболее «безопасный, стабильный, быстрый и расширяемый веб-сервер Ruby». Thin активно развивается. Он основан на трех основных библиотеках Ruby:
- Парсер Mongrel.
- Сетевая библиотека EventMachine
- Промежуточное программное обеспечение Rack
Особенности Thin
HTTP-сервер Thin предназначен для работы с любым фреймворком, который реализует спецификацию Rack. Для этого он загружает конфигурационные файлы Rack.
Будучи основанным на EventMachine,Thin может обрабатывать длинные запросы без помощи обратного прокси-сервера (в отличие от некоторых других веб-серверов).
Примечание: Чтобы узнать о Thin больше, перейдите на сайт проекта.
Unicorn: HTTP-сервер на основе Rack для быстрых клиентов и Unix
Unicorn – это зрелый полнофункциональный сервер приложений для Ruby. Позже он был адаптирован для работы с Python. Принцип работы Unicorn таков: веб-сервер выполняет не все задачи, а только те, за которые отвечает непосредственно он, остальные задачи он передаёт другим программам, которые лучше справляются с их выполнением.
Особенности Unicorn
Главный процесс Unicorn порождает рабочие процессы для обработки запросов согласно заданным параметрам. Также этот процесс отслеживает рабочие процессы, чтобы предотвратить проблемы с ресурсами. То есть, если процесс требует много времени или ресурсов, сервер остановит его Unicorn.
Как уже упоминалось выше, Unicorn использует операционную систему для балансировки нагрузки; для этого он может передавать задачи другим сервисам. Благодаря этому запросы не скапливаются.
Как и NGINX, Unicorn позволяет развертывать приложения, не сбрасывая текущих подключений клиентов. Это очень полезная функция при обновлении приложения.
Другие полезные функции Unicorn:
- Все рабочие процессы запускаются в пределах определенного изолированного адресного пространства и обслуживают запросы по одному.
- Хуки before_fork и after_fork позволяют бороться с ветвлением процессов.
- Механизм копирования при записи для управления памятью позволяет экономить память.
- Веб-сервер может прослушивать несколько интерфейсов.
Примечание: Больше о Unicorn – здесь.
Tags: Phusion Passenger, Puma, Rack, Ruby, Thin, Unicorn