RHEL7でRailsサーバを構築した サーバの基本設定

こちらは、

RHEL7でRailsアプリのサーバを構築した - takapiのブログ

サーバの基本設定 に関する記事です。

takapi86.hatenablog.com

OS(RHEL7)のアップデート

まずは、yum コマンドでOS(RHEL7)を更新します。

$ sudo yum -y update

ロケールの確認・変更

RHEL7からは、ロケール設定の確認・変更は 'localectl' コマンドを使用するようです。

こちらのサイトを参考に確認・変更します。 http://zero-config.com/centos/changelocale-002.html

現在の状態を確認します。

$ localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: us
      X11 Layout: us

EC2で設定したRHEL7の System Locale はデフォルトで日本語になっておりました。 VC Keymap、 X11 Layout については、SSHからの接続のみなので無視して良さそうです。

ちなみに、 System Locale の修正は以下のように行います。

sudo localectl set-locale LANG=ja_JP.utf8 # ja_JP.utf8で設定を行う場合

日付の変更

RHEL7からは、システムの日付および時間に関する情報の設定は 'timedatectl' コマンドを使用するようです。

こちらのサイトを参考に確認・変更します。

第2章 日付と時刻の設定 - Red Hat Customer Portal

現在の状態を確認します。

$ timedatectl status
      Local time: 土 2017-06-24 01:24:37 EDT
  Universal time: 土 2017-06-24 05:24:37 UTC
        RTC time: 土 2017-06-24 05:24:37
       Time zone: America/New_York (EDT, -0400)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  日 2017-03-12 01:59:59 EST
                  日 2017-03-12 03:00:00 EDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  日 2017-11-05 01:59:59 EDT
                  日 2017-11-05 01:00:00 EST

どうやら Time zoneAmerica/New_York になっているようなので、タイムゾーンの変更します。

$ sudo timedatectl set-timezone Asia/Tokyo

もう一度、 timedatectl status を実行し Time zoneAsia/Tokyo になっていることを確認します。

$ timedatectl status
      Local time: 土 2017-06-24 14:29:26 JST
  Universal time: 土 2017-06-24 05:29:26 UTC
        RTC time: 土 2017-06-24 05:29:26
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

SElinuxの無効化

EC2のRHELはデフォルトでSElinuxが有効になっているようですが、現在はSElinux力がないので、実力がつくその日まで無効にしておきます。

こちらのサイトを参考に確認・変更します。

5.4. SELinux の有効化および無効化 - Red Hat Customer Portal

以下の設定ファイルを修正します。

/etc/selinux/config の以下の箇所を disabled に修正します。

SELINUX=enforcing
↓
SELINUX=disabled

設定変更後は、OSの再起動が必要なので再起動します。

以上で、サーバの基本設定は完了です。

RHEL7でRailsアプリのサーバを構築した【Railsアプリケーション・Unicorn のインストール・設定】

こちらは、

RHEL7でRailsアプリのサーバを構築した - takapiのブログ

Railsアプリケーション・Unicorn のインストール・設定 に関する記事です。

takapi86.hatenablog.com

Railsアプリケーションは完成している前提で進めます。

Railsアプリケーションをクローンする

github等からRailsアプリケーションをクローンします。

例:
$ git clone  --depth 1 https://github.com/takapi86/my-app.git

bundler のインストール

RubyのGem管理ツールである bundler をインストールします。

gem install bundler

Node.jsのインストール

必要に応じて設定します。 必須ではないので、Node.jsを使用しない場合はスキップします。

$ sudo yum remove -y nodejs npm # 最新のバージョンをインストールしたいので、すでにインストールされている場合は削除します。
$ sudo rpm -i https://rpm.nodesource.com/pub_6.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
$ sudo yum -y install nodejs

sqliteのインストール

必要に応じて設定します。 必須ではないので、 sqlite を使用しない場合はスキップします。

$ sudo yum -y install sqlite
$ sudo yum -y install sqlite-devel

Railsアプリケーションのproduction設定

アセットのプリコンパイル

$ bundle exec rake assets:precompile RAILS_ENV=production

SECRET_KEY_BASEの設定

Railsでは config/secrets.yml にCookieのなりすまし対策のため、SECRET_KEY_BASE をCookie暗号化/復号化をしているようです。

production環境の場合、SECRET_KEY_BASE を環境変数に設定してあげる必要があります。

$ bundle exec rake secret
b1cb4a8933d20deaafb19e152217b7a53f784912ceb51dce6507e7336e671eef0136438d81604ca4c4c39cffc2ee93ba472b2d6cc597c0f4f3d39c05343dede1

動作確認のため、一時的にこの値を環境変数にセットします。

export SECRET_KEY_BASE=b1cb4a8933d20deaafb19e152217b7a53f784912ceb51dce6507e7336e671eef0136438d81604ca4c4c39cffc2ee93ba472b2d6cc597c0f4f3d39c05343dede1

各Gemのインストール

bunlde install しGemのインストールします。

$ cd ~/my-app/
$ bundle install

DB設定

$ vi config/database.yml
production:
  adapter: mysql2
  database: [DB名を入力します]
  pool: 5
  username: [DBのユーザを入力します]
  password: [DBのパスワードを入力します]
  host: localhost # 今回はDBサーバも同じサーバなので、localhostをしています。

DBマイグレーション

以下のコマンドで、アプリケーションのDB、テーブル、データを作成します。

RAILS_ENV=production bundle exec rake db:create
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake db:seed

Railsアプリケーションの動作確認

最終的に sustemdで起動・停止できるようにしますが、ひとまずunicornコマンドを実行し、 productionモードで起動できるか確認します。 unicornはデフォルトでは port8080 であがるので、8080宛にアクセスして動作確認を行います。

unicorn -E production

ここまで確認ができればRailsアプリケーション側の設定は完了です。

systemd の設定

設定したRailsアプリケーションをsystemdで起動・停止できるようにします。

config/unicorn.rb を編集

systemdからは unicornの設定ファイル config/unicorn.rb の内容で起動・停止できるようにします。

必要に応じて、以下に設定を追加・削除するとよいでしょう。

# config/unicorn.rb
app_path = '/home/ec2-user/my-app'
worker_processes 2
listen "#{app_path}/tmp/sockets/unicorn.sock", :backlog => 64
listen 8080, :tcp_nopush => true
pid "#{app_path}/tmp/pids/unicorn.pid"
rails_root = File.expand_path('../../', __FILE__)
ENV['BUNDLE_GEMFILE'] = rails_root + "/Gemfile"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{ENV['RAILS_ROOT']}Gemfile"
end

上記の設定でサーバがあがるかひとまず unicorn コマンドで確認してみます。

bundle exec unicorn -c config/unicorn.rb -E production

systemdの設定

/etc/systemd/system/unicorn.service

[Unit]
Description = unicorn Rack application server
Wants=mysqld.service
After=mysqld.service

[Service]
Environment=RAILS_ENV=production
Environment=SECRET_KEY_BASE=[SECRET_KEYを設定します。]
PIDFile=/home/ec2-user/my-app/tmp/pids/unicorn.pid
ExecStart=/home/ec2-user/.rbenv/shims/unicorn -c "/home/ec2-user/my-app/config/unicorn.rb" "/home/ec2-user/my-app/config.ru" -E production

[Install]
WantedBy = multi-user.target

自動起動の設定

$ sudo systemctl enable unicorn.service

以下のコマンドで登録できているか確認します。

$ sudo systemctl list-unit-files --type=service | grep unicorn
unicorn.service                               enabled

起動できるか確認します。

$ sudo systemctl start unicorn.service

NginxからUnicornを呼び出す

/etc/nginx/conf.d/ 以下のような設定ファイルを追加し、リバースプロキシできるようにします。 必要に応じて、以下に設定を追加・削除するとよいでしょう。

server {
  listen 80 default_server;
  server_name www.example.com;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  root /home/ec2-user/my-app/public;

  client_max_body_size 100m;
  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;
  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:8080;
  }
}

nginxを再起動します。

$ sudo systemctl restart nginx

ページにアクセスして確認する

ブラウザなどでサーバのURLへアクセスし、システムのページなどが表示されていればOKです。

表示されない場合は、ネットワーク周りやファイアウォールなどの設定を見直すとよいでしょう。

以上で、Railsアプリケーション・Unicorn のインストール・設定は完了です。

RHEL7でRailsアプリのサーバを構築した【Nginxのインストール・設定】

こちらは、

RHEL7でRailsサーバを構築した - takapi86のブログ

Nginxのインストール・設定 に関する記事です。

takapi86.hatenablog.com

Nginxのインストール・設定

Stable version(nginx-1.12.0)をインストールしていきます。

Nginxのyumリポジトリの追加

$ sudo rpm -i http://nginx.org/packages/rhel/7/noarch/RPMS/nginx-release-rhel-7-0.el7.ngx.noarch.rpm

Nginxのインストー

$ sudo yum -y install nginx

自動起動の設定

以下のコマンドでMySQL自動起動の設定を行います。

sudo systemctl enable nginx.service

nginx を起動する

$ sudo systemctl start nginx.service

デフォルトページにアクセスして確認する

サーバのURLへアクセスし、Nginxのデフォルトページが表示されていればOKです。

表示されない場合は、ネットワーク周りやファイアウォールなどの設定を見直すとよいでしょう。

以上で、nginxの設定は完了です。

RHEL7でRailsアプリのサーバを構築した

AWS EC2(RHEL7)でRailsサーバを構築したので、手順を備忘録として残しておきます。

OSはAmazon Linuxでも良かったのですが、Systemdなど、RHEL7からの機能に慣れたいという思いからRHEL7を使っています。

AWSの設定(インスタンスの立ち上げ方、セキュリティグループ、Elastic IPの設定など)はここでは取り上げません。

構成

すべて1サーバにまとめています。

やること

1.サーバの基本設定

takapi86.hatenablog.com

2.Nginxのインストール・設定

takapi86.hatenablog.com

3.MySQLのインストール・設定

takapi86.hatenablog.com

4.Rubyのインストール・設定

takapi86.hatenablog.com

5.Railsアプリケーション・Unicorn のインストール・設定

takapi86.hatenablog.com

以上、必要に応じてログの設定やセキュリティ・バックアップの設定等を追加していくと良いでしょう。

RHEL7でRailsアプリのサーバを構築した【MySQLのインストール・設定】

こちらは、

RHEL7でRailsアプリのサーバを構築した - takapi86のブログ

MySQLのインストール・設定 に関する記事です。 EC2のRHEL7にMySQLのインストール・設定を行います。

takapi86.hatenablog.com

MariaDBを削除する

EC2のRHELはデフォルトでMySQLと互換のあるMariaDBが入っています。 どうやら、どちらもインストールされていると競合するという噂があるので、削除してしまいます。

$ sudo yum -y remove mariadb-libs
$ sudo rm -rf /var/lib/mysql/

MySQLyumリポジトリの追加

以下のコマンドでyumリポジトリを追加します。

$ sudo yum -y localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

rpmについては、以下のURLから該当するものを選択しました。 https://dev.mysql.com/downloads/repo/yum/

MySQLのインストール

以下のコマンドで、 mysql, mysql-devel をインストールします。

$ sudo yum -y install mysql-community-server mysql-devel

バージョンを確認します。

$ mysqld --version
mysqld  Ver 5.7.18 for Linux on x86_64 (MySQL Community Server (GPL))

以下のコマンドでMySQL自動起動の設定を行います。

$ sudo systemctl enable mysqld.service

MySQLを起動します。

$ sudo systemctl start mysqld.service

MySQLのrootユーザーの初期パスワードを確認し、メモしておきます。

MySQL5.7からは、rootの初期パスワードは /var/log/mysqld.log に書き込まれます。

$ less /var/log/mysqld.log

このようにパスワードが含まれています。この場合だと GI(8KOU;xZvi がパスワードです。

[Note] A temporary password is generated for root@localhost: GI(8KOU;xZvi

セキュリティの初期設定

mysql_secure_installationを実行しセキュリティに関する初期設定を行います。 パスワードは先ほどメモした /var/log/mysqld.log に書かれていたものを使用します。

設定する内容については、以下のサイトを参考にするとよいでしょう。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.4.5 mysql_secure_installation — MySQL インストールのセキュリティー改善

$ mysql_secure_installation

文字コードの設定

/etc/my.cnf に以下の設定を追加することで、デフォルトの文字コードをutf8に変更します。

character-set-server = utf8

設定後はMySQLを再起動します。

$ sudo systemctl restart mysqld.service

ユーザを作成する

rootでMySQLにログインします。

$ mysql -u root -p

今回は、外部からは参照しないので、以下の設定を追加します。

mysql> CREATE USER 'ユーザ名'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';
mysql> GRANT ALL PRIVILEGES ON DB名.* TO `ユーザ名`@`localhost`;

以上で、MySQLの設定は完了です。

この手順は、以下のサイトを参考に作成しました。

MySQL :: MySQL 5.7 Reference Manual :: 2.5.1 Installing MySQL on Linux Using the MySQL Yum Repository

RHEL7でRailsアプリのサーバを構築した【Rubyのインストール・設定】

こちらは、

RHEL7でRailsアプリのサーバを構築した - takapiのブログ

Rubyのインストール・設定 に関する記事です。

takapi86.hatenablog.com

インストール済みの Ruby の削除

EC2のRHEL7では、元々インストールはされていませんでしたが、環境によってはデフォルトでRubyが入っている場合があります。 ほとんどの場合は、古いRubyが入っているので、一旦削除してしまいましょう。

$ sudo yum -y remove ruby

gitをインストールする

後ほど、 rbenv,ruby-build といったツールをダウンロードするのに必要です。

$ sudo yum -y install git

rbenvをインストールする

Rubyのバージョンの切り替えなどが簡単にできるツールであるrbenvをインストールします。 以下のサイトを参考にインストールします。

https://github.com/rbenv/rbenv

クローンします。

$ git clone --depth 1 https://github.com/rbenv/rbenv.git

.bash_profile に PATHを通します。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

echo 'eval "$(rbenv init -)"' >> ~/.bash_profile で何をしているかは、 こちらを参考にするとよいでしょう。

takatoshiono.hatenablog.com

一度、ログアウトし直すか、以下のコマンドで ~/.bash_profile を読みなおします。

$ source ~/.bash_profile

rbenv コマンドが使えるか確認します。

$ rbenv
rbenv 1.1.1-2-g615f844
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

ruby-buildをインストールする

rbenv の プラグインである ruby-build をインストールします。 実際にRubyコンパイルしてインストールしてくれるものです。

クローンします。

$ git clone --depth 1 https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

もう一度、rbenvコマンドを実行します。

$ rbenv
rbenv 1.1.1-2-g615f844
Usage: rbenv <command> [<args>]

Some useful rbenv commands are:
   commands    List all available rbenv commands
   local       Set or show the local application-specific Ruby version
   global      Set or show the global Ruby version
   shell       Set or show the shell-specific Ruby version
   install     Install a Ruby version using ruby-build
   uninstall   Uninstall a specific Ruby version
   rehash      Rehash rbenv shims (run this after installing executables)
   version     Show the current Ruby version and its origin
   versions    List all Ruby versions available to rbenv
   which       Display the full path to an executable
   whence      List all Ruby versions that contain the given executable

ruby-build をクローンする前になかった install,uninstall が表示されていれば成功です。

Ruby2.4.1をインストール

EC2のRHEL7では、Rubyコンパイルに以下のライブラリが必要なのでインストールしておきます。

$ sudo yum install -y gcc bzip2 openssl-devel readline-devel zlib-devel

Rubyコンパイル・インストールします。

rbenv install 2.4.1

スペックによりますが、結構時間がかかるので待ちます。

インストールしたRuby2.4.1を使うので、以下のコマンドで使えるようにします。

rbenv global 2.4.1

Rubyがインストールされているか確認する。

ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

以上でRuby のインストールは完了です。

自宅のubuntu-16.04マシンのシェルをfishに変更した

自宅のubuntu-16.04マシンのシェルをfishに変更したので手順をメモしておきます。

また、pecoとの連携もしていきます。

fish をインストール

sudo apt-add-repository ppa:fish-shell/release-2
sudo apt-get update
sudo apt-get install fish

apt-add-repository コマンドがない場合は以下の手順で導入します。

sudo apt-get install apt-file
sudo apt-file update
sudo apt-get install software-properties-common

fish をデフォルトシェルにする

追記:

fish はデフォルトシェルにしないほうが良いんじゃないかなー。というのをこちらのエントリーに書きました。 良ければ見てください。 fish をデフォルトシェルに設定しない - takapiのブログ

chsh -s /usr/bin/fish

端末を開き直し、 echo $SHELL コマンドで確認します。

echo $SHELL
/usr/bin/zsh

あれ・・・

GUI環境の場合は一度ログアウトしてあげる必要がありそうです。

echo $SHELL
/usr/bin/fish

fishになっていることを確認しました。

fish の基本設定

config ディレクトリを作成します。

mkdir -p ~/.config/fish

初期設定ファイルを作成します。

vim ~/.config/fish/config.fish

~/.config/fish/config.fish へ以下のようにPATHを追加します。

set -g -x PATH /usr/local/bin $PATH

oh-my-fish をインストール

git がない場合はインストールしておきます

sudo apt-get install git

以下のcurlコマンドで oh-my-fish をインストールします。 ※直接シェルスクリプトを実行するので、中身は必ず確認しておいてください。

curl -L http://get.oh-my.fish | fish

以下のコマンドを打つと、ブラウザが立ち上がり、 fishの設定をGUIで変更できるようになります。

fish_config

私は、 colorfish defaultpromptAcidhub にしました。

peco をインストール

cd ~
wget https://github.com/peco/peco/releases/download/v0.5.1/peco_linux_amd64.tar.gz
tar zxvf peco_linux_amd64.tar.gz
sudo cp peco_linux_amd64/peco /usr/local/bin/
sudo chmod 777 /usr/local/bin/peco

peco と fish の連携

こちらの記事を参考にしました。 https://www.key-p.com/blog/staff/archives/105041

pecoプラグインをインストールします。

omf install peco

~/.config/fish/config.fish に以下を追加します。

#peco
function fish_user_key_bindings
    bind \cr peco_select_history
end

コンソールを開き直すなどし、設定ファイルを読み直したあとに Ctrl + r を押すといい感じに履歴とpecoが連携してくれます。

以上で、fish、pecoのインストールは完了です。

参考サイト