Rails5:EC2 + Ubuntu + Nginx + Passenger でデプロイ

EC2 + Ubuntu + Nginx + Passenger で Rails5 のアプリをデプロイする手順をまとめます。

順調に進めば、1〜2時間ぐらい完了します。

環境

  • Ruby 2.5.1
  • rvm 1.29.7
  • Rails 5.2
  • AMS EC2
  • Ubuntu 18.04 LTS 20180814

EC2(Ubuntu)のセットアップ

EC2コンソールからインスタンスを作成。

「Ubuntu Server 18.04 LTS」を選択します。

Ubuntu Server 18.04 LTS

なお、料金はAmazon Linuxと同じ。

▶︎ Ubuntu 18.04 LTS – Bionic

EC2が起動したら、sshでログインします。

デフォルトのユーザ名は「ubuntu」。

$ ssh -p 22 -i ~/.ssh/[YOUR_KEY] ubuntu@[YOUR_IP_ADDRESS]

Ruby のインストール

続いて、Ruby をインストールしていきます。

システムの設定

$ sudo apt-get update
$ sudo apt-get install -y curl gnupg build-essential

RVM の設定

$ sudo apt-get install gnupg2 -y

$ curl -sSL https://get.rvm.io | bash -s stable --ruby=2.5.1
$ sudo gpg2 --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ curl -sSL https://get.rvm.io | sudo bash -s stable
$ sudo usermod -a -G rvm 'YOUR_USER_NAME'

再ログインして、設定を反映させます。

$ exit
$ ssh -p 22 -i ~/.ssh/[YOUR_KEY] ubuntu@[YOUR_IP_ADDRESS]
$ rvm -v
rvm 1.29.7 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]

Ruby の設定

利用したい Ruby のバージョンをインストールして、デフォルトに設定。

$ rvm install ruby 2.5.1
$ rvm --default use ruby 2.5.1

bundler のインストール

$ gem install bundler --no-rdoc --no-ri

あわせて、Node.js もインストールしておきます。

$ sudo apt-get install -y nodejs &&
> sudo ln -sf /usr/bin/nodejs /usr/local/bin/node

Passenger + Nginx の設定

Passenger パッケージのインストール

$ sudo apt-get install -y dirmngr gnupg
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
$ sudo apt-get install -y apt-transport-https ca-certificates
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'
$ sudo apt-get update
$ sudo apt-get install -y libnginx-mod-http-passenger
$ sudo apt-get install -y libnginx-mod-http-passenger

Passenger Nginx の有効化

設定ファイルが意図する場所にあるか確認して、設定を追加。

$ if [ ! -f /etc/nginx/modules-enabled/50-mod-http-passenger.conf ]; then sudo ln -s /usr/share/nginx/modules-available/mod-http-passenger.load /etc/nginx/modules-enabled/50-mod-http-passenger.conf ; fi
$ sudo ls /etc/nginx/conf.d/mod-http-passenger.conf

上記コマンド後、Nginxを再起動させます。

$ sudo apt install nginx-core
$ sudo service nginx restart

インストールの確認

正しくインストールされたか検証します。

$ sudo /usr/bin/passenger-config validate-install
What would you like to validate?
Use <space> to select.
If the menu doesn't display correctly, press '!'

 ‣ ⬢  Passenger itself
   ⬡  Apache

-------------------------------------------------------------------------

 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... ✓

Everything looks good. :-)

Nginx が Passenger を起動しているかも確認。

$ sudo /usr/sbin/passenger-memory-stats
Version: 6.0.1
Date   : 2019-01-17 21:25:01 +0000
---------- Nginx processes -----------
PID    PPID   VMSize    Private  Name
--------------------------------------
14759  1      141.1 MB  0.4 MB   nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
14762  14759  143.7 MB  0.7 MB   nginx: worker process
### Processes: 2
### Total private dirty RSS: 1.02 MB


----- Passenger processes -----
PID    VMSize    Private  Name
-------------------------------
14738  389.2 MB  2.3 MB   Passenger watchdog
14748  673.0 MB  3.2 MB   Passenger core
### Processes: 2
### Total private dirty RSS: 5.51 MB

Nginx と Passenger、両方のプロセスが走っていればOK。

定期的なアップデート

Nginx と Passenger は、APTパッケージを通して定期的にアップデートされています。

なので、以下のコマンドを定期的に実行するようにしましょう。

$ sudo apt-get update
$ sudo apt-get upgrade

Rails アプリのデプロイ

事前インストール

Git のインストール。

$ sudo apt-get install -y git

MySQL のインストール。

$ sudo apt-get install libmysqlclient-dev

Yarn のインストール(必要な場合)。

$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn

Rails の設定

アプリのクローン作成。

$ cd /var/www
$ sudo git clone [YOUR_GIT_URL]
$ sudo chown [YOUR_USER_NAME] -R [APP_REPOSITORY]

アプリのセットアップ。

「config.master.key」には、rails new した時の master.key をコピペします。

$ cd [APP_REPOSITORY]
$ vim config/master.key
$ bundle install --deployment --without development test
$ bundle exec rake db:create RAILS_ENV=production
$ bundle exec rake assets:precompile RAILS_ENV=production

設定ファイルの権限を絞る。

$ chmod 700 config db
$ chmod 600 config/database.yml config/master.key

Uglifier::Error が出たら

「rake assets:precompile」で次のエラーが発生。

Uglifier::Error: Unexpected token: punc ({). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true)

「config/environments/production.rb」を、次のように編集することで解決できる。

# config.assets.js_compressor = :uglifier 
config.assets.js_compressor = Uglifier.new(harmony: true) 

Nginx の設定

[YOUR_RUBY_PATH] の取得。

$ passenger-config about ruby-command
passenger-config was invoked through the following Ruby interpreter:
  Command: /usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby
  Version: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
  To use in Apache: PassengerRuby /usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby
  To use in Nginx : passenger_ruby /usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby
  To use with Standalone: /usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby /usr/bin/passenger start

のちほど、この「/usr/local/rvm/gems/ruby-2.5.1/wrappers/ruby」の部分を使います。

アプリの設定ファイルを作成。

$ sudo vim /etc/nginx/sites-enabled/[APP_REPOSITORY].conf

ファイル内は次のように書きます。

[YOUR_RUBY_PATH]は、先ほど取得したパスです。

# /etc/nginx/sites-enabled/[APP_REPOSITORY].conf
server {
    listen 80;
    server_name [YOUR_DOMAIN];

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/[APP_REPOSITORY]/public;

    # Turn on Passenger
    passenger_enabled on;
    passenger_ruby [YOUR_RUBY_PATH];
}

Nginx を再起動してテスト。

$ sudo service nginx restart
$ curl http://[YOUR_DOMAIN]

ルートのHTMLが表示されればデプロイ完了。

おつかれさまでした!

このサーバを HTTPS 化する場合はこちら:

▶︎ EC2 + Ubuntu + Nginx + Passenger を Let’s Encrypt!

Action Cable を使う場合の設定はこちら:

▶︎ Rails:Action Cable を本番にデプロイする手順

参考

兵庫県西宮市生まれのフリーランスRailsエンジニア。案件によってWordPressの作業も請け負ったりしてます。2014年から2016年にかけてオーストラリアで生活。 現在は東京を拠点に活動。/ 前職・資格:公認会計士 / プログラミング言語:Ruby, JavaScript, HTML, CSS / 日本語・英語
コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です