nginxのサブドメインでrailsの複数アプリを運用

新しいサイトを作成しているのですが、まだドメイン名も決まってないので、現在あるサイトのサブドメインでとりあえず表示確認できる場所まで運用をしようと考えました。

ここを抜かしてやってしまうと、サイトの立ち上げが出来なくて、断念する可能性があります。

一度設定ファイルができあがれば、あとはコードを書くだけの状態に追い込めます。

では、nginxでサブドメインで運用を行えるようにします。

準備

  • サブドメインを取得する(お名前.com)
  • サーバー側で設定(さくらvps使用しています)

ここは色んなサイトが書かれているので、割愛させていただきますが、こんな内容です。

お名前.com

さくらvps

お名前.comだけで終わると思ったら、さくら側の設定があるのを忘れて少しはまりました。

nslookup hoge.hogehoge.com

をすることで、ドメインが有効かの確認ができます。

自分はお名前.comだけの設定を見て、上記コマンドを叩いてもエラーになっていたので、原因がわからずはまっていました。

nginx

nginx側の設定は簡単です。

server_nameをサブドメインにするだけです。

/etc/nginx/conf.d/hoge.conf

upstream hoge {
  server unix:/tmp/unicorn-hoge.sock fail_timeout=0;
}

server {
  listen 80;
  server_name hoge.hogehoge.com;

  # Application root, as defined previously
  root /var/www/hoge/current;

  location ~ ^/assets/ {
    root   /var/www/hoge/shared/public;
  }

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

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

自分はこんな感じで新しく作成しました。

upstreamの部分をunicorn.rbのlistenに合わせないといけません。

config/unicorn.rb

# paths
app_name = 'whoge'
app_path = "/var/www/#{app_name}"
working_directory "#{app_path}/current"

# listen
listen "/tmp/unicorn-#{app_name}.sock", backlog: 64 ←ここを合わせる

# pid(Process ID) fileの位置を指定
pid "#{app_path}/current/tmp/pids/unicorn.pid"

# ワーカーの数を指定する
worker_processes 2

# リクエストのタイムアウトの秒数を指定する
timeout 15

# ダウンタイムをなくすため、アプリを事前に読み込む
preload_app true

# Unicornのログの出力先を指定する
stdout_path "log/unicorn_stdout.log"
stderr_path "log/unicorn_stderr.log"

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{ server.config[:pid] }.oldbin"
  unless old_pid == server.pid
    begin
      Process.kill :QUIT, File.read(old_pid).to_i
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

これで設定は終わりです。

nginxの設定で自信がない場合は、まずはdefaultのnginxが読めるかを確認するなどして、読み込みが正しいかを確かめながらやるのがいいと思います。

いきなりやると分からなくなります。

以上です。