Страницы

Поиск по вопросам

вторник, 23 апреля 2019 г.

Развертывание Rails приложения на хостинге

Как развернуть Rails приложение на VPS сервере? Нужно ли что-то дополнительно устанавливать на сервере, кроме самого Rails?
Что было сделано:
Установлен Rails на VPS Загружено на сервер нужное rails приложение После чего через консоль запустил само приложение cd appname , rails s
Как получить к нему доступ из вне? То есть через URL или IP адрес в браузере?


Ответ

В последних версиях Rails, где-то около 4.0 и выше — никак, потому что вебсервер вешается по умолчанию на localhost:3000 и принимает соединения только через "локальную петлю", от самого себя к самому себе. Для нужд разработки этого достаточно, да и в production-средах в большинстве случаев тоже (из-за балансировщика нагрузки; но тоже не всегда).
Надеюсь, вы уже заменили Webrick на что-то более серьёзное. Webrick написан на чистом Ruby и работает одним процессом в один поток. Он даже одного пользователя будет выдерживать с трудом.
Как правило, сервер приложения, запускаемый таким образом, не приспособлен для работы "лицом в интернет" (неэффективен, мало возможностей настройки), поэтому его разворачивают за прозрачным прокси (обычно nginx), который принимает соединения напрямую и обслуживает самостоятельно запросы на статические файлы, а остальное перенаправляет к серверу приложения
Тема достаточно обширная и гайдов на просторах интернета очень много, очень разного качества, и я не рискну писать ещё один здесь. Я изложу общий план действий, а их конкретную реализацию можно придумать и самостоятельно:
Заставить сервер приложения слушать сетевой адрес/порт, доступный локально (или адрес/порт с ограниченным доступом, или вовсе Unix domain socket) Поставить перед сервером приложения балансировщик нагпузки/прозрачный прокси и организовать раздачу статики (что сервер приложения обычно делает неэффективно)
Например, поставить nginx и сделать ему try_files на статику и proxy_pass на локальную точку, которую слушает сервер приложения Обеспечить выживание: воспользоваться любым решением, которое будет автоматически запускать приложение при запуске машины (чтобы после перезагрузки приложение запускалось без лишних движений), а также перезапускало его в случае падения.

Но это очень примитивный сценарий, который не для всех приложений подойдёт. Есть целый род деятельности по планированию и реализации инфраструктуры. Я совершенно никак не затронул:
Отслеживание признаков жизни сервера Сбор ошибок и уведомление о них разработчиков Резервные копии Процесс автоматического разворачивания
...а это всё весьма нужные вещи.

Есть также более весёлые варианты вроде сборки Docker-образа из приложения и запуск его в виде отдельного контейнера. Но итоговая система будет приблизительно такой же. Есть определённая свобода вроде "делать ли nginx отдельным контейнером".

Комментариев нет:

Отправить комментарий