10

Screencast 335をVPSチュートリアルにデプロイして、Railsサイトを正常にセットアップしました。新しいドメインに別のRailsアプリを追加したいのですが、必要な手順について混乱しています。

上記の設定では、sites-availableまたは/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;
}

私のCapistranoレシピには、この行があります

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

2番目のドメインを追加するのは、リッスン後にデフォルトの遅延を削除し、server_nameセクションのコメントを解除してから、2番目のアプリのアップストリームソケット名とサーバー名を変えてこの構成ファイルを繰り返すだけですか?それは機能しますか、それともこのファイルをサイト利用可能に転送し、サイト対応へのシンボリックリンクを作成する必要がありますか?

4

3 に答える 3

21

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;
}
于 2013-01-06T02:04:26.007 に答える
4

NginxとUnicornを使用すると、1つのホストでさまざまなアプリをホストするのは非常に簡単です。

socket各アプリケーションのファイルの異なる名前を定義することで得られる分離。もちろん、のセクションで適切なcurrent/publicディレクトリを指定する必要があります。servernginx.conf

最後の仕上げはunicorn_init.shファイルにあります。その上で、アプリケーションのディレクトリへのAPP_ROOTフルパスで変更する必要がcurrent/publicあります。

セットアップがRailsCastのものと類似している場合、他のすべてのことはcapistranoによって行われます。

于 2013-01-04T15:45:01.143 に答える
4

私はここで自分自身を作った質問でこれに答えました:

nginx+ユニコーンを使用した複数のRails4アプリ

しかし、ここに答えがあります:

Ruby2.0Rails4.0を使用しています。すでにnginxとunicornがインストールされていると思います。それでは、始めましょう!

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

最後にすべきこと、そして私が最も掘り下げたのは、次のように、railsroutesファイルのスコープを追加することです。

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

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

このように、アプリは/welcomeだけでなくリンク/myapp/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 / environment/production.rbのルートディレクトリを指定する必要があります。

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

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

config / environment / development.rbで、config.root_directoryを指定しません。このようにして、通常のURLルートを使用します。

于 2013-08-10T16:57:59.740 に答える