Ruby on Rails で開発中の Web サイトを本番用のサーバで動かそうとしたらだいぶハマったのでメモ。
ちょっと実際の作業内容と記述が前後してしまったし、いろいろ試したりメモが抜けてたりするので忘れてる工程があるかもしれない。
基本的には DigitalOcean のチュートリアル通りとなる。
How To Deploy a Rails App with Passenger and Apache on Ubuntu 14.04 | DigitalOcean
バージョンは Ubuntu 14.04, Apache 2.4.7, Ruby 2.1.5, Rails 4.1.7 です。
Ruby のインストール
システムに入っている ruby が少し古かったのでソースからコンパイルする。
$ sudo apt-get update
$ sudo apt-get install build-essential libssl-dev libyaml-dev libreadline-dev openssl curl git-core zlib1g-dev bison libxml2-dev libxslt1-dev libcurl4-openssl-dev libsqlite3-dev sqlite3
$ mkdir ~/ruby
$ cd ~/ruby
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz
$ tar -xzf ruby-2.1.4.tar.gz
$ cd ruby-2.1.4
$ ./configure
$ make
$ sudo make install
$ sudo rm /usr/bin/ruby
$ sudo ln -s /usr/local/bin/ruby /usr/bin/ruby
$ rm -rf ~/ruby
Apache + Passenger のインストール
Apache は既に 2.4 がインストール済みなので省略。確か普通に apt-get install apache2 とかしたと思う。
問題があったのは Passenger のインストール。最初は他の Web サイトを参考に gem install passenger から passenger-install-apache2-module を行おうとしたのだけど、上手くインストール出来なかった。
passenger-install-apache2-module 実行時に以下のようなメッセージが出る。
Installation instructions for required software
* To install Apache 2 development headers:
Please install it with apt-get install apache2-threaded-dev
* To install Ruby development headers:
Please install it with apt-get install ruby-dev
* To install Apache Portable Runtime (APR) development headers:
Please install it with apt-get install libapr1-dev
* To install Apache Portable Runtime Utility (APU) development headers:
Please install it with apt-get install libaprutil1-dev
必要なパッケージが無いので apt-get install してね、という事だろう。
この通りに apache2-threaded-dev などをインストールしようとすると以下のようなエラーメッセージが出る。
The following packages have unmet dependencies:
apache2-dev : Depends: libapr1-dev but it is not going to be installed
Depends: libaprutil1-dev but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
libapr1-dev などはインストールされているがバージョンが合わない為利用できないっぽい。apt-get install libapr1-dev=VERSION などとバージョン指定してやったら関連するパッケージが消えた。Apache も消えた。バージョンを落とせば入る、が Rails の為だけにバージョンを落とせないのでこの方法は諦めた。
一度バージョン指定して apt-get install すると apt-get upgrade とかしても新しいの入らないのかなんだか動きがよくわかってないが、一度 apt-get remove してから apt-get install すると元に戻ったっぽい。
というわけで DigitalOcean の方法で Passenger をインストールする。
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
$ sudo vi /etc/apt/sources.list.d/passenger.list
# この行を追加する
deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main
$
$ sudo chown root: /etc/apt/sources.list.d/passenger.list
$ sudo chmod 600 /etc/apt/sources.list.d/passenger.list
$ sudo apt-get update
$ sudo apt-get install libapache2-mod-passenger
$ sudo a2enmod passenger
$ sudo service apache2 restart
apt で利用する sources.list に passenger を利用できるよう追加してから apt-get install する。一応、ubuntu はデフォルトの状態でも apt-get で passenger がインストールできたような気がするがわざわざ指定してあるということはコッチのほうが良いんだろう。
Apache の設定変更
passenger がインストールできたら Apache の設定を変更して Rails アプリを読み込めるようにする。
$ sudo vim /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
ServerName example.com
DocumentRoot /home/hoge/public_html/example.com/public
RailsEnv production
SetEnv SECRET_KEY_BASE 1234567890abcdef...
ErrorLog ${APACHE_LOG_DIR}/example.com.error.log
CustomLog ${APACHE_LOG_DIR}/example.com.access.log combined_ltsv
<Directory "/home/hoge/public_html/example.com/public">
Options FollowSymLinks
Require all granted
</Directory>
</VirtualHost>
RailsEnv で production と指定し、本番環境である事を知らせる。また、production 環境では SECRET_KEY_BASE がファイル内に記述されず環境変数を読み込むようになっているので SetEnv で指定してやる。
いれなかった場合以下のようなエラーが出る。
ERROR -- : app error: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml` (RuntimeError)
combined_ltsv は僕の趣味で出力を LTSV 形式にするための指定。
MySQL データベースの設定
何故か MySQL サーバのデフォルトの文字コードが utf-8 じゃなかったので my.conf を編集する。
[client]
default-character-set = utf8
[mysqld]
character_set_server=utf8
collation-server=utf8_general_ci
init-connect=SET NAMES utf8
[mysql]
default-character-set = utf8
編集したら再起動。
$ sudo service mysql restart
そうしたら本番の MySQL サーバに Rails で使うようのユーザとかデータベースとかを追加する。
$ mysql --host=localhost -u root -p
mysql> CREATE DATABASE rails_db
mysql> GRANT ALL ON rails_db.* to rails@localhost;
mysql> FLUSH PRIVILEGES;
mysql> SET PASSWORD FOR rails@localhost=password('password');
Rails アプリの設置
上記 Apache で指定した場所に Rails アプリを設置する。自分は同じサーバ上に git リポジトリを置いてあるので、git clone するだけ。
そうしたら必要なものをいれる。
$ git clone /path/to/repository.git .
$
$ sudo gem install --no-rdoc --no-ri rails
$ sudo bundle install
$ RAILS_ENV=production rake db:setup
$ rake assets:precompile
これで rails アプリが動くようになった。