2016年6月9日木曜日

【参考】サーバー移転(Nginx):Redmineのアップグレード(3.2→3.3)とGoogle認証プラグイン

以前、同一サーバーでのアップグレードについては掲載していました。
Redmineのアップグレード(3.1→3.2)とGoogle認証プラグイン
今回は完全なサーバーのお引越しです。

引越前
  • Apache + Passanger + ruby 1.9 + Redmine 3.2 (RHEL 5)
引越後
  • Nginx + Unicorn + ruby 2.3 + Redmine 3.3 (RHEL 6)

Nginxは LibreSSLを使っていますが、RHEL 6標準の opensslも入れています。
このあたりもあって話がややこしく、、、いやいやチャレンジ精神旺盛でしょ!?

1. Ruby 2.3 導入編



RHEL 6の Rubyは 1.8.7と Redmine が要求する 1.9に対応していません。ので新しいRubyのインストールが必要です。

1.1 Rbenvのインストール


RHEL 6には ruby 1.8.7が入っています。
これを削除してもいいのですが、今回 rbenv ツールにてバージョン管理することにしました。

参考:rbenvのインストール on CentOS(http://www.e-mist.com/)


インストール場所: /usr/local/rbenv

cd /usr/local
git clone git://github.com/sstephenson/rbenv.git
cd rbenv
mkdir plugins
cd plugins
git clone git://github.com/sstephenson/ruby-build.git

以下は、ユーザーが rbenvをつかってrubyのバージョンを切り替える場合です。
redmine グループを作成して、そこに使えるユーザーをいれておくという感じです。ここでは詳しく説明しません。 root(sudo)だけしか切り替えなくていいぜ!ってかたは不要です。

chgrp -R  redmine /usr/local/rbenv
chmod -R g+rwxXs /usr/local/rbenv

1.2 Rbenvをつかうための環境設定


bash系

/etc/profile
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/shims:$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

csh系

/etc/csh.cshrc
setenv RBENV_ROOT /usr/local/rbenv
setenv PATH $RBENV_ROOT/shims:$RBENV_ROOT/bin:${PATH}
rbenv rehash

これでログインしなおします。

1.3 必要なパッケージのインストール


以下、CentOS/RHEL に Ruby 2.x をインストールする(http://dotnsf.blog.jp/)を参照

yum install libyaml-devel
yum install libffi-devel
yum groupinstall 'Development tools'

この3つは必須でした。

1.4 Rbenv より Rubyをインストール


rbenv install -l 

で扱える最新版をチェック。Rubyのサイトの最新版にもっとも近いものをチェックします。今回は、2.3.1と最新版がいけました。

RUBY_CONFIGURE_OPTS=--with-openssl-dir=/usr/local rbenv install 2.3.1

LibreSSLを /usr/local 以下に展開して、 OpenSSLを /usr 以下に展開しています。
そのためか、上記の --with-openssl-dir を指定しないと
  • make[2]: *** [ossl_ssl.o] Error 1
というエラーがでました。
また、1.3 の必要なパッケージが足りないと
  • make[1]: *** Waiting for unfinished jobs....
といってインストールが止まります。
ここで結構時間がかかりました。


1.5 Rbenv より Rubyの設定


rbenv global 2.3.1
ruby -v 

として 2.3.1と出てくれば成功です。
ここで「1.2 Rbenvを使うための環境設定」でハマりました。
  • パスに「$RBENV_ROOT/shims」をいれよ!
これネットで情報がなかったのですよね。そのまま鵜呑みにしていたら ruby -v であれ、反映されないじゃん!!ってなりました。ふ〜

さて第1関門になる Rubyのインストールはできましたか。

じゃあ第2関門へレッツゴー

2. Redmine 3.3 のインストール



インストール場所:/usr/local/redmime-svn/3.3-stable
Nginxで指定する場所:/usr/local/redmine-svn/redmine (/usr/local/redmime-svn/3.3-stable へのシンボリックリンク)
※ ln -s /usr/local/redmime-svn/3.3-stable  /usr/local/redmine-svn/redmine のこと

とします。
インストールする場所と、Nginxが見る場所を変更しているのは、Redmineをアップグレードする際に楽のためです。アップグレードは、 /usr/local/redmime-svn/◯.◯-stable にRedmineをダウンロードして設定やデータを移行(コピー)して、 /usr/local/redmine-svn/redmine --> /usr/local/redmime-svn/◯.◯-stable  にしておけば、 Nginxの設定はいじらなくてすむぜ(/usr/local/redmine-svn/redmine をみているので)っていう感じで。

2.1 Redmine 3.3のダウンロード


mkdir /usr/local/redmine-svn
cd /usr/local/redmine-svn
svn co https://svn.redmine.org/redmine/branches/3.3-stable/
ln -s 3.3-stable redmine

2.2 データの移行


移行する場合のみ
※バックアップについては「Redmineのアップグレード(3.1→3.2)とGoogle認証プラグイン」をチェックしてみてください。


データベースの移行


これは何も置換せず、そのまま新しいサーバーへ移行してください。

cp -p database.yml        3.3-stable/config/
cp -p configuration.yml  3.3-stable/config/

上記ファイルについては、データベース・アクセス情報、メール通知情報など変更点があるなら設定変更しておいてください。

cp -rp files/*       3.3-stable/files/
cp -rp plugins/*   3.3-stable/plugins/
cp -rp public/themes/*  3.3-stable/public/themes/

バックアップ元から上記3つのフォルダをコピーしてください。

2.3 Redmine が必要とする機能のインストール


cd /usr/local/redmine-svn/3.3-stable
gem install bundler --no-rdoc --no-ri
bundle install --without development test
bundle exec rake generate_secret_token

エラー無くRedmine 3.3のインストールはできましたか。
ここでハマるとまた相当時間がかかります。

さぁ、ここまできたら、第3関門の登場です!

3. Unicornの導入と起動


Nginxで Redmine を動作させるためには Railsサーバーが必要です。Unicornが軽くて良いらしいのでこれを使います。

3.1 Unicornのインストール


cd /usr/local/redmine-svn/3.3-stable
vi Gemfile
末尾に
  gem 'unicorn'
を追加して保存
bundle update

※Gemfile.local に保存して対応するのが推奨されていますが、ここでは割愛。

3.2 Unicorn の一時起動テスト


Unicorn自体にウェブサーバー機能があります。
ただあくまで動作テストであり、本番環境には耐えられないから使わないように!ということです。

bundle exec unicorn_rails -l 3000 -E production

これで http://◯◯:3000 で Redmineが起動しているはずです!
これが動作しないなら、正しく Unicornがインストールできていないことになります。

ただし iptablesの設定で上記の場合には 3000/tcp に対して一時的にアクセス許可をしておいてください。

3.3. Unicornの起動設定


いろいろネットに出ていますが、私は、「Unicornの設定のまとめ」に掲載されているものをそのまま使いました。気をつけるところは「worker_processes」の値です。私も2 CPUだったのでそのままにしています。CPU数に応じて変更してみてください。

/usr/local/redmine-svn/3.3-stable/config/unicorn.rb

に保存します。

3.3. Unicornの起動スクリプトの生成


いろいろネットに出ていますが、私は、「RedmineをCentOS_6上で動かすーUnicornとNginx編(www.torutk.com)」に掲載されているものをそのまま使いました。

/etc/init.d/unicorn に保存します。
chmod 700 /etc/init.d/unicorn 
mkdir /etc/unicorn
vi /etc/unicorn/redmine.conf
RAILS_ENV=production
RAILS_ROOT=/usr/local/redmine-svn/redmine

とします。

3.4. Unicornの起動スクリプトの登録


RedmineをCentOS_6上で動かすーUnicornとNginx編(www.torutk.com)」参考に

/sbin/chkconfig --add unicorn
/sbin/chkconfig unicorn on

で自動起動になります。

3.5  Unicornの起動


service unicorn start

で起動します。
/usr/local/redmine-svn/redmine/log/
以下がログになっていて、 production.log が通常ログ、 unicorn_stderr.log がエラーログになります。

さぁ、ここまできたらもうひと踏ん張り!!

4. Nginx の設定


4.1 redmine 用の upstream設定の追加


Unicornの設定のまとめ」の設定をしたと過程すると

/etc/nginx/nginx.conf
   upstream redmine {
          server unix:/usr/local/readmine-svn/redmine/tmp/unicorn.sock;
   }

を追加してください。
後は https://◯◯:3000 で動作させることにします。
サブディレクトリで動作させるのは敷板が高く(基本サブディレクトリでは動作しない)、結局あきらめました。
ActionController::RoutingError (No route matches [GET] "/redmine"):
など出て。

server {
        listen       3000 ssl http2;
        server_name  ◯◯;
        ssl             on;
        charset             utf-8;
        root  /usr/local/redmine-svn/redmine/public;

        access_log  ログの場所 main;
        error_log  エラーログの場所;

        ssl_certificate      証明書(中間証明書含む).cer;
        ssl_certificate_key  証明書(秘密鍵).key;

        ※暗号化強度設定
    ※各種制限等をいれる(ただし画像に対して expires はいれないこと。Redmineではそれいれると画像が Not foundになってしまう)

      try_files $uri/index.html $uri @unicorn;

      location @unicorn{
            proxy_pass http://redmine;
            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;
     }
}

Nginxの設定は構成によって違ってくるので、とりあえず基本的な部分のみ書き出しておきます。

これで Nginxを読み込み直すと、
  • https://◯◯:3000
でRedmineが起動したでしょう!

※アクセスできなければ iptables 等 3000/tcp へのアクセスを許可しておいてください。

Google認証プラグイン導入時には


初めて使うなら、【まめ知識】RedmineでGoogle Apps認証!を参考。
そうでないなら https://cloud.google.com/console より、すでに設定したものの APIと認証、認証情報にある「リダイレクト URI」に


http://◯◯:3000/oauth2callback
https://◯◯:3000/oauth2callback

の2つを登録しておく。何故か https:// だけではダメだった。原因追求は時間がないのでとりあえず放置。


Unicornを monitで監視


monitを入れているなら、設定しておくといいでしょう。
Unicornがトラブルで落ちた時に再度起動しなおして通知してくれます。

/etc/monit.d/unicorn.conf
check process unicorn with pidfile /usr/local/redmine-svn/redmine/tmp/pids/unicorn.pid
   start program = "/etc/init.d/unicorn start"
   stop program = "/etc/init.d/unicorn stop"
  if 5 restarts within 5 cycles then timeout

  group unicorn

あたりで十分でしょう。
そしてmonitを設定を読み込みなおします。

Unicornのログローテート


ログ結構たまるので logrotateにてログ整理しておくとよいです。
古いログは
/usr/local/redmine-svn/redmine/log/old フォルダにいれることにします。

mkdir /usr/local/redmine-svn/redmine/log/old

/etc/logrotate.d/unicorn
/usr/local/redmine-svn/redmine/log/*.log {
    missingok
    notifempty
    olddir /usr/local/redmine-svn/redmine/log/old 
    postrotate
        /sbin/service unicorn rotate  > /dev/null 2>&1 || :
    endscript
}

RedmineをCentOS_6上で動かすーUnicornとNginx編(www.torutk.com)」にある起動スクリプトには、 ログローテートに対応したオプション rotateが備わっているので楽です。なければ /usr/local/redmine-svn/redmine/tmp/pids/unicorn.pid のプロセスに対して kill -USR1 をしてログの読み込み直しをします。

logrorate  /etc/logrotate.conf

として設定を追加し、/var/lib/logrotate.status
にログ対象が追加されていることを確認してください。
つまりは、/usr/local/redmine-svn/redmine/log/ フォルダにある拡張子 logファイルが登録されているかどうかです。

これで完了ですね!


2016年6月8日 @kimipooh



0 件のコメント:

コメントを投稿