Множество рельсовых приложений на 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.