はじめに
『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でデプロイしたいと思います。
では、また!