CentOS7(さくらのVPS)にRailsアプリをデプロイ

CentOS7(さくらのVPS)にRailsアプリをデプロイ

はじめに

CentOS7(さくらのVPS)にRails環境を作る』にて構築したRails環境を使ってデプロイしようと思います。

一年半程度前に新規でデプロイしたときのメモを見ながら作業しましたが、以前と状況が変わってて手こずりました。

参考情報

環境とミドルウェア

  • さくらインターネットのVPS
  • OS:CentOS7
  • WEBサーバー:Apache
  • DB:MariaDB
  • 実装モジュール:Phusion Passenger(アプリケーションサーバー)

こんなとこでしょうか。

Apache、関連パッケージのインストール

まずは、『CentOS7(さくらのVPS)にRails環境を作る』で作成したユーザーでサーバーにログインの上、Apache及び関連パッケージをインストールしていきます。

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

ついでにポート開放も

sudo firewall-cmd --zone=public --add-service=http --permanent

pumaの3000番ポートも開放しておいて方がいいですね。

 sudo firewall-cmd --zone=public --add-port=3000/tcp --permanent

firewalldを再起動して、設定を反映させます。

sudo firewall-cmd --reload

あとは、Apacheの自動起動設定

sudo systemctl enable httpd

最後にApacheを起動

sudo systemctl start httpd

ブラウザから、IP アドレスでアクセスするとApacheのテストページがでる…はずですが、出ない。。

ポートも開放してるし、Apacheも起動しているのに。。

なんで。。

とおもって、さくらVPS のコンパネをみたら、パケットフィルタが導入されていた

いつの間に。今回はこれを無効化します。

これで、改めてIPでアクセス

これでOKですね。

RailsアプリをPumaで動かしてみる

さて、次に早速Railsアプリを動かしてみたいと思います。

今回は、適当に新規でアプリをscaffoldで作って動かしてみます。

正直scaffoldなんてこんな時しか使う機会ないので。。

rails用ディレクトリはどこでもいいのですが、今回はhttpd.confのデフォルトドキュメントルートである/var/www/htmlに設置したいと思います。

cd /var/www/html/

ここで、rails new したところ、/home/norx/.rbenv/versions/2.6.0/lib/ruby/2.6.0/fileutils.rb:239:in `mkdir’: Permission denied @ dir_s_mkdir – /var/www/html/ramen_shop (Errno::EACCES)と怒られたので、htmlディレクトリのオーナーを変更します。

cd ..
sudo chown -R norx:norx html

あらためて、rails new

※リモートリポジトリからgit cloneするときは、master.keyが含まれていない(デフォルトで.gitignoreに記載されているため)ので、手動で対応が必要です。

rails new ramen_shop

あとは、scaffoldして、bundleとマイグレート実行

cd ramen_shop
rails g scaffold Shop name:string grade:integer
bundle
rails db:migrate

Puma起動

rails s -b 0.0.0.0

これで、http://IPアドレス:3000でRails初期画面、http://IPアドレス:3000/shopsでアプリトップページが表示されますね。

http://IPアドレス:3000でアプリのトップが表示されるようにルーティングを変更します。

Rails.application.routes.draw do
  root to: 'shops#index'
  resources :shops
end

DBの作成と設定

今回は、MariaDBを使っていきたいと思いますが、Mariaのインストールや設定につきましては、本記事の趣旨と異なりますので、割愛いたします。

設定がわからない方は、Qiita等インターネット上にたくさん詳細されているので、それらの記事を参考にしてください。

参考:MariaDBのインストール/初期設定 [CentOS7]

また、この段階でアプリ用に1つデータベースを作成しておいてください。

Gemにmysql2追加

gem 'mysql2'

bundle install実行

mysql-develが入っていないと、bundle install 実行時エラーとなるので、yumで入れてください。

database.ymlの編集

  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: ramen
  pool: 5
  username: dbuser
  password: dbpassword
  host: localhost

production環境のDBにマイグレート

rails db:migrate RAILS_ENV=production

Phusion Passenger のインストールと設定

ますは、パッセンジャーのインストール

gem install passenger

続いて、モジュールのインストール

passenger-install-apache2-module

すると、インストールスクリプトが起動します。

こちらは、とりあずEnter

次にRubyを選択(画面の状態) ※spaceキーで選択できます。

パーミッションで怒られたので、パーミッションを直して改めて、

passenger-install-apache2-module実施

少し時間がかかります。(少しじゃない。。かなり長いです)

次の画面が表示されたら、完了です。

httpd.confに設定する内容が記載されているので、これをコピーします。
(LoadModule passenger_Module〜までコピー)

   LoadModule passenger_module /home/norx/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.4/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/norx/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.4
     PassengerDefaultRuby /home/norx/.rbenv/versions/2.6.0/bin/ruby
   </IfModule>

ここで別にターミナルを開いて、対象サーバーにシェルログイン(SSH接続)してください。

で、httpd.confに先程の内容をペーストします。

Include conf.modules.d/*.confの後ろにペーストしていきます。

こんな感じ。

これで、もとのターミナルに戻ってEnter。

Validating installation...

 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... ✓
 * Checking whether Apache is installed... ✓
 * Checking whether the Passenger module is correctly configured in Apache... ✓

Everything looks good. :-)

ひとまずは、これでOK。

今度は、 https://www.phusionpassenger.com/library/deploy/apache/deploy/ にブラウザからアクセス。

Rubyを選択してcontinue

あとは、ガイド通りにvertual hostの設定をhttpd.confに入れてあげればいいです。

まず、ページの指示にしたがって、passenger-config about ruby-commandを実行

passenger-config about ruby-command

返ってきたパスを控える

今回は、こちらの部分のパスを控えます。

To use in Apache: PassengerRuby /home/norx/.rbenv/versions/2.6.0/bin/ruby

ガイドに記載されているバーチャルホストの設定をコピー

<VirtualHost *:80>
    ServerName yourserver.com

    # Tell Apache and Passenger where your app's 'public' directory is
    DocumentRoot /path-to-your-app/public

    PassengerRuby /path-to-ruby

    # Relax Apache security settings
    <Directory /path-to-your-app/public>
      Allow from all
      Options -MultiViews
      # Uncomment this if you're on Apache > 2.4:
      #Require all granted
    </Directory>
</VirtualHost>

PassengerRubyのパスをを先程控えたパスに変更します。

あとは、ドキュメントルートや、ディレクトリパスを修正し、httpd.confに追記してあげれば、オーケーです。

実施の内容はこんな感じ。

今回は、httpd.conf最終行にペーストしました。

<VirtualHost *:80>
    ServerName サーバーのIPや、ドメイン

    # Tell Apache and Passenger where your app's 'public' directory is
    DocumentRoot /var/www/html/ramen_shop/public

    PassengerRuby /home/norx/.rbenv/versions/2.6.0/bin/ruby

    # Relax Apache security settings
    <Directory /var/www/html/ramen_shop/public>
      Allow from all
      Options -MultiViews
      # Uncomment this if you're on Apache > 2.4:
      #Require all granted
    </Directory>
</VirtualHost>

Apache再起動

sudo systemctl restart httpd.service

http://IPアドレスにアクセスし、アプリが正常に動作することを確認するつもりが、エラー

しかたないので、ログを確認

sudo cat /var/log/httpd/error_log
WARNING: potential privilege escalation vulnerability detected. Phusion Passenger is running as root, and part(s) of the Passenger root path (/home/norx/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.4) can be changed by non-root user(s):

えっ。

いつから、こんなに厳しくなったんだ。 仕方ないので、Passengerの公式サイトでいろいろ調べる。

単純に権限の問題ぽいので、先程のバーチャルホストに以下追記

<VirtualHost *:80>
    ServerName サーバーのIPや、ドメイン

    # Tell Apache and Passenger where your app's 'public' directory is
    DocumentRoot /var/www/html/ramen_shop/public

    PassengerRuby /home/norx/.rbenv/versions/2.6.0/bin/ruby

    PassengerUserSwitching off
    PassengerDefaultUser norx(ここはサーバーにログインしているユーザー名)

    # Relax Apache security settings
    <Directory /var/www/html/ramen_shop/public>
      Allow from all
      Options -MultiViews
      # Uncomment this if you're on Apache > 2.4:
      Require all granted
    </Directory>
</VirtualHost>

そういえば、アセットのprecompileしてないなと思って、実施したら、yarnが入ってないよと怒られた

以前は、yarn必要なかった気がするのですが。。

adminlte利用したときにyarnで管理した以外使った記憶がありません。

デプロイの動作確認のためだけに入れるのもなぁとも思うのですが、入れてきます。

npmで入れてきます。

sudo npm install -g yarn
#そしてパスを通す
echo 'export PATH="$HOME/.yarn/bin:$PATH"' >> ~/.bash_profile

source ~/.bash_profile

つづいて、assets:precompile

rails assets:precompile RAILS_ENV=production

これで、Apache再起動して、無事デプロイ完了

チャチャッとやるつもりが、時間使ってしまいました。。

また、時間のあるときにUnicorn、Nginxでデプロイしたいと思います。

では、また!

環境構築カテゴリの最新記事