Rails5のProduction環境をApache+PassengerでCentOS7に構築
さくらの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
確認
うまく動いていないことを確認。
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
tureをfalseに
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からは気をつけます。
Incomplete response received from applicationと表示される時は
$ passenger-config restart-app