Поиск по сайту:

Как развернуть приложения Rails с помощью Unicorn и Nginx на CentOS 6.5


Статус: устарело

В этой статье рассматривается версия CentOS, которая больше не поддерживается. Если вы в настоящее время используете сервер под управлением CentOS 6, мы настоятельно рекомендуем обновить или перейти на поддерживаемую версию CentOS.

Причина:

Смотрите вместо этого:

Введение

Серверы приложений, разработанные с учетом простоты, могут за считанные минуты привести вас в рабочее состояние при развертывании веб-приложения на основе Rails. Однако, если вы хотите иметь больший контроль над настройкой своего сервера или хотите попробовать что-то новое, более гибкое, использование многоуровневого набора компонентов может помочь вам в достижении ваших целей — будь то развертывание в будущем или необходимость внедрения сторонних элементов, таких как серверы кэширования.

В этой статье DigitalOcean мы рассмотрим сборку установки многоуровневого развертывания для размещения веб-приложений Ruby на основе Rails. Для этого мы будем использовать очень мощный, гибкий и чрезвычайно успешный сервер приложений Unicorn, работающий на основе Nginx. Хотя мы будем строить эту структуру на одном сервере в демонстрационных целях, вы можете легко использовать несколько дроплетов для распространения и легкого масштабирования — как по горизонтали, так и по вертикали!

Глоссарий

1. Развертывание веб-приложений, серверы и их роли

  1. Сервер приложений Unicorn
  2. HTTP-сервер Nginx, работающий как внешний обратный прокси-сервер

2. Подготовка сервера развертывания

  1. Обновление и подготовка операционной системы
  2. Настройка Ruby Environment и Rails
  3. Установка Nginx
  4. Установка единорога

3. Подготовка приложений Rails к развертыванию

  1. Создание примера приложения
  2. Загрузка исходного кода

4. Настройка серверов

  1. Единорог
  2. Nginx
  3. Управление серверами

5. Дополнительная литература

Развертывание веб-приложений, серверы и их роли

Когда дело доходит до развертывания веб-приложений, обычно задействовано множество приложений, настроенных на уровни и работающих друг с другом. Этот тип реальной настройки развертывания сильно отличается от использования отдельного сервера разработки, который предназначен для использования только в целях тестирования, поскольку они не могут работать под нагрузкой реального трафика веб-сайта из-за отсутствия функциональности и возможностей.

Говоря о функциях, следует отметить, что существует несколько популярных серверов на выбор, каждый из которых предлагает разные функциональные возможности: некоторые ориентированы на простоту, некоторые на скорость, а некоторые всего понемногу с возможностью настройки параметров для удовлетворения сложных производственных потребностей.

В этой статье мы выбрали сервер приложений Unicorn. Unicorn — замечательный сервер приложений, который содержит ваше приложение Rails для обработки входящих запросов, предпочтительно после их фильтрации и отправки внешним HTTP-сервером, таким как Nginx.

HTTP-сервер Nginx, с другой стороны, разработан с нуля, чтобы действовать как многоцелевой веб-сервер. Он способен очень хорошо обслуживать статические файлы (например, изображения, текстовые файлы и т. д.), балансировать соединения и справляться с некоторыми попытками эксплойтов. Он выступает в качестве первой точки входа для всех запросов и передает их в Unicorn для обработки веб-приложением и возврата ответа.

Примечание. Чтобы узнать о различных серверах веб-приложений Ruby и понять, что такое «стойка», ознакомьтесь с нашей статьей Сравнение (стойочных) веб-серверов для веб-приложений Ruby.

Сервер приложений Единорог

Unicorn — очень зрелый сервер веб-приложений для веб-приложений на основе Ruby/Rack. Он полнофункциональный, но по замыслу не пытается делать все. Принципал Unicorn делает то, что должен делать сервер веб-приложений, и делегирует остальные обязанности.

Процесс master Unicorn порождает воркеров в соответствии с вашими требованиями для обслуживания запросов. Этот процесс также отслеживает рабочие процессы, чтобы предотвратить проблемы с памятью и процессами. Для системных администраторов это означает, что процесс будет уничтожен, если, например, выполнение задачи занимает слишком много времени или возникают проблемы с памятью.

Как упоминалось выше, одной из областей, в которой Unicorn делегирует задачи, является использование операционной системы для балансировки нагрузки. Это позволяет запросам не накапливаться против созданных занятых рабочих.

HTTP-сервер Nginx, работающий как внешний обратный прокси-сервер

Nginx — это очень высокопроизводительный веб-сервер/(обратный)-прокси. Он достиг своей популярности благодаря небольшому весу, относительной простоте работы и легкости расширения (с надстройками/плагинами). Благодаря своей архитектуре он способен обрабатывать множество запросов (практически неограниченных), с которыми, в зависимости от загрузки вашего приложения или веб-сайта, может быть очень сложно справиться, используя некоторые другие, более старые альтернативы.

Помните: \обработка соединений технически означает не сбрасывать их и иметь возможность обслуживать их чем-то. Вам по-прежнему нужно, чтобы ваше приложение и база данных работали хорошо, чтобы Nginx обслуживал клиенты ответы, которые не являются сообщениями об ошибках.

Чтобы узнать больше о Nginx, вы можете посетить его официальный сайт, расположенный по адресу nginx.com.

Подготовка сервера развертывания

В этом разделе мы собираемся выполнить следующие шаги:

  • Обновите операционную систему
  • Получите необходимые базовые инструменты для развертывания
  • Установите Ruby, Rails и библиотеки
  • Установите приложение (например, Unicorn) и HTTP-сервер (Nginx)

Обновление и подготовка операционной системы

Чтобы установить Ruby и другое необходимое приложение (например, наши серверы), нам нужно сначала подготовить минимально поставляемый дроплет CentOS и оснастить его некоторыми инструментами разработки, необходимыми на этом пути.

Выполните следующую команду, чтобы обновить инструменты по умолчанию вашего CentOS VPS:

yum -y update

# This command will update all the base applications
# that come with CentOS by default. Which are mostly
# reserved for use by the operating system. 

Установите пакет, содержащий средства разработки, выполнив следующую команду:

yum groupinstall -y 'development tools'

# With more recent versions of CentOS, such as 6.5 in our case,
# you can simply run:
# yum groupinstall -y development
# instead.

# This bundle of applications contains various tools
# Such as: gcc, make, automake, binutils, git etc.

Некоторые из пакетов, которые нам нужны для этого руководства (например, libyaml-devel, nginx и т. д.), нет в официальном репозитории CentOS. Чтобы упростить задачу и не заниматься их установкой вручную, мы добавим репозиторий программного обеспечения EPEL для использования менеджером пакетов YUM.

# Enable EPEL Repository
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

# Update everything, once more.
yum -y update

Наконец, нам нужно получить curl-devel и несколько других инструментов и библиотек для этого руководства (например, для Rails требуется sqlite-devel).

Для их установки выполните следующее:

yum install -y curl-devel nano sqlite-devel libyaml-devel

Настройка Ruby Environment и Rails

Примечание. Этот раздел является кратким изложением нашей специальной статьи «Как установить Ruby 2.1.0 в CentOS 6.5».

Мы собираемся использовать Ruby Version Manager (RVM) для загрузки и установки интерпретатора Ruby.

Выполните следующие две команды, чтобы установить RVM и создать системную среду для Ruby:

gpg --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
\curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh

Наконец, чтобы завершить установку Ruby в нашей системе, давайте заставим RVM загрузить и установить Ruby версии 2.1.0:

rvm reload
rvm install 2.1.0

Поскольку для работы Rails в первую очередь требуется интерпретатор JavaScript, нам также потребуется настроить Node.js. Для этой цели мы будем использовать стандартный системный менеджер пакетов YUM.

Выполните следующее, чтобы загрузить и установить nodejs с помощью yum:

yum install -y nodejs

Выполните следующую команду, чтобы загрузить и установить rails с помощью gem:

gem install bundler rails

Установка Nginx

Поскольку у нас включен репозиторий EPEL, можно получить Nginx с помощью yum.

Выполните следующее, чтобы загрузить и установить Nginx с помощью yum:

yum install -y nginx

Примечание. Мы будем настраивать этот инструмент в следующих разделах.

Установка Единорога

Есть несколько способов легко загрузить Unicorn. Поскольку это зависимость, связанная с приложением, наиболее логичным способом является использование RubyGems.

Выполните следующее, чтобы загрузить и установить Unicorn с помощью gem:

gem install unicorn

Примечание. В следующих разделах мы увидим, как работать с этим инструментом.

Подготовка приложений Rails к развертыванию

Примечание. В этом разделе в качестве примера мы будем работать с очень простым приложением Ruby On Rails. Для фактического развертывания вашего приложения вы должны загрузить свою кодовую базу и убедиться, что все ее зависимости установлены (например, bundle).

Создание примера приложения

Давайте начнем с создания очень простого приложения Rails в нашем домашнем каталоге для работы с Unicorn.

Выполните следующую команду, чтобы заставить Rails создать новое приложение с именем \my_app:

# Create a sample Rails application
cd  /var
mkdir www
cd www
rails new my_app

# Enter the application directory
cd my_app

# Create a sample resource
rails generate scaffold Task title:string note:text

# Create a sample database
RAILS_ENV=development rake db:migrate
RAILS_ENV=production  rake db:migrate

# Create a directory to hold the PID files
mkdir pids    

Чтобы убедиться, что ваше приложение настроено правильно и все работает нормально, войдите в каталог приложения и запустите простой сервер с rails s:

# Enter the application directory
cd /var/www/my_app

# Run a simple server
rails s

# You should now be able to access it by
# visiting: http://[your droplet's IP]:3000/tasks

# In order to terminate the server process,
# Press CTRL+C

Загрузка исходного кода

Для фактического развертывания вы, конечно же, захотите загрузить свою кодовую базу на сервер. Для этой цели вы можете использовать SFTP или графический инструмент, такой как FileZilla, для безопасной передачи удаленных файлов и управления ими. Точно так же вы можете использовать Git и центральный репозиторий, такой как Github, для загрузки и настройки вашего кода.

  • Чтобы узнать о работе с SFTP, ознакомьтесь со статьей How To Use SFTP.
  • Чтобы узнать о FileZilla, ознакомьтесь со статьей на тему: Как использовать FileZilla.

Настройка серверов

Единорог

Unicorn можно настроить несколькими способами. В этом руководстве, сосредоточив внимание на ключевых элементах, мы создадим файл с нуля, который будет использоваться Unicorn при запуске процесса демона сервера приложений.

Откройте пустой документ unicorn.rb, который будет сохранен в каталоге config/:

nano config/unicorn.rb

Поместите приведенный ниже блок кода, изменив его при необходимости:

# Set the working application directory
# working_directory "/path/to/your/app"
working_directory "/var/www/my_app"

# Unicorn PID file location
# pid "/path/to/pids/unicorn.pid"
pid "/var/www/my_app/pids/unicorn.pid"

# Path to logs
# stderr_path "/path/to/log/unicorn.log"
# stdout_path "/path/to/log/unicorn.log"
stderr_path "/var/www/my_app/log/unicorn.log"
stdout_path "/var/www/my_app/log/unicorn.log"

# Unicorn socket
listen "/tmp/unicorn.[app name].sock"
listen "/tmp/unicorn.myapp.sock"

# Number of processes
# worker_processes 4
worker_processes 2

# Time-out
timeout 30

Сохраните и выйдите, нажав CTRL+X и подтвердив с помощью Y.

Примечание. Чтобы просто протестировать свое приложение с помощью Unicorn, вы можете запустить unicorn_rails внутри каталога приложения.

Nginx

Далее нам нужно сообщить Nginx, как общаться с Unicorn. Для этого на этом уровне достаточно отредактировать файл конфигурации по умолчанию: default.conf и оставить nginx.conf без изменений, который уже настроен на включение файла по умолчанию. конфигурации.

nano /etc/nginx/conf.d/default.conf

Замените содержимое файлов приведенными ниже, снова изменив необходимые биты в соответствии с вашими потребностями:

upstream app {
    # Path to Unicorn SOCK file, as defined previously
    server unix:/tmp/unicorn.myapp.sock fail_timeout=0;
}

server {


    listen 80;
    server_name localhost;

    # Application root, as defined previously
    root /root/my_app/public;
    
    try_files $uri/index.html $uri @app;
    
    location @app {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app;
    }
    
    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}  

Сохраните и выйдите, нажав CTRL+X и подтвердив Y.

Примечание. Чтобы узнать больше о Nginx, см. статью Как настроить веб-сервер Nginx на VPS.

Управление серверами

После того, как мы завершим настройку обоих серверов, пора выходить в сеть!

Давайте запустим Unicorn и запустим его как демон, используя файл конфигурации:

# Make sure that you are inside the application directory
# i.e. /my_app
unicorn_rails -c config/unicorn.rb -D

# You can set the environment by chaining -E flag
# i.e. unicorn_rails .. .. .. -E [env. name]

Далее мы готовы перезагрузить и перезапустить Nginx:

service nginx restart

Вот и все! Теперь вы можете проверить свое развертывание, перейдя по IP-адресу вашего дроплета (или связанному с ним доменному имени).

http://[Your droplet's IP addr]/tasks

# Listing tasks

# Title    Note	

# New Task

Дальнейшее чтение

Брандмауэр:

Настройка брандмауэра с помощью IP-таблиц

Защита SSH:

Как защитить SSH с помощью fail2ban в Ubuntu

Создание оповещений:

Как отправлять оповещения по электронной почте на CentOS VPS для мониторинга системы

Ежедневный мониторинг и просмотр журналов доступа к серверу:

Как установить и использовать Logwatch Log Analyzer и Reporter

Оптимизация Unicorn Workers:

Как оптимизировать Unicorn Workers в приложении Ruby on Rails

Прислано: