Ubuntu 18.04LTS上でのRuby on Rails公開環境の構築

はじめに

Dell Precision 5820に標準でインストールされていたUbuntu 18.04LTSにRuby on Railsの公開環境を構築する。

環境

# more lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

Ubuntu 18.04をCUIモードで動かす

デフォルトがGUI(ランレベル5)で動いているが、サーバとしてしか使わないのでCUI(ランレベル3)で動かす。

% sudo systemctl set-default runlevel3.target

不要なサービスを止める

/etc/rc3.d/にシンボリックリンクされているものを眺めて不要なものはリンクを外す。

% ls /etc/rc3.d/
% sudo update-rc.d -f avahi-daemon remove 
% sudo update-rc.d -f bluetooth remove
% sudo update-rc.d -f cups remove
% sudo update-rc.d -f cups-browesed remove
% sudo update-rc.d -f speech-dispatcher remove

参考:

再起動する。

rbenvをシステムワイドにインストールする

CentOSでrbenvをシステムにインストールする - Qiitarbenvでsystem wideに入れるときに気をつけたいこと - Qiitaを参考にインストールする。

Githubからrbenv, ruby-build, そして rbenv-default-gemsを取得する。

% cd /usr/local
% sudo git clone https://github.com/rbenv/rbenv.git rbenv
% sudo chgrp -R staff rbenv
% sudo chmod -R g+rwxXs rbenv
% sudo mkdir rbenv/plugins
% cd rbenv/plugins
% sudo git clone https://github.com/rbenv/ruby-build.git ruby-build
% sudo chgrp -R staff ruby-build
% sudo chmod -R g+rwxs ruby-build
% sudo git clone https://github.com/rbenv/rbenv-default-gems.git rbenv-default-gems

グループstaffに現在のユーザhogehogeを付け加える。

% sudo usermod -aG staff hogehoge

rbenvの設定をログイン時を読み込むことができるように/etc/profile.d/rbenv.shを作成する。

% sudo touch /etc/profile.d/rbenv.sh
% sudo vi /etc/profile.d/rbenv.sh

中見は以下のようにした。

export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init --no-rehash -)"

rbenvで初期化を行う。

% sudo su
# source /etc/profile
# exit

rbenvでsystem wideに入れるときに気をつけたいこと - Qiitaでおすすめのrbenv-default-gemsを設定する。これを設定することでrubyのインストール時に合わせてインストールするべきgemライブラリを指定することができる。

% sudo touch /usr/local/rbenv/default-gems
% sudo vi  /usr/local/rbenv/default-gems

中見は以下のようにした。

bundler
pry
rbenv-rehash

rubyのインストール

rubyのコンパイルに必要なパッケージをインストールする。

% sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

rubyのインストール

% sudo su
# source /etc/profile
# which rbenv
# rbenv install --list | 2.6.5
# rbenv install 2.6.5
# rbenv rehash
# rbenv global 2.6.5

gemのバージョンを最新にしておく。

# gem update --system
# gem -v
3.0.6

gemパッケージをインストールする際にドキュメントをつくらないように設定する。

# touch ~/.gemrc
# vi ~/.gemrc

.gemrcの中見は以下の通り。

install: --no-document
update: --no-document

Ruby on Railsのインストール

SQLite3関連のパッケージをインストールする。

sudo apt install libsqlite3-dev sqlite3

Rails6から webpackerというものを使うようになる。このために必要なパッケージをインストールする。

% sudo apt install -y curl
% 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 update
% sudo apt install yarn


Ubuntu 18.04LTSの標準のNode.jsは古いため、Node.jsを別途インストールする。

% sudo apt install -y nodejs npm
% sudo npm install n -g
% sudo n stable
% sudo apt purge nodejs npm
% exec $SHELL -l

% which node
/usr/local/bin/node

% node -v
v12.13.1

Ruby on Railsをインストールする。

% sudo su
# source /etc/profile
# gem install rails
# which rails
/usr/local/rbenv/shims/rails
# rails -v
Rails 6.0.1

Ruby on Railsの動作確認&gem ライブラリをインストールする。

# cd /tmp
# rails new demo
# cd demo
# rails webpacker:install
# rails generate scaffold person name:string age:integer
# rails db:migrate
# rails server

nftableによるアクセス制限

Debian 10 (buster)のnftablesでアクセス制御 - 発声練習を参考にする。

40080, 400081をアプリ用に公開する。/etc/nftables.confに以下を追加する。

tcp dport 40080 counter 
tcp dport 40081 counter

反映させる。

% sudo nft -f /etc/nftables.conf

確認する。

% sudo nft list ruleset

ApacheとPassengerのインストール

Installing Passenger + Nginx on Ubuntu 18.04 LTS (with APT) - Passenger LibraryにしたがってPassengerをインストールする。

Passengerをaptでインストールできるように設定する。GPG鍵の登録。

% 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

/etc/apt/source.listに追加する。

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

PassengerおよびApacheモジュールのインストール。

% sudo apt-get install -y apache2 apache2-dev libapache2-mod-passenger

Apacheにモジュールを付け加える。

% sudo a2enmod passenger
% sudo apache2ctl restart

正しくインストールできているかどうかを確かめる。Apacheを使う方を選ぶ。

sudo /usr/bin/passenger-config validate-install

PassengerInstanceRegistryDirを設定する。

% sudo mkdir -p /var/run/passenger-instreg

/var/runは tmpfsとして設定されているため、そのままだと再起動の度に削除されてしまう(参考:/var/run の中身が再起動すると消えてしまうので・・・お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita)。そこで、 /etc/tmpfiles.d に設定を記載する。

% sudo touch /etc/tmpfiles.d/passenger.conf

/etc/tmpfiles.d/passenger.confの中見は以下のとおりにする。

d /var/run/passenger-instreg 0755 root root

rootのホームディレクトリ(/root)のシェルの設定ファイルに上記の添付ファイルに関する設定を記述する。たとえば、.bash_profileに以下を記述する。以下の例では合わせてRailsの実行モードについても記載する。

export PASSENGER_INSTANCE_REGISTRY_DIR=/var/run/passenger-instreg
export RAILS_ENV=production

railsのソースファイルが/home/hogehoge/rails-serverとし、http://hogehoge.net/rails/でアクセスできるようにするとき、シンボリックリンクをはる。Apacheのデフォルトが/var/www/htmlになっているのでその下に置く。

% sudo ln -s  /home/hogehoge/rails-server/public /var/www/html/rails

Apacheの設定

/etc/apache2/ports.conf に新しく開けたポートの記述を追加する。

Listen 40080
Listen 40081

ポート番号40080でアクセスする設定を/etc/apache2/sites-available/001-vhost1.confとして設定する。以下の設定ファイルでSECRET_KEY_BASEの環境変数を定義しているのは、passenger経由だとユーザディレクトリの設定ファイル(.bash_profileなど)で設定した環境変数が反映されないため(参考→http://blog.mkt-sys.jp/2015/11/secret-key-base-on-production.html)。

PassengerInstanceRegistryDir /var/run/passenger-instreg #上述のディレクトリ

<VirtualHost *:40080>
	ServerName サーバのFQDN

	ServerAdmin 連絡先メールアドレス
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/vhost1_error.log
	CustomLog ${APACHE_LOG_DIR}/vhost1_access.log combined

	PassengerRuby /usr/local/rbenv/versions/2.4.2/bin/ruby # rbenvで導入したrubyを指定する
	PassengerFriendlyErrorPages off  #onにするとエラー時にログが表示される。
	
	SetEnv SECRET_KEY_BASE 「秘密鍵につかう文字列 bundle exec rails secret で生成」
	RackEnv production
	RackBaseURI /rails

</VirtualHost>

設定を反映させる。

% sudo a2ensite vhost1
% sudo systemctl reload apache2

Railsアプリを修正したとき

passengerを再起動する(参考:Restarting applications)。

% sudo passenger-config restart-app