Приложение Multiple Rails 4, использующее nginx + единорог
Я ищу настроить сервер nginx с единорогом. Первое приложение установлено, но оно находится в корне "/". то, что я действительно хочу, это тип localhost / app1, и он будет работать, в то время как, если просто открыть корень, HTML или PHP-страницы будут открыты.
Любая подсказка?
Вот текущий nginx.config:
worker_processes 4;
user nobody nogroup; # for systems with a "nogroup"
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024; # increase if you have lots of clients
accept_mutex off; # "on" if nginx worker_processes > 1
}
http {
include mime.types;
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on; # off may be better for *some* Comet/long-poll stuff
tcp_nodelay off; # on may be better for some Comet/long-poll stuff
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/html text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream sip {
server unix:/home/analista/www/sip/tmp/sockets/sip.unicorn.sock fail_timeout=0;
}
server {
listen 80 default deferred; # for Linux
client_max_body_size 4G;
server_name sip_server;
keepalive_timeout 5;
# path for static files
root /home/analista/www/sip/public;
try_files $uri/index.html $uri.html $uri @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
# proxy_buffering off;
proxy_pass http://sip;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://sip;
break;
}
}
# Rails error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/analista/www/sip/public;
}
}
}
1 ответ
Я понял! Оказывается, это было действительно просто, и я написал пост об этом в своем блоге. http://jrochelly.com/post/2013/08/nginx-unicorn-multiple-rails-apps/
Вот содержание:
Я использую 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
Последнее, что нужно сделать, и то, что я выкопал больше всего, это добавить область для вашего файла маршрутов rails, например так:
MyApp::Application.routes.draw do
scope '/myapp' do
root :to => 'welcome#home'
# other routes are always inside this block
# ...
end
end
Таким образом, ваше приложение будет отображать ссылку / myapp / welcome, intead of just / welcome
Но есть еще лучший способ
Что ж, вышесказанное будет работать на производственном сервере, но как насчет разработки? Собираетесь ли вы нормально развиваться, тогда при развертывании вы меняете конфигурацию rails? Для каждого приложения? Это не нужно.
Итак, вам нужно создать новый модуль, который мы собираемся разместить на 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.