Назад | Перейти на главную страницу

Nginx и Unicorn на разных машинах

У меня есть довольно стандартное приложение Rails, работающее с Unicorn и Nginx в одном устройстве. Я хотел бы отделить само приложение и иметь Nginx на одной машине и Unicorn (с приложением Rails) на другой машине. Идея здесь в том, что я хотел бы добавить еще один сервер приложений с Unicorn позже в будущем, в основном для некоторой легкой балансировки нагрузки.

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

Если это не тот путь, то каков правильный путь для достижения конечной цели? Я изучил HAProxy, но, прочитав некоторую документацию Nginx / Unicorn, я понял, что этого можно достичь без какого-либо дополнительного программного обеспечения.

Это нормально. Вам не нужен HAProxy, хотя HAProxy может предоставить вам более «справедливую» балансировку нагрузки между серверами приложений, чем балансировка нагрузки nginx.

Итак, на серверах приложений настройте Unicorn на прослушивание сетевого интерфейса. Желательно, чтобы это был частный IP-адрес. В этом примере предположим, что ваши серверы приложений - 192.168.1.100, 192.168.1.101 и 192.168.1.102. Настройте единорог для прослушивания порта 8000 на всех серверах приложений.

На стороне nginx у вас будет «восходящий» блок, например:

upstream unicorn {
  server 192.168.1.100:8000;
  server 192.168.1.101:8000;
  server 192.168.1.102:8000;
}

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

location / {

    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X_FORWARDED_PROTO $scheme;
    proxy_set_header  Host $host;

    proxy_connect_timeout 3;
    proxy_read_timeout 60;
    proxy_send_timeout 60;

    proxy_redirect off;
    proxy_max_temp_file_size 0;

    if (!-f $request_filename) {
      proxy_pass http://unicorn;
    }
}

Вам могут понадобиться другие прокси-операторы, чтобы все работало так, как вы хотите, но по сути это должно быть сделано. Оператор proxy_pass будет использовать блок, определенный в восходящем блоке, и распределять задания на перечисленные серверы приложений. Проверьте документацию nginx о других параметрах, которые могут быть подходящими.