Масштабирование приложения Ruby on Rails

Published by Leave your thoughts

Итак, ваши старания были оценены по  достоинству, и теперь приложение получает высокий трафик. Но с другой стороны, иногда из-за слишком высокой нагрузки случаются сбои в работе приложения. Значит, пришло время масштабировать приложение, другими словами, распределить его задачи между несколькими серверами.

Данное руководство поможет выполнить горизонтальное масштабирование приложения Ruby on Rails, основанное на Unicorn и балансировщике нагрузки Nginx.

Примечание: Данное руководство охватывает только инструкции по масштабированию. Если вы хотите добавить БД для приложения, читайте следующее руководство данной серии.

Развёртывание приложений технически состоит из запуска разных задач и процессов на разных уровнях. Чтобы подготовить архитектуру к масштабированию, разделите структуру на два элемента:

  • Серверы приложений (Unicorn/Rails).
  • HTTP-серверы и балансировщики нагрузки (Nginx).

Примечание: в руководстве используется операционная система CentOS.

 Сервер приложений Unicorn

Unicorn – это зрелый полноценный сервер приложений Rails для обработки входящих запросов. Он фильтрует и обрабатывает запросы для сервера Nginx.

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

Nginx: HTTP-сервер, обратный прокси, балансировщик нагрузки

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

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

Процесс подготовки системы к развёртыванию приложения состоит из следующих этапов:

  • Обновление операционной системы.
  • Загрузка необходимых для развертывания инструментов.
  • Установка Ruby, Rails и основных библиотек.
  • Установка сервера приложений Unicorn и HTTP- сервера Nginx.
  • Настройка балансировки нагрузки Nginx.

 Итоговая архитектура

Ниже приведено изображение архитектуры приложения, что получится в результате:

Client Request ----> Nginx (Reverse-Proxy / Load-Balancer)
. |
. /|\
. | | `-> App. Server I.   10.128.xxx.yy1:8080 # Our example
. |  `--> App. Server II.  10.128.xxx.yy2:8080
. `----> ..

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

Для начала нужно подготовить серверы и ОС к запуску Unicorn и Nginx, к установке Ruby и других необходимых приложений.

Чтобы обновить систему CentOS, введите:

yum -y update

Установите связку приложений для разработки:

yum groupinstall -y 'development tools'

К сожалению, не все инструменты можно найти в официальном репозитории системы (например, там отсутствуют libyaml-devel, nginx и многое другое). Их можно загрузить из репозитория EPEL. Добавьте этот репозиторий:

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

Обновите пакеты системы:

yum -y update

Установите curl-devel и другие необходимые инструменты:

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

Настройка сервера приложений

Теперь нужно подготовить серверы к запуску сервера приложений Rails или Unicorn.

Сначала нужно настроить окружение Ruby and Rails.

Окружение Ruby

Примечание: Подробные инструкции по этой теме можно найти в руководстве Установка Ruby 2.1.0 на CentOS 6.5 с помощью RVM.

Инструкции предыдущего и этого раздела нужно выполнить на всех серверах приложений. Для развёртывания нужен минимум один сервер. Чтобы настроить балансировку нагрузки, добавьте больше серверов и настройте их согласно данному руководству.

Для загрузки и установки интерпретатора Ruby используйте RVM (Ruby Version Manager).

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

curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh

Затем перезапустите RVM и установите Ruby:

rvm reload
rvm install 2.1.0

Установка Rails

Прежде всего для корректной работы Rails нужен JavaScript. Для этого установите Node.js.

yum install -y nodejs

Чтобы загрузить и установить gem rails, введите:

gem install bundler rails

Установка Unicorn

Загрузить Unicorn можно несколькими способами.

Так как Unicorn – зависимость приложения, наиболее логичным способом загрузки сервера является RubyGems. Чтобы установить Unicorn с помощью gem, используйте:

gem install unicorn

Примечание: Подробнее о работе с этим инструментом читайте далее в руководстве.

Создание тестового приложения Rails

Примечание: Если у вас уже есть готовое приложение, просто загрузите его исходный код. Чтобы загрузить исходный код, используйте SFTP или графический инструмент FileZilla. Также можно загрузить его на Github с помощью Git. Больше о работе с SFTP можно узнать в руководстве Использование SFTP для безопасного обмена файлами с удаленным сервером.

Выполните следующую команду, чтобы создать новое приложение 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:

cd /var/www/my_app
rails s

Теперь приложение доступно по ссылке:

http://[your server’s IP]:3000/tasks

Чтобы остановить процесс, нажмите:

CTRL+C

Настройка Unicorn

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

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

nano config/unicorn.rb

Поместите в него следующий блок кода, предварительно откорректировав его:

# Установите рабочий каталог приложения, например:
# working_directory "/path/to/your/app"
working_directory "/var/www/my_app"
# PID файл Unicorn:
pid "/var/www/my_app/pids/unicorn.pid"
# путь к логам:
stderr_path "/var/www/my_app/log/unicorn.log"
stdout_path "/var/www/my_app/log/unicorn.log"
# количество процессов (основное правило: 2 процесса на одно ядро процессора)
worker_processes 2
# Time-out
timeout 30

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

unicorn_rails

Чтобы узнать больше о настройке Unicorn, откройте официальную документацию проекта.

Запуск Unicorn

Теперь можно запустить приложение с помощью Unicorn.

Выполните следующие действия, чтобы запустить Unicorn в режиме демона, используя конфигурационный файл (config/unicorn.rb):

unicorn_rails -c config/unicorn.rb -D

Как узнать IP-адрес сервера

Для настройки Nginx нужен внутренний IP-адрес.

Чтобы узнать его, введите:

ifconfig

На экране появится вывод:

eth0      Link encap:Ethernet  HWaddr 04:01:10:4B:B8:01
inet addr:107.170.13.134  Bcast:107.170.13.255  Mask:255.255.255.0
inet6 addr: fe80::601:10ff:fe4b:b801/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:164298 errors:0 dropped:0 overruns:0 frame:0
TX packets:46316 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:230223345 (219.5 MiB)  TX bytes:4969058 (4.7 MiB)
eth1      Link encap:Ethernet  HWaddr 04:01:10:4B:B8:02
inet addr:10.128.241.135  Bcast:10.128.255.255  Mask:255.255.0.0
inet6 addr: fe80::601:10ff:fe4b:b802/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:120 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6810 (6.6 KiB)  TX bytes:874 (874.0 b)
lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:16436  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Строка inet addr содержит закрытый IP (в данном примере это 10.128.241.135).

Этот адрес нужен для настройки взаимодействия веб-сервера и сервера приложений. Запишите этот номер и приступайте к настройке.

Nginx как обратный прокси-сервер и балансировщик нагрузки

Теперь нужно настроить Nginx для получения входящих запросов и балансировки нагрузки серверов приложений.

Установка Nginx

Загрузите Nginx из репозитория EPEL:

yum install -y nginx

Настройка Nginx

По умолчанию конфигурационный файл nginx.conf находится в каталоге at/etc/nginx. Откройте его:

nano /etc/nginx/nginx.conf

Найдите и закомментируйте следующую строку:

# include /etc/nginx/conf.d/*.conf;

В раздел http { добавьте следующие параметры, предварительно откорректировав их:

# Set your server
# server_name www.example.com;
upstream unicorn_servers {
# Add a list of your application servers
# Each server defined on its own line
# Example:
# server IP.ADDR:PORT fail_timeout=0;
server 10.128.241.135:8080 fail_timeout=0;
# server 10.128.241.136:8080 fail_timeout=0;
# server 10.128.241.137:8080 fail_timeout=0;
}
server {
# Port to listen on
listen 80;
location / {
# Set proxy headers
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://unicorn_servers;
}
}

Сохраните и закройте файл.

Запустите Nginx:

service nginx start

Примечание: Для перезагрузки сервера используйте команду:

service nginx restart

Чтобы узнать о дальнейшей конфигурации и установке директив для обслуживания статических файлов, обратитесь к образцу файла nginx.conf от Unicorn.

Следующую статью из этой серии можно найти по этой ссылке.

Tags: , , , , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>