Rack-приложение, запущенное на VPS, выглядит довольно уязвимо, поскольку напрямую доступно из интернета, не умеет эффективно обрабатывать злонамеренные или перегруженные запросы и не защищено от простейших атак на уровне HTTP. Более того, в такой конфигурации оно вынуждено самостоятельно обслуживать HTTPS и статику, что увеличивает поверхность атаки и снижает надёжность.
Поэтому для изоляции Rack-приложения от прямого доступа из интернета применяется так называемый обратный прокси, который принимает запросы, проверяет их и передаёт трафик серверу Ruby. Такой подход позволяет скрыть внутренние порты приложения, централизованно управлять сертификатами и политиками безопасности, а также снизить нагрузку на само приложение.
В качестве обратного прокси часто используют специально настроенный веб-сервер Nginx. Он позволяет разгрузить приложение, повысить его производительность, а также обеспечить безопасность и устойчивость работы.
Кроме того, в такой конфигурации необходимо организовать доступ к Rack-приложению по доменному имени, а не по IP-адресу. Это выглядит разумным не только для удобного доступа пользователей, но и для выпуска TLS-сертификатов, например, от Let’s Encrypt, для настройки HTTPS и обеспечения гибкости при переносе сервиса на другой сервер без изменения пользовательских настроек. Настройка доступа к приложению по имени домена осуществляется при помощи привязки этого имени к IP-адресу виртуального сервера. Для такой привязки предназначена специальная DNS-запись – A-запись, настроить которую можно на сайте-регистраторе домена или во вкладке Домены личного кабинета RUVDS.

Настройка доступа к Rack-приложению через обратный прокси
Во-первых, установите в систему веб-сервер Nginx:
$ sudo apt install nginx
Затем создайте конфигурационный файл Nginx. В нём будут задаваться правила обработки запросов для Rack-приложения на Falcon:
$ sudo nano /etc/nginx/sites-available/falcon_app
В файл вставьте следующие строки:
server {
listen 80;
server_name your-site-name.ru;
location / {
proxy_pass http://127.0.0.1:9292;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Обратите внимание, что в файле используется доменное имя your-site-name.ru
. Его необходимо заменить на имя вашего домена.
После чего следующей командой активируйте конфиг виртуального хоста для Falcon-приложения:
$ sudo ln -s /etc/nginx/sites-available/falcon_app /etc/nginx/sites-enabled/
Проверьте корректность синтаксиса Nginx:
$ sudo nginx -t
Вывод команды не должен содержать сообщений об ошибках.

Затем откройте доступ к серверу для протокола HTTP. Чтобы это сделать, в брандмауэр UFW добавьте разрешающее правило для соответствующего профиля:
$ sudo ufw allow http
После чего перезапустите конфигурацию Nginx для применения внесённых изменений:
$ sudo systemctl reload nginx
И наконец, откройте браузер и перейдите на веб-интерфейс Rack-приложения по ссылке вида http://your-site-name.ru
, где вместо your-site-name.ru
укажите имя домена, используемое в вашем случае.

Поскольку TCP-порт 9292 теперь используется исключительно для взаимодействия Rack-приложения с обратным прокси и не должен быть открытым на сервере, можно удалить разрешающее правило для данного порта из брандмауэра UFW:
$ sudo ufw delete allow 9292/tcp
Также учитывая, что Rack-приложение теперь не смотрит напрямую в интернет, а защищено при помощи реверс-прокси, в юнит-файле Falcon необходимо изменить настройку используемых интерфейсов, ограничив их только локальным соединением. Для этого откройте юнит-файл:
$ sudo nano /etc/systemd/system/falcon.service
И вместо http://0.0.0.0:9292
укажите http://127.0.0.1:9292
:
[Unit]
Description=Falcon Rack HTTP Server
After=network.target
[Service]
User=falcon
Group=falcon
WorkingDirectory=/srv/falcon_app
ExecStart=/usr/local/bin/falcon serve --bind http://127.0.0.1:9292
Restart=always
Environment=GEM_HOME=/usr/local/bundle
Environment=PATH=/usr/local/bin:/usr/bin:/bin
[Install]
WantedBy=multi-user.target
После чего закройте файл с сохранением изменений и обновите конфигурацию systemd
:
$ sudo systemctl daemon-reload
Затем перезапустите службу Falcon:
$ sudo systemctl restart falcon
Как настроить доступ к Rack-приложению по HTTPS
Для настройки доступа к Rack-приложению с использованием более защищённого протокола HTTPS обратный прокси Nginx запрашивает и устанавливает на сайт бесплатный TLS-сертификат от компании Let’s Encrypt. Чтобы это сделать, Nginx использует специальный софт – Certbot. Именно Certbot отправляет запрос на выпуск сертификата для домена, подтверждает владение доменом и сохраняет полученный сертификат. Затем вносит изменения в настройки Nginx и запускает сервис, продлевающий сертификаты до истечения срока действия. Другими словами, Certbot берёт на себя всю рутину по организации доступа к сайту по HTTPS без ручной генерации и установки сертификатов.
Следующей командой установите Certbot и плагин для интеграции Certbot с Nginx:
$ sudo apt install certbot python3-certbot-nginx
Поскольку после установки TLS-сертификата доступ к Rack-приложению будет работать через HTTPS, необходимо открыть доступ к серверу для данного протокола. Сделать это можно, добавив разрешающее правило для соответствующего профиля в брандмауэре UFW:
$ sudo ufw allow https
Затем запустите Certbot для запроса TLS-сертификата и установки его на сайт your-site-name.ru
. В следующей команде замените your-site-name.
ru на имя вашего домена:
$ sudo certbot --nginx -d your-site-name.ru
В процессе своей работы Certbot выполняет следующие действия:
- сначала просит указать адрес электронной почты для регистрации аккаунта в Let’s Encrypt;
- затем просит вашего согласия с Абонентским Соглашением Let’s Encrypt;
- просит поделиться email с Electronic Frontier Foundation, некоммерческой организацией и партнёром-основателем проекта Let’s Encrypt;
- далее проверяет владение доменом;
- после успешной проверки получает и сохраняет на сервере сертификат и приватный ключ;
- вносит изменения в настройки Nginx для включения HTTPS и перенаправления трафика с HTTP на HTTPS;
- проверяет корректность синтаксиса Nginx и перезапускает его для применения изменений;
- выполняет настройку автоматического обновления сертификата.

После завершения работы утилиты Certbot откройте браузер и перейдите на https://your-site-name.ru
, где вместо your-site-name.ru
укажите своё доменное имя.

В навигационной строке браузера сообщение вида Подключение защищено
говорит о том, что подключение к веб-интерфейсу Rack-приложения теперь осуществляется по протоколу HTTPS.