プロジェクト管理ツールを使ってみる。Ubuntuの環境に「Redmine」をNginxとUnicornを使って設置した話

スポンサーリンク

Redmine を設置しよう

なぜ、こういった動機に至ったかは別で書くとして。

どうしても自分がやっていることの「進捗」を管理する必要があると最近感じるようになりました。

ということで、「プロジェクト管理ツール」を使うようにしようということで。

Redmine を使うことにしました。

Redmine http://redmine.jp/

この手のツールで有名なのは、「バックログ」ですかね。

バックログ http://www.backlog.jp/

こちらも便利ですし、お仕事ではお世話になることも多々あるのですが、今回はあくまで「個人」。

うーん、ちょっと月額費用を払うのは違うかなと。利用者は自分だけですし。

この他にもこうしたツールは世に色々ありますが、今回は本当に個人的に使いたかっただけなので自分のサーバーに設置できて、自分で管理することにしました。

サーバーを用意しよう

個人的に借りているサーバーは「ServersMan」です。

ServersMan@VPSは、月額467円(税抜)でメモリ1GBという納得の価格とスペック。OSはお好きなものを選択可能。全プランroot権限・固定IP(IPv4/IPv6)・スワップ付。

最近はスペックを選ばなければ、VPSはたくさんありますからね…。

ConoHaは初期費用、データ転送一切無料のVPSです。すべてのストレージにSSDを採用したハイスペックなVPSは630円/月~。豊富なOS/アプリケーションテンプレートや多機能なAPIでサービスの運用・構築を大きくサポートします。

などなど。

OSも自由に選べるんで、まあ、不満もあったりするかもですが、割り切って使えればとても便利です。

今回は、ServersMan@VPSにて、Ubuntuを選択。

そこにRedmineを設置します。

RedmineはRubyなのか…。

入れようと思って、やや心が折れかかったのは、Redmineは「Ruby」ということ。

Rubyはまったく判りません。

うーん、どうしようかなと思いつつ。まあ、パッケージものだし、なんとかなるでしょう。ということで。

Ruby のことはほとんど理解していない人間がインストールしていますので、ご注意ください。

Rubyのバージョンをあげておく

今回はUbuntuにインストールしていくわけですが。

UbuntuのRubyは1.9.3が基本的に入っています。

最新のRedmineを使おうと思った場合、1.9.3でも問題ないようですが。

せっかくなので、ruby2.3にしておきます。

特にマストではないのですが、後のgemやら、Bundlerとか他のツールを入れる際にバージョンの一致とか何も考えなくて良いかな(そもそもそんな必要もないのかもしれませんが)?

という理由からバージョンを上げています。

あと、次のRedmine4.0からは1.9.3は対象外になるみたいですし…。

$ sudo add-apt-repository -y ppa:brightbox/ruby-ng
$ sudo apt-get update
$ sudo apt-get -y install ruby2.3

としてあげると、Ubuntuに新しいRubyを入れることが可能です(※Redmineの3.4.2 は一応、1.9.3にも対応しています)。

必要なツールを用意する

こちらは、Qiitaの記事を参考にしています。

--- 基本的には以下のブログを参考に、環境によってインストールしている。 (

一応、上記内容を参照していますが、個人的に必要ないものや自分の環境でやってみた事を以下まとめております。

gcc をインストール

$ sudo apt-get install -y build-essential

Nginx インストール

これは以前別途おこなっていたので、スキップしました。

$ sudo apt-get install -y nginx

Mysqlをインストール

$ sudo apt-get install -y mysql-server
$ sudo apt-get install libmysqld-dev

Redmineの展開

$ wget http://www.redmine.org/releases/redmine-3.4.2.tar.gz
$ tar xzvf redmine-3.4.2.tar.gz
$ sudo mkdir /usr/local/app/
$ sudo mv redmine-3.4.2 /usr/local/app/redmine-3.4.2
$ cd /usr/local/app/redmine-3.4.2/

ここで、最後にディレクトリを移動していますが、

/usr/local/app/redmine-3.4.2/

がアプリケーションのルートになります。

ここから実行することを前提としたコマンドが増えます。

unicornをインストールする準備

Redmineのファイルを展開したら、そこにあるGemfileを更新します。

vimなどで開いて

$ sudo vim /usr/local/app/redmine-3.4.2/Gemfile
gem "unicorn"//を追記して保存

gemのアップデート

$ sudo gem install rubygems-update
$ sudo update_rubygems

bundlerのインストール

$ sudo gem install bundler --no-rdoc --no-ri
$ gem install daemon_controller rack passenger --no-rdoc --no-ri

unicornのインストール

$ gem install unicorn

unicornに関しては、あとで設定ファイルを作ります。

Mysqlでデータベースを作る

ここでは、データベース名を「db_redmine」。

ユーザー名を「user_redmine」

にて設定しています。*のところはパスワードです。

$ mysql -u root -p

mysql> create database db_redmine default character set utf8;

mysql> grant all on db_redmine.* to user_redmine@localhost identified by '********';
mysql> flush privileges;
mysql> exit

Redmineからデータベースへアクセスできるようにする

$ sudo cp config/database.yml.example config/database.yml

$ sudo vim config/database.yml

上記コマンドでファイル名を変更してから、database.yml を編集します。

ファイルを開いて、下記のように編集します。

production:
  adapter: mysql2
  database: db_redmine
  host: localhost
  username: user_redmine
  password: "********"
  encoding: utf8

development:
  adapter: mysql2
  database: db_redmine
  host: localhost
  username: user_redmine
  password: "********"
  encoding: utf8

developmentの設定は、通常必要ないかもしれませんが…。

こちら、ネット上では、「production」の内容のみが説明されていることが多いのですが、私の環境ではテーブルを作ろうとすると「development」の設定を見に行くので上記わざと「production」と「development」を同じにしています。

あまり良いこととは思えませんが…。暫定的な対応です。

上記設定した上で、テーブルを用意します。

データベースにテーブルを作成する

RAILS_ENV=production bundle exec rake db:migrate

上記を実行すると、Redmine用のテーブルを作成してくれます。これをやっていないと、当たり前ですが、データが作れずにRedmineが立ち上がりません。

ここは、本家サイトを参照しています。

Nginxのモジュールをインストールし、設定ファイルを作成する

今回は、Nginxで設定を行っています。

サーバーによっては、Apacheが起動している場合は停止しておきます。

$ sudo apachectrl stop

です。

$ sudo passenger-install-nginx-module

とりあえず、Nginxを起動してみます。

sudo nginx

ドメインや、IPアドレスでサーバーにアクセスして「Welcome to nginx!」と出ていれば問題ないと思われます。

それから、Nginxの設定ファイルを作成します。

$ sudo vim /etc/nginx/sites-available/redmine.conf

vimなどで上記パスにファイルを作成します。内容は以下の形。

upstream redmine {
        server unix:/usr/local/app/redmine-3.4.2/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
        location / {
                root /usr/local/app/redmine-3.4.2/;
                if (-f $request_filename) {
                        break;
                }

                proxy_read_timeout 300;
                proxy_connect_timeout 300;
                proxy_redirect     off;

                proxy_set_header   X-Forwarded-Proto $scheme;
                proxy_set_header   Host              $http_host;
                proxy_set_header   X-Real-IP         $remote_addr;
                proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
                proxy_set_header   Host $host;

                proxy_pass         http://redmine;

                access_log  /var/log/nginx/redmine_access.log;
                error_log   /var/log/nginx/redmine_error.log;
        }
}

上記の設定ファイルのポイントを3つ挙げると

  • unicorn.sockのファイルの場所
  • location
  • error_log

です。

unicorn.sockは後で設定するunicornの設定ファイルであるunicorn.rbと関係が出てきます。

locationは、「/」でrootを指定しています。アクセスする場合は、「example.com」といった形でアクセスします。

ディレクトリでアクセスしたい場合は、それなりに記述してあげて下さい(割愛)。

エラーログはパスを必ず覚えておきます。Nginxでエラーが起きた場合はここをみて対策を考えることになります。

Nginxの設定をシンボリックで読み込む

上記設定が完了したら、

sudo mkdir /etc/nginx/sites-enable/

を作成して、先程作成したファイルからシンボリックを作成します。

$ sudo ln -s /etc/nginx/sites-available/redmine.conf /etc/nginx/sites-enabled/

シンボリックを設定します。

一見まわりくどいかもしれませんが、ここからNginxで設定ファイルを読み込みます。

vim /etc/nginx/nginx.conf

を開いて、この中に

include /etc/nginx/sites-enabled/*.conf;

を追記します。ただ、注意が必要で、どこにでも書いてよいわけじゃないようです。

Nginxの決まり事で上記の設定は “http{}”のカッコの中に記述する必要があります。

カッコの外に書いてしまうとエラーとなりますので、indlude分も、http{}に入るように記述します。

Nginxをテスト起動する

設定が完了したら、ほんとに大丈夫かテストしてみます。

sudo nginx -t

でNginxの設定ファイルに間違いがないかチェックが出来ます。

今記述したものをテストしてみて問題なければ、「Successfully」という表示が出てきます。

問題なければ

sudo nginx -s reload

でnginxを再起動。設定ファイルを改めて読み込ませます(設定を変更しただけでは読みこない)。

unicorn.rbを作成する

これまでの説明に何度か出てきたunicorn.rbを作成します。

unicorn.rbの内容は下記です。

## はじめに NginxとUnicornでRailsサーバーを構築する必要が出てきたので、その時のメモを残しておきます。 この後Nginxと接続に関する記事を書いて、最終的にCapistranoでアップする手順を記載します。 #...

こちらの内容を参照しています。Nginx仕様に若干変更しております。

# Railsのルートパスを求める。(RAILS_ROOT/config/unicorn.rbに配置している場合。)
rails_root = File.expand_path('../../', __FILE__)
# RAILS_ENVを求める。(RAILS_ENV毎に挙動を変更したい場合に使用。今回は使用しません。)
# rails_env = ENV['RAILS_ENV'] || "development"

# 追記に記載してます。入れた方がいいです。
ENV['BUNDLE_GEMFILE'] = rails_root + "/Gemfile"

# Unicornは複数のワーカーで起動するのでワーカー数を定義
# サーバーのメモリなどによって変更すること。
worker_processes 2

# 指定しなくても良い。
# Unicornの起動コマンドを実行するディレクトリを指定します。
# (記載しておけば他のディレクトリでこのファイルを叩けなくなる。)
working_directory rails_root

# 接続タイムアウト時間
timeout 30

# Unicornのエラーログと通常ログの位置を指定。
stderr_path File.expand_path('../../log/unicorn_stderr.log', __FILE__)
stdout_path File.expand_path('../../log/unicorn_stdout.log', __FILE__)

# Nginxで使用する場合は以下の設定を行う(※このパスをNginx側で設定したパスと揃えておく必要があります)。
listen File.expand_path('../../tmp/sockets/unicorn.sock', __FILE__)
# とりあえず起動して動作確認をしたい場合は以下の設定を行う。
#listen 8080
# ※「backlog」や「tcp_nopush」の設定もあるけど、よくわかって無い。

# プロセスの停止などに必要なPIDファイルの保存先を指定。
pid File.expand_path('../../tmp/pids/unicorn.pid', __FILE__)

# 基本的には`true`を指定する。Unicornの再起動時にダウンタイムなしで再起動が行われる。
preload_app true
# 効果なしとの記事を見たので、コメントアウト。
# GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true

# USR2シグナルを受けると古いプロセスを止める。
# 後述するが、記述しておくとNginxと連携する時に良いことがある。
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
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

Redmineを起動してみる

sudo bundle exec unicorn_rails -c config/unicorn.rb -l 3000 -E production &

でRedmineを起動します。

特にエラーが出なければ、「aaa.com:3000」とポート指定してアクセスすると、Redmineの画面が見えるはず…。

Redmineの画面が表示できない場合は…。

上記私の環境で実行したもので、一般性がない可能性が高いです。

動かない場合は、エラーをみて潰していくしか無いのですが(私もいくつもサイトを見て参照していきました…)。

その際のポイントですが。

エラーログの場所は確認しておきましょう。

上記の設定だと

  • Nginxのエラーログ:/var/log/nginx/redmine_error.log
  • Unicornのエラーログ:/usr/local/app/redmine-3.4.2/log/unicorn_stderr.log
  • Redmineのエラーログ:/usr/local/app/redmine-3.4.2/log/production.log

これもあくまで「自分で」設定ファイル等にしたパスになるので、一般性は無いのですが。

うまく動かない時は、このログを見るとどこでエラーが起きているか判別可能です。

慣れないとつまずくこともると思いますが、エラーをひとつずつ潰していけば起動するはず…です。

スポンサーリンク

シェアする

フォローする

スポンサーリンク