読者です 読者をやめる 読者になる 読者になる

Redmine を Nginx + Unicorn へ移行

Apache + Passenger で動かしていた Redmine を Nginx + Unicorn に移行したのでそのメモ。

設定した環境
  • フロントの Nginx は https である。
  • Redmine は /var/redmine にインストールされている。
  • URL はドメイン/redmine で受ける.
  • VPS 環境でUbuntu でスペックは低め。

Unicorn のインストール

Redmine ディレクトリのルートに Gemfile.local を作る。

# Gemfile.local
gem "unicorn"

bundler で Unicorn をインストール

$ bundle install

Unicorn の設定スクリプト

Redmine ディレクトリの config に unicorn.rb を下記のとおり作成する。

worker_processes 1

timeout 60

listen File.expand_path("tmp/sockets/unicorn.sock", ENV['RAILS_ROOT'])
pid File.expand_path("tmp/pids/unicorn.pid", ENV['RAILS_ROOT'])

preload_app true

stderr_path File.expand_path("log/unicorn.stderr.log", ENV['RAILS_ROOT'])
stdout_path File.expand_path("log/unicorn.stdout.log", ENV['RAILS_ROOT'])

GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true

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

  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end 
  end 

  sleep 1
end 

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
  • 初回アクセス時にタイムアウトしないように 60 秒に増やす。
  • 数人しかアクセスしないのでワーカーは 1 つにする。

Nginx の設定

upstream redmine {
    server unix:/var/redmine/tmp/sockets/unicorn.sock;
}

…
    location /redmine {
        root /var/redmine/public;

        if ( -f $request_filename ) { break; }

        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://redmine;
    }
…