CentOS 6.3にRedmine + Unicorn + nginxな環境を構築する手順


# 0. 前提条件
rubyがインストールされていることは前提として記載する。
作業はrootで実施。

# 1. MySQLのインストール

RedmineのデータベースにMySQLを利用したいため、インストールする。ここでは 5.5系のバージョンのMySQLをインストールするためにremiリポジトリを追加する。

```
rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-7.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

\* remiパッケージはepelパッケージに依存するためepelリポジトリを先に追加する。

作成された`/etc/yum.repos.d/remi.repo`をvimなどで開き`enable=1`に変更する。

```
yum install -y mysql mysql-lib mysql-devel mysql-server
```

でMySQLをインストールする。

インストールが完了したら設定ファイルを/etc/my.cnfにコピーする

```
cp -af /usr/share/mysql/my-medium.cnf /etc/my.cnf
```

`chkconfig`でサービスとしてmysqlを起動する設定をし、サービスを起動する。

```
chkconfig mysqld on
service mysqld start
```

動作を確認する場合は

```
mysql -u root -e 'select user,host from mysql.user'
```
などで行えばOK.

## 2. Redmine用データベースとユーザをMySQLに追加

MySQLのインストールが済んだら、Redmine用のデータベースとユーザを作成する。

まず、DBのcharsetをutf8に設定する。
`/etc/my.cnf`に以下の設定を追記する。

```/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8 #=> この行を追加

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
default-character-set=utf8 #=>この行を追加
```

文字セットの設定をしたら、MySQLを起動する。

```
service mysqld start
```

起動したら、Redmine用データベースとユーザを追加する。

```
mysql -uroot

mysql> CREATE DATABASE redmine DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)
```

`mysql> SHOW DATABASES;`で確認するとredmineというDBができているはず。

次に、redmineデータベースにアクセス権限を持つユーザを作成する。

```
mysql> GRANT ALL ON redmine.* TO redmine@'localhost' IDENTIFIED BY 'hogehoge';

mysql> FLUSH PRIVILEGES;
```

`hogehoge`の部分はパスワード。

## 3. Redmine本体のインストール

ソースはどのような方法で手に入れても良いと思うが、今回はGithubのリポジトリをcloneして利用する。
インストール先は[Redmineのインストールガイド](http://blog.redmine.jp/articles/redmine-2_1-installation_centos/)に従い、/var/lib下にする。

```
cd /var/lib/

git clone https://github.com/redmine/redmine.git redmine

cd redmine
```

インストールしたいバージョンのブランチへ切り替える。

```
git checkout -b 2.1-stable remotes/origin/2.1-stable
```

`bundler`で依存gemをインストールする。developグループやtestグループ、利用しないpostgresqlとsqlite3のアダプタ等はインストールしない。

```
bundle exec install --path vendor/bundle --without development test postgresql sqlite
```

セッションデータの暗号化鍵を生成する。

```
bundle exec rake generate_secret_token
```

データベース構築

```
RAILS_ENV=production bundle exec rake db:migrate
```

ここまでで一度、Webrickで動作を確認しておく。
(iptablesを使用している場合、ポート3000番をあけておく。)

```
bundle exec rails s -e production
```

## 4. Unicornをインストールする

unicornはbundlerでインストールする。
Gemfile.localを作成し以下を記述する。

```Gemfile.local
gem 'unicorn'
```

Gemfile.localを編集し終えたら`bundle install`を実行する。

## 5. Unicornの設定 & サービス化

unicornの設定をする。

設定はgithub上のサンプルを利用させて頂き、必要な部分を変更する。(もちろん、自分で書いてもOK)

```
cd /var/lib/redmine/config/
wget -O unicorn_redmine.rb https://raw.github.com/defunkt/unicorn/master/examples/unicorn.conf.rb
vim unicorn_redmine.rb
```

今回はhttp://ホスト名/redmineというサブディレクトリでの運用を考えているため、サブディレクトリ用の設定をする。

/var/lib/redmine/config.ruを以下の用に書き換える。

```/var/lib/redmine/config.ru
if ENV['RAILS_RELATIVE_URL_ROOT'] #=> 追加
  map ENV['RAILS_RELATIVE_URL_ROOT'] do #=>追加
    run RedmineApp::Application #=> 追加
  end #=> 追加
else #=> 追加
  run RedmineApp::Application
end #=> 追加
```

で、unicorn起動時に `--path /redmine`を付加すると、`ENV['RAILS_RELATIVE_URL_ROOT']`に`/redmine`が入ってきて、
http://ホスト名/redmineでアクセスできるという寸法。

次に、起動スクリプトを用意する。Web上にあるサンプル等を利用させて頂いて作成すれば良いと思う。今回はサブディレクトリの運用を考えているので、unicorn起動時に上述の`--path /redmine`を付加するようにしている。

```/etc/init.d/redmine
#!/bin/bash
#
# redmine Startup script for unicorn.
#
# chkconfig: - 86 15
# description: redmine on unicorn start/stop script.

#
# set rbenv environment valiables
#
export PATH=/usr/local/bin:/usr/bin:/usr/local/rbenv/versions/1.9.3-p327/bin
export RUBY_HOME=/usr/local/rbenv/versions/1.9.3-p327

set -u
set -e

APP_NAME=redmine
APP_ROOT="/var/lib/$APP_NAME"
CONFIGS="$APP_ROOT/config/unicorn_redmine.rb"
PID="$APP_ROOT/config/shared/pids/unicorn.pid"
ENV=production

UNICORN_OPTS="-D -E $ENV -c $CONFIGS --path /redmine -p 8080"

old_pid="$PID.oldbin"

cd $APP_ROOT || exit 1

sig(){
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig(){
  test -s $old_pid && kill -$1 `cat $old_pid`
}

case $1 in
start)
  sig 0 && echo >&2 "Already running" && exit 0
  cd $APP_ROOT ; bundle exec unicorn_rails $UNICORN_OPTS
  ;;
stop)
  sig QUIT && exit 0
  echo >&2 "Not running"
  ;;
force-stop)
  sig TERM && exit 0
  echo >&2 "Not running."
  ;;
restart|reload)
  sig HUP && echo reloaded OK && exit 0
  echo >&2 "Couldn't reload, starting instead"
  bundle exec unicorn_rails $UNICORN_OPTS
  ;;
upgrade)
  sig USR2 && exit 0
  echo >&2 "Couldn't upgrade, starting instead"
  bundle exec unicorn_rails $UNICORN_OPTS
  ;;
rotate)
  sig USR1 && echo rotated logs OK && exit 0
  echo >&2 "Couldn't rotate logs" && exit 1
  ;;
*)
  echo >&2 "Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"
  exit 1
  ;;
esac
```

記載したら、`chmod 755 /etc/init.d/redmine`で実行権限を与えておく。

起動スクリプトを作成したのでchkconfigに追加しておく。

```
chkconfig --add redmine
chkconfig redmine on
chkconfig --list redmine
redmine        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
```

実際にサービスを起動する。

```
service redmine start
```

## 6.nginxのインストール & 設定

nginxのインストールを行う。ソースからビルドするのもありだと思うが、今回はepelのパッケージを利用する。

```
yum install -y nginx
```
/etc/nginxにインストールされるので、/etc/nginx/conf.d/にredmine用の設定を記載する。(後で別のアプリケーションもサブディレクトリを別にして同一のサーバ上で動かす予定であるので、今回はdevelopment.confという名前で作成する。)

```/etc/nginx/conf.d/development.conf
upstream redmine {
  server hostname:8080;#hostnameは環境に合わせて書き換える
}

server {
  listen 80;
  server_name hostname; #hostnameは環境に合わせて書き換える
  root /var/www;

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

  location @redmine{
    #error_log /var/www/redmine/log/error.log;
    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_pass http://redmine;
  }
}
```

nginxのドキュメントルートを/var/wwwに設定したので、redmineのpublicディレクトリのシンボリックリンクを作成しておく。
(静的ファイルはnginxに返してほしいから)

```
ln -s /var/lib/redmine/public redmine
```

あとは`nginx -t`で問題なければ`service nginx restart`でnginxを再起動してhttp://ホスト名/redmineにアクセスしてみる。(iptablesを利用している場合は80ポートを空けておくのを忘れずに。)

かなり、大急ぎで書いたので間違いがあるかもしれません。