インストール - Redmine

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

Redmineとは、課題管理や情報共有の機能を備えるプロジェクト運営を支援するためのオープンソースソフトウェアである。
誰でも自由にRedmineをダウンロードし、インストールして利用することができる。

Webアプリケーションとして動作するシステムであるため、Redmineが稼働している環境があり、Webブラウザがあれば、他にソフトウェアをインストールすることなく使用できる。
また、情報が1ヶ所に集約されていますので、どこからでもアクセスでき、複数のメンバでも使用することもできる。

Redmineは、ソフトウェア開発プロジェクトとの親和性が高く、SubversionやGit等のバージョン管理システムと連携できる。
Redmine自体の開発プロジェクトもRedmineで管理されており、他のソフトウェアでも利用されている。

Redmineが役立つ場面はソフトウェア開発だけではなく、様々な種類の事業プロジェクト、イベント開催、組織の日常的なタスク管理、顧客の問い合わせ対応の管理、社内業務フローの運用等、広範囲に活用できる。

現代の業務環境では、タスクの管理やチーム内のコミュニケーションを効率的に行うことが求められるため、
特にリモートワークの普及や複数のチームとの協業が当たり前となる中において、適切なツールの導入は業務の質を大きく向上させる要因となる。

Redmineはそのような状況に最適なツールである。


Redmineの主な機能

  • チケット
    Redmineの中核機能は、チケットを使用した課題や問題の追跡管理機能である。
    やるべき作業をチケットとして登録する。
    課題、タスク、バグ等のしなければならない物事をチケットに登録して、作業を進めたらチケットを更新する。
    チケットには担当者や期日を設定できるため、誰がどのタスクをいつまでにしなければならないのか、ひと目でわかるようになる。


  • ガントチャート
    プロジェクトを管理するために、課題を細かい作業単位に分け、全体の作業の流れと進捗を視覚的につかめるように並べた図をガントチャートと呼ぶ。
    Redmineはガントチャート機能を備えている。
    チケットを登録する時に開始日と期日を入力すると、チケットが自動的にガントチャートに反映され、作業の順番、予定、進捗がひと目で確認できるようになる。


  • Wiki
    プロジェクトや組織に関する文書やメモ等、用途を問わず作成できる。
    複数のページを作成して、ページを相互にリンクすることも簡単にできる。
    また、編集履歴が残るため、比較や復元も容易にできる。


  • バージョン管理システムの連携
    SubversionやGit等のバージョン管理システムと連携できる。
    コミットの履歴やリポジトリ内のファイルに内容等がRedmineの画面で参照できる。
    ソフトウェア開発やシステム開発のプロジェクトを運営するときに便利な機能である。



Rubyのインストール

Rubyのインストールについては、インストール - Rubyのページを参照すること。


Redmineのインストール

一般的に、最新のRedmineをインストールする。
Redmineは、6ヶ月ごとに新しいバージョンがリリースされており、実用的でかつ安定している。
リポジトリのtrunkからチェックアウトした開発版は、Ruby on Railsに精通し、かつ最新の開発に追従する必要がない限りは非推奨である。

また、trunkは正常に動作しないこともあるため、注意が必要である。

Redmineのインストール

Redmineの公式Webサイトにアクセスして、Redmineをダウンロードする。
ダウンロードしたファイルを展開して、任意のディレクトリに配置する。

空のデータベースとユーザの作成

  • MySQLの場合
CREATE DATABASE redmine CHARACTER SET utf8mb4;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY '<パスワード>';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';

※ MySQL 5.5.2以前の場合、utf8mb4ではなくutf8を指定すること。


  • PostgreSQLの場合
CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD '<パスワード>' NOINHERIT VALID UNTIL 'infinity';
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;


データベースの接続の設定

Redmineのインストールディレクトリにあるconfig/database.example.ymlファイルをコピーして、config/database.ymlファイルを作成する。
次に、config/database.ymlファイルを編集して、"production"環境用のデータベースの設定を行う。

  • MySQLの場合
production:
  adapter: mysql2
  database: <上記で作成したデータベース名  例. redmine>
  host: <上記で指定したホスト名  例. localhost>
  port: <ポート番号  例. 3306>
  username: <上記で作成したユーザ名  例. redmine>
  password: "<MySQLにおけるredmineユーザのパスワード>"
  encoding: utf8mb4
  pool: 5
  schema_search_path: public
  socket: <MySQLのソケットファイルのフルパス>


  • PostgreSQLの場合
production:
  adapter: postgresql
  database: <上記で作成したデータベース名  例. redmine>
  host: <上記で指定したホスト名  例. localhost>
  username: <上記で作成したユーザ名  例. redmine>
  password: "<PostgreSQLにおけるredmineユーザのパスワード>"
  encoding: utf8
  schema_search_path: <データベーススキーマ (デフォルト: public)>
  socket: <PostgreSQLのソケットファイルのフルパス>


Redmineに依存するソフトウェアのインストール

MySQL等を使用する場合、mysql2をインストールするために、~/.profileファイル等へMySQLへの環境変数PATHを追記する必要がある。

vi ~/.profile


# ~/.profileファイル

export PATH="/<MySQLのインストールディレクトリ>/bin"


Redmineは、RubyGemの依存関係を管理するために、Bundlerを使用している。
そのため、まず、Bundlerをインストールする。

gem install bundler
または
sudo gem install bundler


Redmineのインストールディレクトリに移動して、Redmineの実行に必要な全てのgemをインストールする。

bundle config set --local without 'development test'
bundle install
または
sudo bundle config set --local without 'development test'
sudo bundle install


データベースアダプタ

Redmineは、データベースの設定ファイルであるconfig/database.ymlファイルを読み取り、必要なデータベースアダプタを自動的にインストールする。
(例. mysql2のみを使用するように設定した場合は、mysql2 gemのみがインストールされる)
もし、config/database.ymlファイルを編集してデータベースアダプタの追加や削除を行った後は、必ず、bundle install --without development test ...略を実行する。

独自の依存関係の設定 (Gemfile.local)

もし、Redmine本体が使用しないgem(例. puma、fcgi)もロードする場合は、Gemfile.localファイルをRedmineのインストールディレクトリに作成する。
これは、bundle installコマンド実行時にインストールされる。

# Gemfile.localファイル

gem 'puma'


セッションストア秘密鍵の生成

Railsはセッションハイジャックを防ぐため、セッション情報を格納するcookieをエンコードしている。
この処理で使用されるランダムなキーを生成する。

bundle exec rake generate_secret_token


また、秘密鍵は、config/secrets.ymlファイルに格納することもできる。

データベースのテーブル等の作成

データベースに、Redmineに必要なテーブルを作成する。

Redmineのインストールディレクトリに移動して、以下に示すコマンドを実行する。
これにより、マイグレーションが1つずつ実行およびテーブルが作成されて、更に権限のデータ一式と管理者アカウント(admin)が作成される。

RAILS_ENV=production bundle exec rake db:migrate


デフォルトデータ

デフォルトデータをデータベースに追加する。

RAILS_ENV=production bundle exec rake redmine:load_default_data


各言語のデフォルトデータにおいて、言語の選択が求められる。
なお、上記のコマンドにおいて、REDMINE_LANGオプションを指定する場合、言語の選択を求められることなく自動的に処理が進められる。

RAILS_ENV=production REDMINE_LANG=en bundle exec rake redmine:load_default_data


ディレクトリおよびファイルのパーミッション

Redmineを実行するOSのユーザーは、以下に示すディレクトリの書き込み権限が必要である。

  • files (添付ファイルの保存ディレクトリ)
  • log (Redmineのログファイル @production.log@)
  • tmp (これらのディレクトリが無ければ作成すること)
  • tmp/pdf (これらのディレクトリが無ければ作成すること)
  • public/plugin_assets (プラグインが使用する画像やCSS)


例. redmineユーザとしてソフトウェアを実行する場合
mkdir -p tmp tmp/pdf public/plugin_assets
chown -R redmine:redmine files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets

※注意
これらのディレクトリが既に存在する場合(バックアップからリストアした場合等)、ファイルに実行権限が不可されていないことを確認する。
find files log tmp public/plugin_assets -type f -exec chmod -x {} +


Redmineの起動

WEBrickを使用してRedmineを起動する。

bundle exec rails server -e production


WEBrickが正常に起動した後、Webブラウザから http://localhost:3000/ にアクセスする。

デフォルトのシステム管理者アカウントは、以下の通りである。

  • ログインID
    admin
  • パスワード
    admin


※注意
WEBrickは開発時に使用すものであり、通常の運用には適していないため、動作確認以外には使用しないこと。
本番運用においては、Passenger(mod_rails)、FCGI、Rackサーバ(Unicorn, Thin, Puma,hellip等)の使用を推奨する。


NginXとの連携

NginXのインストール

NginXのビルドに必要なライブラリをインストールする。

sudo zypper install libxslt-devel pcre2-devel gd-devel
                    libcurl-devel               # Passengerを使用する場合
                    kernel-source kernel-devel  # AIOを使用する場合


必要ならば、OpenSSLの公式Webサイトにアクセスして、OpenSSL(1.X.Y)のソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf openssl-<バージョン>


  • Digest認証モジュールを使用する場合
    NginXのソースコードと一緒に配布されていないため、別途インストールする必要がある。
    Digest認証モジュールのGithubにアクセスして、ソースコードをダウンロードする。
    ダウンロードしたファイルを解凍する。
    tar xf nginx-http-auth-digest-<バージョン>.tar.gz

    または、git cloneコマンドを実行して、ソースコードをダウンロードする。
    git clone https://github.com/atomx/nginx-http-auth-digest.git


NginXの公式Webサイトにアクセスして、NginXのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf nginx-<バージョン>.tar.xz


NginXおよびNginX向けPassangerをビルドおよびインストールする。

passenger-install-nginx-module


手順が表示されるので、[Enter]キーを押下して次へ進む。
ビルド環境の選択では、[Ruby]を選択して、[Enter]キーを押下する。

NginXのソースコードがあるディレクトリを入力して、[Enter]キーを押下する。
次に、NginXのインストールディレクトリを入力して、[Enter]キーを押下する。

最後に、configureスクリプトのオプションを、以下に示すように指定する。
改行文字(\)が使用できないことに注意する。

--sbin-path=/<NginXのインストールディレクトリ>/sbin/nginx --conf-path=/<NginXのインストールディレクトリ>/etc/nginx.conf --pid-path=/<NginXのインストールディレクトリ>/nginx.pid --modules-path=/<NginXのインストールディレクトリ>/modules/ --error-log-path=/<NginXのインストールディレクトリ>/log/error.log --http-log-path=/<NginXのインストールディレクトリ>/log/access.log --lock-path=/<NginXのインストールディレクトリ>/nginx.lock --http-client-body-temp-path=/<NginXのインストールディレクトリ>/tmp --http-proxy-temp-path=/<NginXのインストールディレクトリ>/proxy --http-fastcgi-temp-path=/<NginXのインストールディレクトリ>/fastcgi --http-uwsgi-temp-path=/<NginXのインストールディレクトリ>/uwsgi --http-scgi-temp-path=/<NginXのインストールディレクトリ>/scgi --with-perl_modules_path=/<NginXのインストールディレクトリ>/Perl --with-threads --with-file-aio --with-pcre --with-pcre-jit --with-http_v2_module --with-http_ssl_module --with-http_addition_module --with-http_realip_module --with-http_flv_module --with-http_random_index_module --with-http_degradation_module --with-http_slice_module  --with-http_dav_module --with-http_mp4_module --with-http_xslt_module --with-http_xslt_module=dynamic --with-http_image_filter_module --with-http_image_filter_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_secure_link_module --with-http_stub_status_module --with-http_sub_module --with-http_perl_module --with-http_perl_module=dynamic --with-mail --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-compat --user=<任意のユーザ名  例. nginx> --group=<任意のグループ名  例. nginx> --add-module=<Digest認証モジュールのソースコードがあるディレクトリ>


Passengerのビルドが開始する。
ビルドに成功した時、Passengerを組み込まれたnginx.confの設定が表示される。

 http {
   # ...略
 
   passenger_root /<NginX向けPassangerのインストールディレクトリ>/passenger-6.0.17;
   passenger_ruby /<Rubyのインストールディレクトリ>/bin/ruby-3_0;
 
   # ...略
 }


NginXの設定

NginXの設定ファイル(nginx.conf)において、httpディレクティブに、上記の設定が記述されているか確認する。

vi nginx.conf


 # nginx.confファイル
 
 http {
   # ...略
 
   passenger_root /<NginX向けPassangerのインストールディレクトリ>/passenger-6.0.17;
   passenger_ruby /<Rubyのインストールディレクトリ>/bin/ruby-3_0;
 
   # ...略
 }


仮想ホストの構築

NginXの設定ファイル(nginx.conf)において、httpディレクティブに、以下に示す設定を記述する。

vi nginx.conf


 # nginx.confファイル
 
 http {
   # ...略
 
   include /<NginXのインストールディレクトリ>/etc/conf.d/*.conf;
   include /<NginXのインストールディレクトリ>/etc/vhosts.d/*.conf;
 
   # ...略
 }


次に、NginXの仮想ホストファイルを作成する。

vi /<NginXのインストールディレクトリ>/etc/vhosts.d/redmine.conf


 # /<NginXのインストールディレクトリ>/etc/vhosts.d/redmine.confファイル
 
 # Ruby Application server Unicorn
 upstream redmine {
    server unix:/<Redmineのインストールディレクトリ>/tmp/sockets/unicorn.sock;
 }
 
 server {
    listen       80;
    server_name  redmine;
    root         /<Redmineのインストールディレクトリ>/public;
 
    passenger_enabled on;
 
    client_max_body_size  10m; # Max attachemnt size
 
    # for redmine + unicorn
    location / {
        alias /<Redmineのインストールディレクトリ>/public;
        try_files $uri/index.html $uri.html $uri @redmine;
    }
 
    location @redmine {
        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;
    }
 
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
 }


httpsの使用

自己証明書を作成する。

  • 秘密鍵の作成(パスフレーズなし)
    ファイル名: server.key
    openssl genrsa -out server.key 2048

  • 証明書署名要求(CSR: Certificate Signing Request)の作成
    ファイル名: server.csr
    openssl req -utf8 -new -key server.key -out server.csr
    以下に示す項目を入力する。

    Country Name (2 letter code) [XX]: <--- 国(ジャップならばJP)
    State or Province Name (full name) []: <--- 県
    Locality Name (eg, city) [Default City]: <--- 市
    Organization Name (eg, company) [Default Company Ltd]: <--- 会社・組織
    Organizational Unit Name (eg, section) []: <--- 部門(未入力可)
    Common Name (eg, your name or your server's hostname) []:alfa.torutk.com <--- サーバドメイン名(未入力可)
    Email Address []: <--- 管理者メール(未入力可)
    Please enter the following 'extra' attributes to be sent with your certificate request
    A challenge password []: <-- (未入力可)
    An optional company name []: <-- (未入力可)

  • ubject Alternative Name(SAN)情報の作成
    ファイル名: san.txt
    まず、最近のWebブラウザでは、Subject Alternative Name(SAN)を含めないとアクセスができないため、SAN情報をテキストファイルに記述する。
    また、ワイルドカードを使用して、複数のホスト名に対応させることもできる。
    vi san.txt

    # san.txtファイル
    subjectAltName = DNS:*.torutk.com

  • 自己署名証明書の作成
    ファイル名: server.crt
    openssl x509 -in server.csr -out server.crt -extfile san.txt -req -signkey server.key -days 3650


上記で作成した秘密鍵と自己署名証明書を、任意の場所に配置する。

  • server.key
  • server.crt


Nginx設定ファイルの作成または編集する。

vi nginx.conf


 # nginx.confファイル
 
 upstream unicorn {
    server unix:/<Redmineのインストールディレクトリ>/tmp/unicorn.sock;
 }
 
 server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
 
    return 301 https://$host$request_uri;
 }
 
 server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name _;
    root /<Redmineのインストールディレクトリ>/public;
 
    ssl_certificate     "<自己署名証明書ファイルのパス  例. /etc/pki/nginx/server.crt">;
    ssl_certificate_key "<秘密鍵ファイルのパス  例. /etc/pki/nginx/private/server.key">;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 10m;
    ssl_ciphers PROFILE=SYSTEM;
    ssl_prefer_server_ciphers on;
 
    include <Nginxの設定ファイル群があるディレクトリ  例. /etc/nginx/conf.d/*.conf>;
 
    client_max_body_size 10m;
 
    location / {
        try_files $uri/index.html $uri.html $uri @redmine;
    }
 
    location @redmine {
        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;
    }
 
    error_page 404 /404.html;
        location = /40x.html {
    }
 
    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
 }



Apache2との連携

Phusion Passengerとは

Railsシステムを実行するためのApacheモジュールである。

メリット

Redmine等のRuby on RailsシステムをPhusion Passenger(mod_rails for Apache)を使用して、Apache上で稼働させる。
これにより、運用の簡素化、複数インスタンスを並列稼働させることによるレスポンスの改善が期待できる。

特徴

  • Apache2を起動するだけでRailsシステムが使用できる。
    Apache2のモジュールとして実装されており、別途デーモンを起動する必要が無い。
    Railsシステム用の起動スクリプトは不要である。
  • TCPポートを消費しない。
  • Railsシステムのデプロイが簡素化される。(PHPのように、ファイルのアップロードのみで出来る)
  • サーバのメモリが節約できる。
    Railsインスタンスは必要なタイミングで生成する。
    また、一定時間アクセスがなければ、インスタンスを終了させる。


手順

インストール手順は、次の通りである。

  • ビルドに必要なライブラリをインストールする。
  • Ruby向けにPassengerをインストールする。
  • Apache2向けのPassangerモジュールをビルドする。
  • httpd.confを変更する。
  • 仮想ホストとして構築する場合は、仮想ホストファイルを作成する。


ビルドに必要なライブラリのインストール

sudo zypper install libcurl-devel


Ruby向けPassengerのインストール

gem install passenger


Apache2向けPassangerモジュールのビルド

Apache2をソースコードからビルドおよびインストールしている場合、環境変数APXS2および環境変数PATHを手動で設定する必要がある。
これにより、Apache2のヘッダファイル、APRを探索してインストールすることができる。

# ~/.profileファイル

export APXS2=/<Apache2のインストールディレクトリ>/bin/apxs
export PATH=/<Apache2のインストールディレクトリ>/bin:$PATH


Apache2向けのPassangerモジュールをビルドする。

passenger-install-apache2-module


手順が表示されるので、[Enter]キーを押下して次へ進む。
ビルド環境の選択では、[Ruby]を選択して、[Enter]キーを押下する。
Passengerのビルドが開始する。

ビルドに成功した時、Passengerを組み込むためのhttpd.confの設定が表示される。

# 出力例

LoadModule passenger_module /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>/buildout/apache2/mod_passenger.so  
<IfModule mod_passenger.c>                                                                                                                          
  PassengerRoot /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>
  PassengerDefaultRuby /<Rubyのインストールディレクトリ>/bin/ruby
</IfModule>


Apache2の設定 (httpd.confファイルの変更)

Apache2の設定ファイル(httpd.conf)において、上記セクションに記述したPassengerを組み込むための設定を追記する。

 # httpd.confファイル (設定例)
 
 # ...略
 
  LoadModule passenger_module /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>/buildout/apache2/mod_passenger.so  
 <IfModule mod_passenger.c>                                                                                                                          
   PassengerRoot /<Rubyのインストールディレクトリ>/lib64/ruby/gems/<Rubyのバージョン>/gems/passenger-<Passengerのバージョン>
   PassengerDefaultRuby /<Rubyのインストールディレクトリ>/bin/ruby
 </IfModule>


仮想ホストとして構築する場合

 # vhost-redmine.confファイル (設定例)
 
 <VirtualHost *:80>
    ServerName  redmine
 
    # DocumentRoot: The directory out of which you will serve your
    # documents. By default, all requests are taken from this directory, but
    # symbolic links and aliases may be used to point to other locations.
    DocumentRoot /<Redmineのインストールディレクトリ>/public
 
    # if not specified, the global error log is used
    ErrorLog  /<Redmineのインストールディレクトリ>/log/redmine-error_log
    CustomLog /<Redmineのインストールディレクトリ>/log/redmine-access_log combined
 
    # don't loose time with IP address lookups
    HostnameLookups Off
 
    # needed for named virtual hosts
    UseCanonicalName Off
 
    # configures the footer on server-generated documents
    ServerSignature On
 
    # Redmineの画像ファイルおよびCSSファイル等へのアクセスを許可する設定
    # Apache 2.4のデフォルトではサーバ上の全ファイルへのアクセスが禁止されている
    <Directory "/<Redmineのインストールディレクトリ>/public">
        # Possible values for the Options directive are "None", "All",
        # or any combination of:
        #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        # Note that "MultiViews" must be named *explicitly* --- "Options All"
        # doesn't give it to you.
        #
        # The Options directive is both complicated and important.  Please see
        # http://httpd.apache.org/docs/2.4/mod/core.html#options
        # for more information.
        Options Indexes FollowSymLinks
 
        # AllowOverride controls what directives may be placed in .htaccess files.
        # It can be "All", "None", or any combination of the keywords:
        #   Options FileInfo AuthConfig Limit
        AllowOverride None
 
        # Controls who can get stuff from this server.
        Require all granted
    </Directory>
 </VirtualHost>



Unicornの設定

Unicornとは

Unicornは、Ruby on RailsアプリケーションのためのUnicorn Webサーバ(Rackサーバ)である。
HTTPサーバであり、高速かつスケーラブルなWebアプリケーションを提供することを目的としており、Redmineを効率的かつスムーズに実行するために使用される。

Unicornは、Unicorn WebサーバとRedmineを統合することにより、Redmineをよりスムーズかつ安定した方法で実行することができる。
これにより、Redmineを使用するユーザは、より優れたパフォーマンスと高い可用性を得ることができる。

Unicornのインストール

UnicornはRubyモジュール(gem)として提供されているため、bundlerでインストールする。
Redmineをインストールしたディレクトリに移動して、Gemfile.localファイルを作成する。

cd <Redmineのインストールディレクトリ>
vi Gemfile.local


# /<Redmineのインストールディレクトリ>/Gemfile.local

gem "unicorn"


Unicornをインストールする。

bundle update


単独起動

Unicornは、マスタープロセス1つにワーカープロセスが複数という構成で実行する。

Unicornを起動して、Redmineの動作を確認する。

bundle exec unicorn_rails -l 3000 -E production


Webブラウザから http://localhost:3000 にアクセスして、動作を確認する。

各オプションを、以下に示す。

  • --listen -l <[アドレス:]ポート>
    ソケットのエンドポイントを指定
  • --config-file -c <ファイル>
    設定ファイルを指定
  • -D
    デーモンプロセス起動指定
  • -E <RAILS_ENV>
    production等を指定


Unicornの終了手順を、以下に示す。

  • フォアグラウンドプロセスとして起動した場合
    [Ctrl] + [C]キーを同時押下して停止する。
  • デーモンプロセスとして起動した場合
    シグナルINT(強制終了)またはQUIT(グレースフル停止)をマスタープロセスに送信する。
    シグナルINTは、ワーカープロセスを終了させて自らも終了する。


設定ファイル(unicorn.rb)の作成

Redmineのインストールディレクトリに移動して、configディレクトリにunicorn.rbファイルを作成する。

cd /<Redmineのインストールディレクトリ>/config
vi unicorn.rb


 # /<Redmineのインストールディレクトリ>/config/unicorn.rb
 
 # -*- coding: utf-8 -*-
 # 応答性を良好に保つには、コア数以上のワーカーを指定する
 # ただし、仮想環境では、CPU使用率とメモリ使用量を見ながらワーカー数を許容範囲まで増やす
 worker_processes 2
 
 # リクエスト待ち受け口
 # TCPとUNIXドメインとが指定可能
 # 複数のプロトコルを列挙することで複数のプロトコルおよびポートを扱うことができる
 ## UNIXドメインソケットを使用する場合
 listen "/<Redmineのインストールディレクトリ>/tmp/sockets/unicorn.sock", :backlog => 32
 ## TCPソケットを使用する場合
 #listen 8080, :tcp_nopush => true
 
 timeout 30
 pid "/<Redmineのインストールディレクトリ>/tmp/pids/unicorn.pid"
 
 stderr_path '/<Redmineのインストールディレクトリ>/log/unicorn.stderr.log'
 stdout_path '/<Redmineのインストールディレクトリ>/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!
   # new master phase out the old master
   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|
   # Railsでpreload_appをtrueにしているときは必須
   defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
 end


  • listen
    • backlog
      ワーカーが作業中であっても、コネクションのリクエストを受理して待機しておくことができる個数である。
      デフォルトは、1024である。
      例えば、1件平均30[mS]で捌く処理に対して1000個バックログによる待ちがある時、新たにリクエストした処理は結果が返るまで30[S]待たされることになる。
      その場合、コネクションを受け付けずにエラーにした方がよいということがある。

    • tcp_nopush
      TCP_CORK(Linux)を制御する。
      デフォルトは、falseである。
      trueにする場合、TCPフレームの断片が小出しに送られることを抑止するため、リモートにあるNginXのタスクを早めに起こさずに済ませる。

  • timeout
    ワーカーがこの時間[秒]以上処理に費やす時はプロセスを落とす。
    デフォルトは、60秒である。
    大抵の処理は60秒以内に完了するが、それ以上に時間の掛かる処理がある場合は処理時間に応じて値を増やす。

    例えば、サイズの大きい添付ファイルのアップロードおよびダウンロードが該当する。
    添付ファイルのサイズ上限のファイルを実際にアップロードおよびダウンロードすることにより、それに掛かる時間を計測して、許容できる処理時間を設定する。

    ここで、Unicornのタイムアウト値とNginXのタイムアウト値が不整合だと動作が不安定となるため、両者のタイムアウト値を整合させるようにする。
    (例. Unicornのタイムアウト値 + αをNginXのタイムアウト値にする。この時、αは1〜2秒程度等)

  • pid
    Unicornを起動した時、そのプロセスIDを記録しておくファイルを指定する。

  • stderr_path および stdout_path
    Redmineのインストールディレクトリ下のlogディレクトリにログファイルを生成する。

  • preload_app
    trueに設定する場合、マスタープロセス起動時にアプリケーションをロードして、ワーカープロセスをフォークするとアプリケーションが実行可能となる。
    複数のワーカープロセスでコードを共有するため、メモリ使用効率が良くなる。
    デメリットは、ワーカープロセスを再起動してもアプリケーションはロードされないことである。

  • before_fork
    ワーカープロセスをフォークする前に、マスタープロセスによって呼ばれる。
    USR2シグナルで新旧マスタープロセスが共存する場合、旧マスタープロセスにQUITシグナルを送信して終了させる。

  • after_fork
    ワーカープロセスがフォークされた後に呼び出される。


Unicornの設定ファイルを使用して、Unicornを起動する。

cd /<Redmineのインストールディレクトリ>
bundle exec unicorn_rails -c config/unicorn.rb -E production


Unicornのサービスユニットファイルの作成

  • [Unit]セクション
    • Afterキー
      Redmine(Unicorn)は、起動時にデータベースに接続できない場合は、エラーとなる。
      そのため、mysql.serviceまたはmariadb.serviceを実行した後に、redmine-unicorn.serviceが起動するように順序を指定する。

  • [Service]セクション
    • Userキー および Groupキー
      起動プロセスの実行ユーザおよびグループを指定する。
      SystemdサービスでExecStartにより実行したプロセスの実行ユーザおよびグループをroot以外にする場合は指定する。

    • WorkingDirectory
      Redmineのインストールディレクトリを、実体パス(SELinuxを使用している場合は、シンボリックリンクは不可)で指定する。

    • PIDFile
      UnicornのプロセスIDファイルを、実体パス(SELinuxを使用している場合は、シンボリックリンクは不可)で指定する。

    • PermissionsStartOnly
      trueを指定する場合、UserキーおよびGourpを指定していたとしても、ExecStartPreキーの値は、root権限で実行される。


sudo vi /etc/systemd/system/redmine-unicorn.service


 # /etc/systemd/system/redmine-unicorn.serviceファイル
 
 [Unit]
 Description=Redmine Unicorn Server
 
 # MySQLおよびMariaDBを通常インストールした場合
 After=mysqld.service
 
 [Service]
 User=<ユーザ名>
 Group=<グループ名>
 WorkingDirectory=<Redmineのインストールディレクトリ>
 Environment=RAILS_ENV=production
 SyslogIdentifier=redmine-unicorn
 PIDFile=/<Redmineのインストールディレクトリ>/tmp/pids/unicorn.pid
 
 # MySQLおよびMariaDBを任意のインストールディレクトリにインストールした場合
 ExecStartPre=/<MySQLまたはMariaDBのインストールディレクトリ>/support-files/mysql.server start
 
 # Rubyを通常インストールした場合
 ExecStart=/<Rubyのインストールディレクトリ>/bin//bundle exec "/<Rubyのインストールディレクトリ>/unicorn_rails -c config/unicorn.rb -E production -D"
 
 # Rubyを任意のインストールディレクトリにインストールした場合
 ExecStart=/bin/bash -c "PATH=/<Rubyのインストールディレクトリ>/bin:$PATH /<Rubyのインストールディレクトリ>/bin/bundle exec /<Rubyのインストールディレクトリ>/bin/unicorn_rails -c config/unicorn.rb -E production -D"
 
 ExecStop=/usr/bin/kill -QUIT $MAINPID
 
 # MySQLおよびMariaDBを任意のインストールディレクトリにインストールした場合
 ExecStopPost=/<MySQLまたはMariaDBのインストールディレクトリ>/support-files/mysql.server stop
 
 ExecReload=/bin/kill -USR2 $MAINPID
 
 [Install]
 WantedBy=multi-user.target