rails5本番環境構築(Rails5.2,Ruby2.5,Puma,Centos7,Mysql,Nginx)

# 概要
注意,自分用メモです!!!
railsのアプリは、チュートリアルを元に作れる。
herokuにデプロイできる。しかし、VPS等に本番環境を構築したことがない。
そこで、一からサーバ公開できるように構築していきます。

---
# 構成とバージョン
- Centos7.5
- nginx 1.15
- mysql 8.0
- Ruby2.5.1　
- Rails5.2
- puma(Rails5.2に付属)

---
# Centos7の基本セットアップ
rootでssh接続して作業

```
更新
sudo yum -y update

アプリ用ユーザ作成
useradd rails
passwd rails

sudoできるように設定
usermod -aG wheel rails

SELinux無効
vi /etc/selinux/config(書き換え)
SELINUX=disabled
```
以降は基本的に作成したユーザで作業

---
# ssh接続の設定
作成したユーザでssh接続して作業

```
sshの鍵の生成
ssh-keygen -t rsa

公開かぎとパーミッションの設定 
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
rm id_rsa.pub

自分のPCに秘密鍵を移動
秘密鍵の管理は注意
scp rails@hogehoge.com:~/.ssh/id_rsa ./
```

---
# sshのセキュリティ制限設定1
設定に失敗すると二度とログインできなるので複数ターミナルから,
rootと作成ユーザをssh接続できるように作業

ここは、sshでroot接続して作業

```
sshの設定をバックアップ
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old

パスワードログイン無効
vi /etc/ssh/sshd_config　#(書き換え)
PasswordAuthentication no

デーモンを再起動して確認
systemctl restart sshd
パスワード無効になっている確認
ssh rails@hogehoge.com

rootログイン禁止
vi /etc/ssh/sshd_config(書き換え)
PermitRootLogin no

デーモンを再起動して確認
systemctl restart sshd
rootでログインできないか確認
ssh  root@hogehoge.com
```

---
# sshのセキュリティ制限設定2
49152 ～ 65535番の中から好きなポートに変更

```
sshのポート変更
vi /etc/ssh/sshd_config(書き換え)
Port 55312

ファイアウォールからssh規定の22を削除
sudo firewall-cmd --permanent --remove-service=ssh
再読込
firewall-cmd --reload
消えているか確認
firewall-cmd --list-all

新たにsshポート設定作成
バックアップとコピーする。ファイル名は設定したポート番号
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-55312.xml

ポート変更
vi /etc/firewalld/services/ssh-55312.xml #(書き換え)
<port protocol="tcp" port="55312"/> #設定したポート

```

---
# sshのセキュリティ制限設定3

```
sshポート追加
sudo firewall-cmd --permanent --add-service=ssh-55312
firewall-cmd --reload
firewall-cmd --list-all

成功するとこの様に表示されます
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh-55312
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

接続確認
ssh -p 55312 -i  ~/.ssh/rails_demo_id_rsa  rails@hogehoge.com
```

---
# Rubyインストール
```
rubyがビルドに必要なものをインストール
sudo yum -y install gcc make openssl openssl-devel gcc-c++ mysql-devel readline-devel　libxml2-devel libxslt-devel git bzip2

# 表示関連で使うnodeをインストール
sudo yum -y install epel-release
sudo yum -y install  nodejs npm

# アセットのコンパイルで必要
sudo npm install yarn -g

rbenvをインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

パスの設定
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

Rubyインストール
rbenv install 2.5.1
rbenv global 2.5.1↲

bundleのインストール
gem install bundler --no-ri --no-rdoc
```

---
# mysqlをインストール1

```
mariadbがあれば干渉するので確認して消す
rpm -qa | grep maria

存在した場合は消す
sudo yum remove mariadb-libsd
sudo rm -rf /var/lib/mysql/

rpmに登録してインストール
sudo  rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
sudo  yum -y install mysql-community-server mysql-devel

サービスの起動確認
sudo  systemctl start mysqld.service
起動を確認したらsystemctlに登録
sudo  systemctl enable mysqld.service

初期パスワードをログから確認
grep password /var/log/mysqld.log
下記の様に表示されます
A temporary password is generated for root@localhost: Wgw%k*uWk9Zl

mysql用の設定スクリプト起動
ログから確認した初期パスワードを新しいパスワードに書き換え
sudo mysql_secure_installation
```

---
# mysqlの設定とDB作成
mysqlの設定

```
sudo  vi /etc/my.cnf

追記する
default_password_lifetime=0 # パスワード有効期限を無効化
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8

mysqlを再起動して設定ミスがないか確認
sudo  systemctl restart mysqld.service
```

本番用DB作成

```
設定したユーザでログイン
mysql -u root -p
ユーザ作成
CREATE USER 'railsuser'@'localhost' IDENTIFIED BY 'Rails-demo123;';
DB作成
create database `blogdb`;
作成ユーザにDBの権限をつける
grant all on blogdb.* to 'rails'@'localhost';
```

---
# rails動作確認アプリ作成

```
mkdir railsdemo
bundle init

railsをgemからコメントアウト解除
bundle install --path=vendor/bundle --jobs=4

railsアプリ作成
bundle exec rails new ./ -B -d mysql --skip-turbolinks --skip-test
bundle install

mysqlで作ったDBの設定を書き込む
conf/database.yml

サンプルアプリ作成
bin/rails generate scaffold Post name:string title:string content:text
bin/rails db:migrate RAILS_ENV=production
bundle exec rails assets:precompile RAILS_ENV=production

サンプルアプリが起動するか確認
bin/rails s -e pduction
```

---
# pumaの設定

```

設定に追記
vi ./config/puma.rb
追記
bind "unix:////home/rails/railsdemo/tmp/sockets/puma.sock"

pumaから起動できるか確認
bundle exec puma -t 5:5 -p 3000 -e production -C config/puma.rb
```

---
# nginxインストール
```
yumでインストールできるように設定
nginx.repoを作成
sudo  vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

インストール
sudo  yum -y update
sudo yum -y install nginx

nginx起動
sudo  systemctl start nginx

httpの通信を許可する
firewall-cmd --permanent --add-service=http

Welcome to nginx!ページが確認できるたらsystemctlに登録
sudo  systemctl enable nginx
```

---
#　nginx設定
```
起動ユーザをpumaと揃える
sudo vi /etc/nginx/nginx.conf
user rails;　# unicorn側のユーザーに合わせる

リバースプロキシ設定
sudo vi /etc/nginx/conf.d/default.conf
upstream railsdemo  { # アプリケーションの名前
   server unix:home/rails/railsdemo/tmp/sockets/puma.sock; #pumaで設定したsock
}
server {
    listen       80;
    server_name  hogehoge.com;

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

    root   home/rails/railsdemo/public;

    location / {
        proxy_pass http://rails_demo; # アプリケーション名
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}
```

# pumaのsystemd登録
osが起動したときにpumaが起動するように設定

```
サービス作成
sudo vi /etc/systemd/system/puma.service
[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple
User=rails
WorkingDirectory=/home/vagrant/rails_demo
ExecStart=/home/vagrant/.rbenv/versions/2.5.1/bin/bundle exec puma  -C /home/vagrant/rails_demo/config/puma.rb

TimeoutSec=100
Restart=always

[Install]
WantedBy=multi-user.target

サービスを起動
sudo systemctl start puma
サービスが落ちていないか確認
sudo systemctl status puma
```

以上