redmine.jpでのインストール手順ではPassenger + Apacheとなっていますが、nginxを使いたいのでunicorn + nginxで動かします。
rubyは詳しくないので「とりあえず動いた」レベルです。「ここ間違いだよ」「こうしたほうがいいよ」とかあればぜひ教えてください。
環境
OS | fedora23 | |
ruby | 2.1.7 | dnf(yum)インストール |
DB | mariadb 10.0.21 | dnf(yum)インストール |
nginx | 1.8.0 | dnf(yum)インストール |
redmineインストール
redmine.jpの手順とほぼ同じに行いますが、各種ツールはdnf(yum)で入れています。今回はnginxを使うのでapacheとpassengerは入れません。
postgresqlではなくmariadb(mysql)を使っていることに特に理由はありません。
http://blog.redmine.jp/articles/3_2/install/centos/
unicorn設定ファイル
自動起動用に設定ファイルを作ります。次のサイトを参考にさせていただいてます。
/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編
最近のコメント