はじめに
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をシステムにインストールする - Qiitaやrbenvで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