Apache fcgidでRedmine

Apacheのmod_fcgidをつかってRedmineをホストする。
(Apache+mod_fcgidのインストールは済んでいる状態を想定)

Ruby

Redmineに必要なパッケージをbundler installするために必要なRubyをビルドする。

sudo yum install ruby-devel

wget -O ruby-2.4.1.tar.gz https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
tar zxf ruby-2.4.1.tar.gz
cd ruby-2.4.1

export CFLAGS="-fPIC"
./configure --disable-install-doc --prefix=${HOME}

make
make install

cd ../
export PATH=${HOME}/bin${PATH:+:}${PATH}

bundler

RubyGemsからbundlerをインストールする。

gem install bundler

Redmine

つづいてRedmineをダウンロードし必要なセット後、関連するモジュールをインストール、初期設定まで行う。

sudo yum install rubygem-nokogiri ImageMagick-devel sqlite-devel
gem install nokogiri

wget -O redmine-3.4.6.tar.gz http://www.redmine.org/releases/redmine-3.4.6.tar.gz
tar zxf redmine-3.4.6.tar.gz
cd redmine-3.4.6

cd config

# Databaseの設定
# 今回はSQLiteを使う
cat <<CONF > database.yml
# SQLite3 configuration
production:
  adapter: sqlite3
  database: db/redmine.sqlite3
CONF

# メール配信設定等
# 検証のため一旦空で作る
cat <<CONF > configuration.yml
production:
CONF

cd ../

# モジュールのインストール
bundler install --without development test --path vendor/bundle

# セッション用秘密鍵の生成
bundle exec rake generate_secret_token

# DB初期化
RAILS_ENV=production bundle exec rake db:migrate

# デフォルトデータの登録(お好みで)
RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

RedmineのFastCGI対応化

dispatch.fcgi

RedmineはそのままではPassengerを使ってホストすることを想定された作りになっている。
そのためFastCGIで動かすよう、FastCGIスクリプトを定義する。
とはいっても標準でサンプルが用意されているの今回はそれをそのまま利用する。

mv -iv public/dispatch.fcgi{.example,}

# 必要に応じてShebangをビルドしたRubyのパスに置き換える
_replace="s/^#\\!.*/#\\!${HOME//\//\\/}\\/bin\\/ruby/"
sed -ie ${_replace} public/dispatch.fcgi

mod_fcgid対応+ReWriteRule追加

上記で作成したdispatch.fcgiをfcgid-scriptをとして動作するよう設定する。
加えて、リクエストをすべてdispatch.fcgiに投げるよう、ReWriteRuleを設定する。
こちらもサンプルはpublic/htaccess.fcgi.exampleにあるのでこれを利用する。

mv -iv public/{htaccess.fcgi.example,.htaccess}

以下は各要点。

mod_fcgid対応.htaccess

# FollowSymLinksは最近では非推奨で、代わりにSymLinksIfOwnerMatchが推奨されている
Options +SymLinksIfOwnerMatch +ExecCGI
<IfModule mod_fcgid.c>
    AddHandler fcgid-script .fcgi
</IfModule>

ReWriteRule追加

RewriteRule ^$ index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
<IfModule mod_fastcgi.c>
    RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
</IfModule>
<IfModule mod_fcgid.c>
    RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
</IfModule>

bundlerでfcgiパッケージ追加

Redmineは普通に作るとPassangerモジュールを使うままになっており、FastCGIモジュールを読み込まない。
そのためGemfileに以下のエントリを記述し、再度bundler installする。

gem "fcgi"
# 事前にRubyGemsにfcgiを追加しておく必要はある
sudo yum install fcgi-devel
gem install fcgi

# bundlerでRedmineにfcgiを追加
bundler install --without development test --path vendor/bundle

RAILS_ENV = production設定

Apacheで.htaccess内においてSetEnvが使えればSetEnvでRAILS_ENVを設定する。
(SuEXECが有効になっている場合はこの機能が無効化されている)

SetEnv RAILS_ENV production

もしSetEnvが使えない場合には、dispatch.fcgiに以下のコードを、最初に実行される位置(3行目とか)に追記する。

ENV["RAILS_ENV"] = "production"

以上でRedmineのFCGI化は終了。
あとはredmine-x.y.z/publicをDocumentRootとなるようRedmineの配置+シンボリックリンクを貼ってやれば完成。

Redmine3.4.6のFCGIでもそんなに違和感ない速度で応答できているので、次回はXREAのレンタルサーバ上にRedmineをホストしてみる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です