Множество рельсовых приложений на nginx и единорога

Я успешно установил сайт рельсов, используя Screencast 335, в учебник VPS. Теперь я хочу добавить еще одно приложение rails в новый домен, но я смущен о необходимых шагах.

В приведенной выше настройке нет изменений на сайтах - или /etc/nginx/nginx.conf. Единственная конфигурация в unicorn.rb, unicorn_init.sh и nginx.conf в моем каталоге конфигурации приложений. Файл nginx.conf выглядит так: -

upstream unicorn {
  server unix:/tmp/unicorn.my_app.sock fail_timeout=0;
}
server {
  listen 80 default deferred;
  # server_name my_app.com.au www.my_app.com.au;
  root /var/www/my_app/current/public;
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }
  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }
  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

В моем рецепте Капистрано у меня есть эта строка

sudo "ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}"

Является ли добавление второго домена просто вопросом удаления отложенных по умолчанию после прослушивания и без комментирования раздела server_name, а затем повторения этого файла конфигурации с другим именем восходящего сокета и именем сервера для второго приложения? Будет ли это работать или мне нужно перенести этот файл на доступные сайты и создать символическую ссылку на сайты?

Ответ 1

На самом деле очень удобно размещать разные приложения на одном хосте с Nginx и Unicorn.

Разделение, которое вы можете получить, определяя разные имена файлов socket каждого приложения. Конечно, вы должны указать правильные каталоги current/public в разделе server nginx.conf.

Последнее касание находится в файле unicorn_init.sh: в верхней части его вы должны изменить APP_ROOT с полным путем в каталог current/public вашего приложения.

Если ваша настройка похожа на RailsCast, все остальные вещи выполняются capistrano.

Ответ 2

В unicorn.rb:

приложение 1:

root = "/var/www/application_1/current"
working_directory root
pid "#{root}/tmp/pids/unicorn-app1.pid"
listen "/tmp/unicorn.app1.sock"

приложение 2:

root = "/var/www/application_2/current"
working_directory root
pid "#{root}/tmp/pids/unicorn-app2.pid"
listen "/tmp/unicorn.app2.sock"

В nginx.conf:

приложение 1:

upstream app1_server {
  server unix:/tmp/unicorn.app1.sock fail_timeout=0;
}

server {
  listen 80;
  server_name my_app_1.com www.my_app_1.com;
  root /var/www/app1/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @app1_server;
  location @app1_server {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://app1_server;
 }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

приложение 2:

upstream app2_server {
  # point to app2 sock
  server unix:/tmp/unicorn.app2.sock fail_timeout=0;
}

server {
  listen 80;
  server_name my_app_2.com www.my_app_2.com;
  root /var/www/app2/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @app2_server;
  location @app2_server {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://app2_server;
 }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

Ответ 3

Я ответил на этот вопрос, который я сделал здесь:

Несколько приложений Rails 4 с использованием nginx + единорога

Но вот ответ:

Я использую Ruby 2.0 и Rails 4.0. Полагаю, у вас уже установлен nginx и единорог. Итак, начнем!

В файле nginx.conf мы собираемся сделать nginx точкой для сокета единорога:

upstream unicorn_socket_for_myapp {
  server unix:/home/coffeencoke/apps/myapp/current/tmp/sockets/unicorn.sock fail_timeout=0;
}

Затем, когда ваш сервер прослушивает порт 80, добавьте блок местоположения, указывающий на подкаталог вашего приложения rails (этот код должен быть внутри серверного блока):

location /myapp/ {
    try_files $uri @unicorn_proxy;
  }

  location @unicorn_proxy {
    proxy_pass http://unix:/home/coffeencoke/apps/myapp/current/tmp/sockets/unicorn.sock;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
  }

Теперь вы можете просто Единорог в качестве дьямона:

sudo unicorn_rails -c config/unicorn.rb -D

Последнее, что нужно сделать, и тот, который я вырыл больше всего, - это добавить область для файла маршрутов рельсов, например:

MyApp::Application.routes.draw do
  scope '/myapp' do
    root :to => 'welcome#home'

    # other routes are always inside this block
    # ...
  end
end

Таким образом, ваше приложение будет отображать ссылку /myapp/welcome, int just of/welcome

Но есть еще лучший способ

Хорошо, вышесказанное будет работать на производственном сервере, но как насчет разработки? Вы собираетесь нормально развиваться, а затем при развертывании вы меняете конфигурацию рельсов? Для каждого приложения? Это не нужно.

Итак, вам нужно создать новый модуль, который мы будем помещать в lib/route_scoper.rb:

require 'rails/application'

module RouteScoper
  def self.root
    Rails.application.config.root_directory
  rescue NameError
    '/'
  end
end

После этого в routes.rb сделайте следующее:

require_relative '../lib/route_scoper'

MyApp::Application.routes.draw do
  scope RouteScoper.root do
    root :to => 'welcome#home'

    # other routes are always inside this block
    # ...
  end
end

Что мы делаем, так это выяснить, указан ли корневой каталог, если он его использует, в противном случае он попал в "/". Теперь нам просто нужно указать корневой каталог в config/enviroments/production.rb:

MyApp::Application.configure do
  # Contains configurations for the production environment
  # ...

  # Serve the application at /myapp
  config.root_directory = '/myapp'
end

В config/enviroments/development.rb Я не указываю config.root_directory. Таким образом, он использует обычный корень url.