Итак, ваши старания были оценены по достоинству, и теперь приложение получает высокий трафик. Но с другой стороны, иногда из-за слишком высокой нагрузки случаются сбои в работе приложения. Значит, пришло время масштабировать приложение, другими словами, распределить его задачи между несколькими серверами.
Данное руководство поможет выполнить горизонтальное масштабирование приложения 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.
Следующую статью из этой серии можно найти по этой ссылке.