fedora23でredmineをunicorn + nginxで動かす

redmine.jpでのインストール手順ではPassenger + Apacheとなっていますが、nginxを使いたいのでunicorn + nginxで動かします。
rubyは詳しくないので「とりあえず動いた」レベルです。「ここ間違いだよ」「こうしたほうがいいよ」とかあればぜひ教えてください。

環境

OSfedora23
ruby2.1.7dnf(yum)インストール
DBmariadb 10.0.21dnf(yum)インストール
nginx1.8.0dnf(yum)インストール

redmineインストール

redmine.jpの手順とほぼ同じに行いますが、各種ツールはdnf(yum)で入れています。今回はnginxを使うのでapacheとpassengerは入れません。
postgresqlではなくmariadb(mysql)を使っていることに特に理由はありません。

http://blog.redmine.jp/articles/3_2/install/centos/

unicorn設定ファイル

自動起動用に設定ファイルを作ります。次のサイトを参考にさせていただいてます。

http://www.torutk.com/projects/swe/wiki/RedmineをCentOS_6上で動かすーUnicornとNginx編#Unicorn%E3%81%AE%E8%A8%AD%E5%AE%9A

/path/to/redmine/config/unicorn.rb

# -*- coding: utf-8 -*-
# Unicorn設定ファイル
# 次のURLのサンプルをベースにしている。
# http://unicorn.bogomips.org/examples/unicorn.conf.rb

# 専用サーバーであればコアにつき1個以上を指定する。
worker_processes 2

# リクエスト待ち受け口、TCPとUNIXドメインとが指定可能。
#listen "/tmp/unicorn_redmine.sock", :backlog => 32
#listen 8282, :tcp_nopush => true
listen "/var/run/redmine-unicorn.sock", :backlog => 32

# タイムアウト秒数
timeout 30

# 稼働中のプロセスのPIDを書いておくファイル。
pid "/var/run/redmine-unicorn.pid"

# デーモンで起動すると標準出力/標準エラー出力が/dev/nullになるので、
# それぞれログファイルに出力する。
stderr_path '/var/log/unicorn.stderr.log'
stdout_path '/var/log/unicorn.stdout.log'

# マスタープロセス起動時にアプリケーションをロードする(true時)。
# ワーカープロセス側でロードをしないのでメモリ消費、応答性良好になる。
# ただし、ソケットはfork後に開きなおす必要あり。
# HUPシグナルでアプリケーションはロードされない。
preload_app true

# unicornと同一ホスト上のクライアントとのコネクション限定で、維持されているかを
# アプリケーションを呼ぶ前にチェックする。
check_client_connection false

before_fork do |server, worker|
  # Railsでpreload_appをtrueにしているときは強く推奨
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!

  # unicorn serviceスクリプト側で制御するのでここは一旦コメントアウト
  # 制御が確認できれば削除する予定
  # 新しいマスタープロセスを起動した後に古いマスタープロセスをQUITする
  #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|
  # Railsでpreload_appをtrueにしているときは必須
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection

  begin
    uid, gid = Process.euid, Process.egid
    user, group = "redmine", "redmine"
    ENV["HOME"] = "/home/redmine"
    target_uid = Etc.getpwnam(user).uid
    target_gid = Etc.getgrnam(group).gid
    worker.tmp.chown(target_uid, target_gid)
    if uid != target_uid or gid != target.gid
      Process.initgroups(user, target_gid)
      Process::GID.change_privilege(target_gid)
      Process::UID.change_privilege(target_uid)
    end
  rescue
    if RAILS_ENV = "development"
      STDERR.puts "could not change user, oh well"
    else
      STDERR.puts "could not change user, oh well"
      raise e
    end
  end
end

ポイント:unixソケットを/var/run配下に置く

fedora23(CentOS7)では/var/runはtmpfs上にあるため、再起動時にファイルがなくなります。そのため強制リブート時にソケットファイルの残骸が残らず、再起動に失敗しにくくなります。

同様の理由でmariadbのsocketファイルも/var/run配下に置いています。

unicorn自動起動設定

unicornをsystemdコントロール下に置き、自動起動させます。

/usr/lib/systemd/system/redmine-unicorn.service

[Unit]
Description=Redmine Unicorn Server
After=mariadb.service

[Service]
WorkingDirectory=/path/to/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=redmine-unicorn
PIDFile=/var/run/redmine-unicorn.pid

ExecStart=/usr/local/bin/bundle exec "unicorn_rails -c config/unicorn.rb -E production"
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

ポイント:After=mariadb.service

fedora23(CentOS7)は自動起動がsystemdのため、OS起動時に各サービスが並列起動します。unicornがmariadbより先に起動するとunixソケットが見つからないためか「kill: 十分な引数がありません」というエラーメッセージで終了してしまいます。そのため「After=mariadb.service」でmariadbのあとに起動するようにします。

nginx設定

/etc/nginx/conf.d/redmine.conf

upstream redmine-unicorn {
    server unix:/var/run/redmine-unicorn.sock;
}

server {
    listen 80;
    server_name redmine.example.com;

    root /path/to/redmine/public;

    location / {
        try_files $uri/index.html $uri.html $uri @app;
    }

    location @app {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 600;
        proxy_pass http://redmine-unicorn;
    }

    error_page 500 502 503 504 /500.html;
}

upstreamにunicornのunixソケットを指定しています。

参考サイト

http://www.torutk.com/projects/swe/wiki/RedmineをCentOS_7上で動かすーUnicornとNginx編

「Systemd」を理解する ーシステム起動編ー

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください