Apache

Rails5のProduction環境をApache+PassengerでCentOS7に構築

ruby_on_rails
o_wani
この記事は作成から6年以上経過しているため、内容が古くなっている可能性があります。

さくらのVPSにRails5が動くproduction(本番)環境の構築を行ったときの記録。現時点では、デフォルトのOSがCentOS6.9だったが、OSの再インストールを行いCentOS7.4で環境を再構築することにした。

前回は「OSの再インストール」編を記載した。今回は「Rails5が動くProduction環境の構築」を記載する。

Ruby on Rails5 環境設定

RubyとRailsのインストール手順は前にも書いたが通しで書いておく。

今回のアプリケーション構成

  • CentOS Linux release 7.4
  • Ruby 2.5.0
  • Rails 5.1.5
  • Apache 2.4.6
  • Passenger 5.2.0
  • MySQL 5.5.56

Rubyのインストール

コンパイラなどをインストールしておく

$ 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
$ exec $SHELL

Ruby2.5.0のインストール

$ rbenv install 2.5.0

rbenvのバージョン確認

$ rbenv versions
2.5.0

Rubyのバージョンを設定

$ rbenv global 2.5.0

Rubyのバージョン確認

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]

bundlerのインストール

$ gem install bundler

Railsのインストール

$ gem install rails

Railsのバージョン確認

$ rails -v
Rails 5.1.5

DataBaseインストール

MySQL (mariadb) インストール

$ sudo yum install mariadb-server mariadb-devel

起動

$ sudo systemctl start mariadb

初期設定

$ sudo mysql_secure_installation

MySQL側の準備

DataBase作成

CREATE DATABASE production_db DEFAULT CHARACTER SET utf8;

ユーザ作成

GRANT ALL PRIVILEGES ON production_db.* TO production_user@localhost IDENTIFIED BY 'Password' WITH GRANT OPTION;

Apacheインストール

$ sudo yum install httpd httpd-devel curl-devel apr-devel apr-util-devel

ドキュメントルート設定

バーチャルホストの設定は新規ファイル作成。
/etc/httpd/conf.d/vhost.conf
本番環境なのでRailsEnv production

<VirtualHost *:80>
ServerName owani.net
RailsEnv production
# Be sure to point to 'public'!
DocumentRoot /home/owani/project/public
<Directory /home/owani/project/public>
# Relax Apache security settings
AllowOverride all
Require all granted
# MultiViews must be turned off
Options -MultiViews
</Directory>
</VirtualHost>

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

Passengerのバージョン確認

$ passenger-config --version
Phusion Passenger 5.2.0

passenger-develのインストール

$ sudo yum install passenger-devel-5.2.0

Railsプロジェクト設定

git cloneでプロジェクト設置

DocumentRootにrailsのプロジェクトを設置しておきましょう。
gitの場合はcloneして設置。

文字化け解消

何やらgit logが文字化けしてるときは

$ echo $LANG
C

設定ファイル修正

$ export LANG=ja_JP.UTF-8

これでgit logが文字化けせず確認できるようになった。

Production環境用の変数設定

今回設定が必要なのは以下の5つだったとする。
config/database.yml

production:
<<: *default
host: <%= ENV['PJCT_DATABASE_HOST'] %>
database: <%= ENV['PJCT_DATABASE_NAME'] %>
username: <%= ENV['PJCT_DATABASE_USER'] %>
password: <%= ENV['PJCT_DATABASE_PASSWORD'] %>

config/secrets.yml

production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

※ここまでの前提:ソースは設置しておくこと、RailsプロジェクトHOMEに移動しておくこと

bundle installを実施

$ bundle install

keyを生成

$ RAILS_ENV=production rake secret
f67777be1fc28ccadf8048e1d8c1a4a6675217b4d3ac7d481f0b76a56aeab0f2dc8cec3193ae11df092f6d17d67b4e2b281917e8e21a6320a68688c4802a9dd0

exportする

5つの環境変数をexportしておく

$ export PJCT_DATABASE_HOST=localhost
$ export PJCT_DATABASE_NAME=production_db
$ export PJCT_DATABASE_USER=production_user
$ export PJCT_DATABASE_PASSWORD=Password
$ export SECRET_KEY_BASE=f67777be1fc28ccadf8048e1d8c1a4a6675217b4d3ac7d481f0b76a56aeab0f2dc8cec3193ae11df092f6d17d67b4e2b281917e8e21a6320a68688c4802a9dd0

/etc/profileにも書き込む

ファイルの最下部に下記を追記。サーバ再起動しても大丈夫なようにしておく。

## rails settings
export PJCT_DATABASE_HOST=localhost
export PJCT_DATABASE_NAME=production_db
export PJCT_DATABASE_USER=production_user
export PJCT_DATABASE_PASSWORD=Password
export SECRET_KEY_BASE=f67777be1fc28ccadf8048e1d8c1a4a6675217b4d3ac7d481f0b76a56aeab0f2dc8cec3193ae11df092f6d17d67b4e2b281917e8e21a6320a68688c4802a9dd0

設定の確認

一度ターミナルをログアウトし、ログイン。
環境変数が設定されていることを確認。

$ echo $SECRET_KEY_BASE
f67777be1fc28ccadf8048e1d8c1a4a6675217b4d3ac7d481f0b76a56aeab0f2dc8cec3193ae11df092f6d17d67b4e2b281917e8e21a6320a68688c4802a9dd0

データベースのマイグレーション

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

アセットプリコンパイル

$ bundle exec rake assets:precompile RAILS_ENV=production

apache再起動

$ sudo systemctl restart httpd

確認

うまく動いていないことを確認。

Alt text

Passenger の設定ファイル修正

PassengerRubyの設定を修正する。

#PassengerRuby /usr/bin/ruby
PassengerRuby /home/owani/.rbenv/shims/ruby

apache再起動

$ sudo systemctl restart httpd

Production環境の落とし穴

(おまけ:1)301リダイレクトの謎

curlで調査

http://54.249.216.6が今回のプロジェクトのURLとした場合、

$ curl 'http://54.249.216.6' -I
HTTP/1.1 301 Moved Permanently
Date: Thu, 15 Feb 2018 06:17:39 GMT
Server: Apache/2.4.6 (CentOS) Phusion_Passenger/5.2.0
X-Powered-By: Phusion Passenger 5.2.0
Location: http://54.249.216.6
Status: 301 Moved Permanently
Content-Type: text/html; charset=UTF-8

設定してもいないのに、謎の常時HTTPS化で、301リダイレクトが発生している模様。

Productionの設定ファイルで常時SSL化が..

config/environments/production.rb
turefalse

config.force_ssl = false

ありがとう…

参考:
Why does my apache2 setup always result in 301 Moved Permanently

(おまけ:2)Rails5からのProduction環境でのAutoload廃止

development環境は表示されているページが、production環境で表示されていない。。よく調べるとlib以下のファイルの読み込みに失敗しているというパターン。。

config/application.rb に追記

config.enable_dependency_loading = true

lib以下のファイルもloadするように修正。。

ありがとう…

参考:
Rails5: production環境でのAutoloadの廃止

Rails5からは気をつけます。

Incomplete response received from applicationと表示される時は

$ passenger-config restart-app
STAFF
o_wani
o_wani
スタッフ
大学卒業後、15年間WEB業界で働く。現在はマネジメントに従事していますが、ChatGPTの登場に触発され、このブログを再開。AIをパートナーに、自分で手を動かして実装する楽しさと喜びを再発見中。時代が変わりつつある中でも、陳腐化しない情報発信も目指しています。
記事URLをコピーしました