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)等を確認して切り分けていくことになります。
コメント