概要
注意,自分用メモです!!!
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
以上