Приложение 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.

Другие вопросы по тегам