本稿は、Ruby on Rails を学ぶためのチュートリアルページである Rails ガイドの「Rails をはじめよう」のページを Vagrant の CentOS 7 マシン上で動かしてみようと試みた際に筆者がハマった点を踏まえ、CentOS 7 に Ruby をインストールし、Ruby on Rails アプリケーションを作成・起動するまでの手順(Rails をはじめよう の 4.1 節まで)について解説します。
対象読者
本稿は、以下のような読者を対象としています。
本稿の対象読者
- Ruby on Rails をこれから勉強しようと思っている方
- Ruby on Rails アプリケーションを CentOS 7 で動かそうと考えている方
主な内容
本稿では、次のような手順で Rails アプリケーションを起動するところまでを解説します。
本稿の主な内容
- Firewalld / SELinux を無効にする
- CentOS 7 に Ruby をインストールする
- Ruby on Rails ライブラリをインストールする
- Ruby on Rails アプリケーションを作成する
- Ruby on Rails アプリケーションを起動する
前提となる CentOS 7 の環境
説明を進めるにあたり、前提となる CentOS 7 の環境について記します。
項目 | 設定内容 |
---|---|
インストールイメージ | CentOS公式が Vagrant 用に提供しているイメージ (参考) |
IPアドレス | 192.168.33.10 |
Vagrant で CentOS 7 のバーチャルマシンを構成するための設定ファイルである Vagrantfile は次のように設定しています。
Vagrant.configure("2") do |config|
config.vm.box = "centos/7"
config.vm.network :private_network, ip: "192.168.33.10"
end
Firewalld, SELinux を停止させる
それでは、ここからが本題です。本稿では学習や動作確認のために CentOS 7 で Ruby on Rails アプリケーションを起動させることを目的としています。 さっそく Ruby や Rails のインストールといきたいところですが、後ほど作成する Ruby on Rails サーバーの動作を Firewalld や SELinux が邪魔してしまうことがあるので、まずは CentOS 7 上で動作している Firewalld や SELinux を停止させます。 (インターネットに接続されたマシンで Ruby on Rails アプリケーションを動かす場合は、しっかり Firewalld や SELinux の設定を設計してください)
SELinux の一時無効化
CentOS 7 では意図しないプログラムの動作を防ぐために SELinux が有効になっている場合があり、それが動作を妨げてしまう場合があります。 まずはご使用の CentOS 7 の SELinux の状態を確認しましょう。 SELinux の状態は getenforce コマンドで確認することができます。
$ getenforce
Enforcing
上の実行結果のように Enforcing と表示された場合は SELinux が有効になっていることを表しています。 SELinuxを動かしたままアクセス制限をさせないモード「permissive」にするには setenforce 0 コマンドを実行します。 (マシンを再起動すると有効に戻ってしまいますので注意してください)
$ sudo setenforce 0
$ getenforce
Permissive
Firewalld の停止
またファイアウォール機能のサービスである firewalld が起動されている場合もあり、後で作成する Ruby on Rails アプリケーションへのアクセスを遮断してしまう場合があります。 まずは、次の例のように systemctl status firewalld コマンドでサービスの状況を確認します。
$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since 水 2019-05-01 13:20:53 JST; 2s ago
Docs: man:firewalld(1)
Main PID: 15365 (firewalld)
CGroup: /system.slice/firewalld.service
└─15365 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
上の実行結果の例のように Active が active (running) となっている場合は有効になっています。 その場合は次の例のように systemctl stop firewalld コマンドで停止させます。
$ sudo systemctl stop firewalld
$ sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
Ruby のインストール
それでは次に Ruby をインストールします。 CentOS 7 に Ruby をインストールする方法はいくつかありますが、別稿「RubyをCentOSにインストールする4つの方法」などで解説しているように、rbenv と ruby-build を利用して Ruby をインストールするのが便利ですので、rbenv と ruby-build を利用してインストールします。 インストール手順の詳しい解説は次の記事にあるため、本稿では詳しい解説は割愛し、必要なコマンドを示します。
gitのインストール
まずは rbenv の取得に必要になる git を yum でインストールします。 (次の例の実行結果では git 1.8.3.1 がインストールされました)
$ sudo yum -y install git
$ git --version
git version 1.8.3.1
rbenvのインストール
続いて、現在ログイン中のユーザ用に rbenv をインストールします。 rbenv の git リポジトリから clone します。
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/vagrant/.rbenv'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 2759 (delta 4), reused 8 (delta 4), pack-reused 2744
Receiving objects: 100% (2759/2759), 528.92 KiB | 431.00 KiB/s, done.
Resolving deltas: 100% (1724/1724), done.
インストール(clone)された rbenv の bin ディレクトリにパスを通し、またターミナルログイン時に rbenv を初期化するための処理を .bash_profile に追加するためのコマンドを追加します。
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
これで rbenv のインストールは完了です。 ターミナルを立ち上げ直して(ログインし直して)、rbenv コマンドを実行してみましょう。 次のようにインストールされた rbenv のバージョンと利用方法が表示されればOKです。
$ rbenv
rbenv 1.1.2-2-g4e92322
Usage: rbenv <command> [<args>]
(以下略)
ruby-buildのインストール
続いて rbenv install コマンドで Ruby をコンパイルしてインストールできるようにするための rbenv プラグイン「ruby-build」をインストールします。次のコマンドにより plugins ディレクトリに ruby-build がインストール(clone)されます。
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
Cloning into '/home/vagrant/.rbenv/plugins/ruby-build'...
remote: Enumerating objects: 38, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 9750 (delta 14), reused 29 (delta 8), pack-reused 9712
Receiving objects: 100% (9750/9750), 2.08 MiB | 1.25 MiB/s, done.
Resolving deltas: 100% (6340/6340), done.
Rubyをコンパイルするために必要なソフトウェアのインストール
さっそく Ruby をインストールしたいところですが、Ruby をインストール(コンパイル)するにあたり予め必要なソフトウェアがあるため、インストールしておきます。 gcc, make, openssl-devel, readline-devel が必要になりましたので yum でインストールしておきます。
$ sudo yum -y install gcc make openssl-devel readline-devel
Rubyのインストール
それでは Ruby をインストールしてみましょう。 rbenv では様々な種類の Ruby をインストールすることができます。 インストールすることができる Ruby は rbenv install -l コマンドで確認することができます。
$ rbenv install -l
Available versions:
1.8.5-p52
1.8.5-p113
(中略)
2.6.0-dev
2.6.0-preview1
2.6.0-preview2
2.6.0-preview3
2.6.0-rc1
2.6.0-rc2
2.6.0
2.6.1
2.6.2
2.6.3
2.7.0-dev
ここでは2019年05月現在で一番新しい安定バージョンである Ruby 2.6.3 をインストールしてみます。 次のように rbenv install コマンドに、インストールしたいバージョンを指定してインストールします。 インストールには時間がかかりますので、完了するのを焦らずに待ちましょう。
$ rbenv install 2.6.3
Downloading ruby-2.6.3.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.3.tar.bz2
Installing ruby-2.6.3...
Installed ruby-2.6.3 to /home/vagrant/.rbenv/versions/2.6.3
インストールが完了したら、今インストールしたバージョンの Ruby をデフォルトで利用するように指定してあげます。
$ rbenv global 2.6.3
最後に Ruby 2.6.3 が利用できるようになったことを確認するため、ruby -v コマンドを実行します。 バージョン番号が表示されればOKです。
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
ここまでで、前述の Rails ガイドの「Rails をはじめよう」の 3.1 の Ruby のバージョンの確認が終わったことになります。
Ruby on Rails ライブラリをインストールする
続いて Ruby on Rails のインストールです。 Ruby on Rails は Ruby 言語のためのライブラリリポジトリである Ruby Gems で提供されています。 gem install コマンドに rails を指定することでインストールできます。
$ gem install rails
Ruby on Rails のインストールが完了すると rails コマンドが利用できるようになり、rails –version コマンドでインストールされた Ruby on Rails のバージョンを確認することができます。
$ rails --version
Rails 5.2.3
Ruby on Rails アプリケーションを作成する
次に Ruby on Rails アプリケーションのプロジェクトを作成します。 新規にプロジェクトを作成するには rails new [プロジェクト名] コマンドを利用します。 このプロジェクト作成のコマンドを実行すると、必要最低限のライブラリを自動的に収集・インストールしてくれますが、その必要なライブラリに SQLite3 があり、SQLite3 のライブラリをインストールしようとした際に次のようなエラーが表示されてプロジェクトが作成できませんでした。
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /home/vagrant/.rbenv/versions/2.6.3/lib/ruby/gems/2.6.0/gems/sqlite3-1.4.1/ext/sqlite3
/home/vagrant/.rbenv/versions/2.6.3/bin/ruby -I /home/vagrant/.rbenv/versions/2.6.3/lib/ruby/2.6.0 -r ./siteconf20190501-1719-16yidd9.rb extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
原因は CenOS 7 に sqlite-devel がインストールされていないためです。 上のエラーメッセージ内にあるように、yum で sqlite-devel をインストールしておきましょう。
$ sudo yum -y install sqlite-devel
なお、パッケージ sqlite 自体は元々 CentOS 7 にデフォルトでインストールされていたので、次のように sqlite3 –version コマンドでインストール済みの SQLite のバージョンを確認することができました。
$ sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
これで Rails アプリケーションのプロジェクトを作れるようになりましたので、ここでは blog というプロジェクトを作成するように、次の例のように rails new [プロジェクト名] コマンドを実行します。
$ rails new blog
Ruby on Rails アプリケーションを起動する
作成した Rails アプリケーションを起動してみましょう。 まずは作成した blog アプリケーションのフォルダに移動します。
$ cd blog
そして Rail アプリケーションを起動しようと試みましたが、次のようなエラーが出てしまいましたので、それぞれ対処してきます。
アプリケーション起動時に表示されたエラー
作成した Rails アプリケーションを起動しようとすると次のようなエラーメッセージが表示されました。 まずは JavaScript Runtime が見つからないという旨のエラーです。
Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
また、 g++ のコマンドがないという旨のエラーです。 コンパイラーをインストールする必要があります。
compiling mini_racer_extension.cc
make: g++: Command not found
make: *** [mini_racer_extension.o] Error 127
make failed, exit code 2
対応コマンド
上のエラーに対応するため、以下を実施します。 まずはファイル Gemfile を開き、次のように mini_racer の行のコメントを外します。 CentOS 7 には JavaScript Runtime がインストールされていないので、 MiniRacer という JavaScript ランタイム(とのブリッジ)を利用するようにします。
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'mini_racer', platforms: :ruby
また次のように gcc-c++ という c++ コンパイラをインストールします。
$ sudo yum -y install gcc-c++
Rails アプリケーションの起動
これでチュートリアルページにある通りに Rails アプリケーションを起動できます。 bundle install で依存ライブラリをインストールします。
$ bundle install
そして rails server コマンドで Rails アプリケーションを起動します。 本稿では上記の通り localhost ではなく 192.168.33.10 というIPアドレスのマシンで rails アプリケーションを起動しますので、起動オプションに -b 0.0.0.0 というオプションをつけます。
Ruby on Rails アプリケーションのサーバーを起動する。
$ rails server -b 0.0.0.0
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
-b 0.0.0.0 オプションを付けずに起動すると、localhost以外からのアクセスを受け付けないため注意が必要です。
上のように Rails アプリケーションが起動できたら、http://192.168.33.10:3000 にアクセスします。 するとデフォルトの画面が表示されるでしょう。
おわりに
Rails アプリケーションは起動することができたでしょうか? CentOS 7 固有の理由により、チュートリアルに記述されているだけのコマンドでは Rails アプリケーションを起動することができませんでしたので、少しだけ手間取ってしまいました。 本稿は同じような状況の人の役に立てれば幸いです。