MAATRIX / Блог / VPS для Ruby on Rails: puma и nginx

VPS для Ruby on Rails: puma и nginx

Блог MAATRIX · 2026-07-07

Rails на production — это связка puma как сервера приложений и nginx как reverse proxy. Разберём установку Ruby через rbenv, запуск puma под systemd через unix-сокет и настройку nginx.

Архитектура деплоя Rails

['Классическая схема production-деплоя Rails состоит из двух слоёв. Puma — многопоточный сервер приложений, который держит Ruby-процессы. nginx стоит перед ним, отдаёт статику, терминирует TLS и балансирует нагрузку.', 'Связь между ними удобнее делать через unix-сокет, а не TCP-порт: это быстрее и не занимает сетевой порт. nginx обращается к сокету, puma слушает его.', '
  • puma — сервер приложений, потоки и воркеры.
  • nginx — статика, TLS, проксирование.
  • unix-сокет — быстрая связь между ними.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для Rails

Установка Ruby через rbenv

['Системный Ruby часто устаревший, поэтому ставим нужную версию через rbenv. Понадобятся зависимости для сборки нативных гемов.', '
sudo apt update\nsudo apt install -y git curl libssl-dev libreadline-dev zlib1g-dev build-essential libyaml-dev nginx nodejs\ngit clone https://github.com/rbenv/rbenv.git ~/.rbenv\ngit clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build\necho \'export PATH="$HOME/.rbenv/bin:$PATH"\' >> ~/.bashrc\necho \'eval "$(rbenv init -)"\' >> ~/.bashrc\nsource ~/.bashrc\nrbenv install 3.3.4\nrbenv global 3.3.4
']

Подготовка приложения

['Клонируем код, ставим гемы в production-режиме, компилируем ассеты и мигрируем БД.', "
cd /opt/railsapp\nbundle config set --local without 'development test'\nbundle install\nRAILS_ENV=production bundle exec rails assets:precompile\nRAILS_ENV=production bundle exec rails db:migrate
", 'Секретный ключ и переменные окружения задаём через RAILS_MASTER_KEY или .env, не коммитя их в репозиторий. Для базы данных в production используйте PostgreSQL, а строку подключения передавайте переменной DATABASE_URL — так конфигурация остаётся вне кода.', '
RAILS_ENV=production DATABASE_URL=postgres://user:pass@localhost/app_prod \\\n  bundle exec rails db:migrate
']

puma под systemd

['Puma запускаем как systemd-сервис, слушающий unix-сокет. В config/puma.rb укажите bind на сокет.', '
# config/puma.rb\nbind "unix:///opt/railsapp/tmp/sockets/puma.sock"\nworkers 2\nthreads 5, 5\nenvironment "production"
', '
[Unit]\nDescription=Puma for Rails\nAfter=network.target\n\n[Service]\nUser=deploy\nWorkingDirectory=/opt/railsapp\nExecStart=/home/deploy/.rbenv/shims/bundle exec puma -C config/puma.rb\nRestart=always\nEnvironment=RAILS_ENV=production\n\n[Install]\nWantedBy=multi-user.target
', '
sudo systemctl daemon-reload\nsudo systemctl enable --now puma\njournalctl -u puma -f
', 'Для фоновых задач Rails обычно поднимают отдельный процесс — Sidekiq или GoodJob — как самостоятельный systemd-сервис. Он живёт рядом с puma, читает ту же очередь и перезапускается независимо, что удобно при деплое.']

nginx перед puma

['nginx проксирует запросы в сокет puma и сам отдаёт скомпилированные ассеты из public — это разгружает Ruby.', '
upstream puma {\n    server unix:///opt/railsapp/tmp/sockets/puma.sock;\n}\nserver {\n    listen 80;\n    server_name example.com;\n    root /opt/railsapp/public;\n    location / {\n        try_files $uri @puma;\n    }\n    location @puma {\n        proxy_pass http://puma;\n        proxy_set_header Host $host;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}
', '
sudo nginx -t && sudo systemctl reload nginx\nsudo certbot --nginx -d example.com
']

Ресурсы и типичные ошибки

['Каждый воркер puma держит копию приложения в памяти, поэтому Rails заметно требователен к RAM — планируйте от 2 ГБ. Сборка нативных гемов и precompile ассетов упираются в CPU и диск: AMD EPYC + NVMe у MAATRIX ускоряют деплой, а ежедневные бэкапы страхуют БД. Локации UK/США и оплата из России (карта РФ, СБП, крипта, MAAT) закрывают вопрос зарубежного сервера.', '
  • Забыли precompile — стили и скрипты не грузятся в production.
  • Нет RAILS_MASTER_KEY — приложение не расшифрует credentials и упадёт при старте.
  • Слишком много воркеров — нехватка RAM и OOM.
']

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.

Арендовать VPS для Rails

Частые вопросы

Сколько воркеров puma ставить?

Ориентируйтесь на число ядер, но учитывайте RAM: каждый воркер держит копию приложения. На 2 ГБ обычно 2 воркера по несколько потоков.

Зачем unix-сокет вместо порта?

Сокет быстрее TCP на одной машине и не занимает сетевой порт. Для связи nginx и puma на одном сервере это оптимально.

Как деплоить обновления Rails?

Стяните код, выполните bundle install, assets:precompile, db:migrate и перезапустите puma. Инструменты вроде Capistrano автоматизируют это с zero-downtime.