「 Rails 」一覧

CentOS7でApache+PassengerのRails本番環境を構築する手順

Apache + PassengerでのRails本番環境を作成する手順についてまとめました。

前提

  • Vagrant のCentOS7.5イメージを利用する
  • Rails のアプリケションはgithub等のリモートリポジトリから取得する
  • Vagrant + Virtual Boxはインストール済みとする

環境

  • CentOS 7.5(Vagrant Box)
  • Ruby 2.5.3 (rbenv)
  • Rails 5.2.2
  • DBはMysql

手順

Vagrant環境構築

ホストOSの任意のディレクトリでCentOS7.5の仮想環境を構築します

$ vagrant init centos/7

Vagrantfileの以下の部分のコメントアウトを外し、ホストOSの8080番ポートをゲストOSの80番ポートにフォワードするようにします。

config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

仮想環境を起動してログインします。

$ vagrant up
$ vagrant ssh

CentOS7.5の構成

OSを更新します。

$ sudo yum -y update

SELinuxを無効化します。

/etc/selinux/configのSELINUXをdisabledにします。

SELINUX=disabled

OSを再起動します。

$ sudo reboot

rbenv で Ruby をインストール

まずはrbenvのインストールに必要な各種パッケージをインストールします。

$ sudo yum -y install git-all openssl-devel readline-devel sqlite gcc gcc-c++

続いて、rbenvをインストールします。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ echo 'gem: --no-ri --no-rdoc' > ~/.gemrc
$ source ~/.bashrc
$ rbenv --version
rbenv 1.1.1-39-g59785f6

rbenvがインストールできたら、Rubyをインストールします。

バージョンは、公開しようとしているRailsアプリケーションが指定しているバージョン(2.5.3)に合わせます。

$ rbenv install 2.5.3
$ rbenv global 2.5.3
$ ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]

bundlerもあわせてインストールします。

$ gem install bundler
$ bundle version
Bundler version 1.17.2 (2018-12-11 commit 43e950846)

Apacheのインストール

Apacheをインストールし、自動起動の設定を行います。

$ sudo yum -y install httpd httpd-devel curl-devel apr-devel apr-util-devel
$ sudo systemctl enable httpd

Passengerのインストール

Passengerをインストールします

$ sudo yum install -y epel-release pygpgme curl
$ sudo curl --fail -sSLo /etc/yum.repos.d/passenger.repo https://oss-binaries.phusionpassenger.com/yum/definitions/el-passenger.repo
$ sudo yum install -y mod_passenger

node.jsのインストール

Rails に必要なJavaScriptランタイムとしてnode.jsをインストールします。

なお、node.jsはEPELリポジトリから取得するため、Passengerのインストールの最初に実施しているepel-releaseのインストールが前提となっていますので注意してください。

$ sudo yum install -y nodejs

Mysqlのインストール

Mysqlをインストールします。

$ sudo yum install -y mariadb-server mariadb-devel
$ sudo systemctl enable mariadb
$ sudo systemctl start mariadb
$ sudo mysql_secure_installation

本番DBの作成

本番環境用のデータベースと接続ユーザを作成します。

以下の情報はRailsアプリケションのconf/database.yamlの内容と合わせます。

  • データベース名: prodution_db
  • 接続ユーザ: prod_user
  • パスワード: Password
$ mysql -u root -p

MariaDB [(none)]> CREATE DATABASE production_db DEFAULT CHARACTER SET utf8;

MariaDB [(none)]> GRANT ALL PRIVILEGES ON production_db.* TO prod_user@localhost IDENTIFIED BY 'Password' WITH GRANT OPTION;

Rails環境を構築

いよいよ、Railsの環境を構築します。

ここでは、github等のリモートリポジトリからファイルを取得する前提としています。
(SSH接続の設定については割愛します)

$ git clone <リモートリポジトリ>

以降、アプリケーションのディレクトリを rails_app とします。

アプリケーションのディレクトリを/var/www配下に移動します。

$ sudo mv rails_app /var/www

bundle install でRailsと必要なgemをインストールします。

なお、ここではpathを指定して、gemをローカルにインストールすることにします。

$ cd /var/www/rails_app
$ bundle install --path vendor/bundler
$ bundle exec rails -v
Rails 5.2.2

Credential情報の管理に使うキー情報をconfig/master.keyに設定します。

Rails5.2が生成する.gitignoreでは/config/master.keyがデフォルトで指定されているため master keyはリモートリポジトリに含まれません。

そのため、rails ini した環境のmaster.keyの内容を設定します

$ vi config/master.key

config/database.yamlの内容を先ほど作成したmysqlの環境と合わせます。

production:
  adapter: mysql2
  encoding: utf8
  database: production_db
  pool: 5
  username: prod_user
  password: Password

マイグレーションを行い、本番環境のデータベースを作成します。(必要に応じてdb:seedで初期データの登録も実施します)

$ bundle exec rails db:migrate RAILS_ENV=production
$ bundle exec rails db:seed RAILS_ENV=production

アセットのプリコンパイルを行います。

$ bundle exec rails assets:precompile

Apacheの設定

/etc/httpd/conf.d/passenger.conf を修正します。

  • PassengerRuby をrbenvのパスに変更
  • ServerName をlocalhostに変更
  • DocumentRoot と Directory をRailsアプリケーションのpublic フォルダに設定
<IfModule mod_passenger.c>
   PassengerRoot /usr/share/ruby/vendor_ruby/phusion_passenger/locations.ini
   PassengerRuby /home/vagrant/.rbenv/shims/ruby
   PassengerInstanceRegistryDir /var/run/passenger-instreg
</IfModule>

<VirtualHost *:80>
   ServerName localhost
   # Be sure to point to 'public'!
   DocumentRoot /var/www/rails_app/public
   <Directory /var/www/rails_app/public>
      # Relax Apache security settings
      AllowOverride all
      Require all granted
      # MultiViews must be turned off
      Options -MultiViews
   </Directory>
</VirtualHost>

設定を反映させるために、httpdを再起動します。

$ sudo systemctl restart httpd

動作確認

ホストOSのブラウザから http://localhost:8080 にアクセスし、railsアプリケーションにアクセスし正常に動作すれば成功です。

なお、エラーが発生した場合は、Apacheのエラーログ(/var/log/httpd/error_log)等を確認して切り分けていくことになります。


OS Xへのrailsのインストールではまった件

OS Xにrailsをインストールしようとしたら、初っぱなからつまずいたので対応をメモっておく。

環境

OS X EI Capitan 10.11.5
rbenv 1.0.0
ruby 2.2.5

問題点

rbenvで構成したruby 2.2.5 でrailsをインストールしようとしたところ、nokogiriのインストールで問題が発生しました。

ERROR:  Error installing nokogiri:
	ERROR: Failed to build gem native extension.

Building nokogiri using system libraries.
ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.

調査したところ、nokogiriのインストールにはlibxml2、libxslt、libiconvが必要とのこと。

対応

libxml2、libxslt、libiconvをbrewで入れるのですが、またまたややこしいことに、libconvはHomebrewの正式リポジトリから外れているので、tapで公式以外のリポジトリを追加する必要があります。

$ brew tap homebrew/dupes
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2
$ brew link --force libxslt

そして、一旦nokogiriだけをインストールしてみる。

gem install nokogiri -- --use-system-libraries

これがうまくいったら、railsをインストールする。

gem install rails -v 4.2.2