Railsアプリ〜デプロイへの道〜その①リモートサーバーへのSSH接続編【ConoHa VPS・CentOS・Capistrano3・Nginx・Unicorn】

Railsアプリケーションをデプロイした時の手順をまとめました。

今回の内容はリモートサーバー（ConoHa VPS）へのSSH接続に関してです。

僕自身はこちらの記事を参考にデプロイをしたので、内容もこちらの記事がベースとなっています。
https://qiita.com/ryo2132/items/f62690f0b16ec11270fe
SSHの設定からデプロイまでに必要な情報が網羅されていて、この記事のおかげで短期間でデプロイを完了することができました。

しかし、バージョンなどの問題で、そのままではデプロイができなかったので、
僕が実際にデプロイをした手順に修正しています。

また、デプロイ時に発生したエラーなども載せています。

これらの記事は自身の理解を深めるために、振り返りとしてデプロイ手順をまとめたものですが、
これからデプロイをする方の役に立てば嬉しいです。

同じ開発環境ならこの記事の通りにすれば設定はできるはずです。

〈関連記事〉
[Railsアプリ〜デプロイへの道〜その②Ruby・MySQLインストール編](https://qiita.com/fukaya_dea/items/ab7b380827eedf885c16)
[Railsアプリ〜デプロイへの道〜その③Capistrano3設定編](https://qiita.com/fukaya_dea/items/b271cf5382ca283baa31)
##開発環境

・Mac OS
・Rails 5.2.3
・Ruby 2.5.1
・ConoHa VPS
・CentOS 7.6
・Capistrano3
・Nginx
・Unicorn


##SSHの設定
リモートサーバーにローカルからログインするまでの設定です。
初めてだと結構苦戦するところです。
頑張って乗り切ってください。

ここから先はサーバーの設定をしていくわけですが、ConoHaの場合、ConoHaにログインしてコンソールから操作をするか、ローカルからSSHでログインして操作をします。

コンソールが使いにくいですが、ローカルでのSSHログインでエラーが発生した時には直接コンソールからサーバーを操作します。

 [ConoHa VPS](https://www.conoha.jp/vps/)の契約については省略します。


##1.ConoHaでサーバーの追加
①オプションのSSH KEYでキーを新規作成＞自動作成＞追加＞ダウンロード
SSH KEYが自動作成され、ローカルにダウンロードされます。
②SSH KEYのキーを選択で作成したキーを選択
③追加


##2.SSHのタイムアウト防止
SSH接続はしばらく操作をしていないとタイムアウトで接続が切断されてしまいます。

そのままだと非常に操作がしずづらいので、サーバー側又はクライアント側でSSHの設定を変更しましょう。
詳しくはこちらの記事が参考になります。
https://qiita.com/u_nako/items/c545e7fc0dd5b8ec85fb

サーバー側の場合



```:/etc/ssh/sshd_config
ClientAliveInterval [秒数]
ClientAliveCountMax [回数]
```

クライアント側の場合

```/etc/ssh/ssh_config または ~/.ssh/config
ServerAliveInterval [秒数]
ServerAliveCountMax [回数]
```

##3.SSH接続
先ほど作成しDLしたpemキーでサーバーにログインします。
ローカル

```
sudo ssh -i ~/Downloads/キー root@サーバーのIPアドレス
#ローカルPASS
＃サーバーPASS
＃途中yes / noと選択肢が出るのでyesと入力
```

###WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!エラーが出た場合
known_hostsからアクセス情報を削除する。
ローカル

```
$ sudo vi /var/root/.ssh/known_hosts
# known_hostsの中身を削除してファイルを閉じる
```

参考：https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938

##4.user登録・sudo設定
サーバー側の設定です。

###user登録
サーバーを操作するためのユーザーを作成します。
参考：https://support.conoha.jp/v/useradd/?btn_id=v-sudo-related_v-useradd#02

```
# ユーザー作成
$ useradd [ユーザー名]
# ユーザーのパスワード設定
$ passwd [ユーザー名]
New password: [任意のパスワードを入力]
Retype new password: [↑で入力したパスワードを再度入力]

[passwd: all authentication tokens updated successfully.]と表示されていれば設定完了
```

###sudo設定
作成したユーザーでsudoコマンドを使えるようにします。
ちなみに、sudo は”superuser do”の略で、sudoコマンドを使うことでrootユーザーでしか使えないコマンドを一般ユーザーでも使えるようになります。

参考：https://support.conoha.jp/v/sudo/?btn_id=v-useradd-sidebar_v-sudo

rootでログインし、以下のコマンドを入力。

```
$ usermod -G wheel [所属させるユーザー名]
```

ConoHaの場合、CentOS７ではwheelグループに所属している一般ユーザーはsudoを利用できます。
なので、上記では作成した一般ユーザーをwheelグループに所属させています。

##5.SSHログイン設定
sshの設定ファイルでsshログインを許可し、rootログインの禁止します。
サーバー

```
$ sudo vim /etc/ssh/sshd_config

# 公開鍵認証を許可
# #でコメントアウトされている場合は#を削除しコメントアウトを解除。
# noの場合はyesに
PubkeyAuthentication yes

# 公開鍵の場所を設定。初期値で大丈夫です。
AuthorizedKeysFile      .ssh/authorized_keys

# rootユーザーでのログインを禁止。
PermitRootLogin no
```

完了したらsshdを再起動

```
$ sudo service sshd restart
```

※ここでパスワードログインを禁止するとローカルからログインできなくなるので注意


##6.ポート番号変更・ファイアウォール
参考：https://www.softel.co.jp/blogs/tech/archives/1516

サーバー

###ポート番号変更
SSHのデフォルトのポート番号は２２です。
不正アクセス対策のため、ポート番号を変更します。

```
sudo vi /etc/ssh/sshd_config
#Port 22 ← デフォルトはポート番号22
Port 54321 ←任意の空きポート番号を指定する（例）
```

ポート番号は、WELL KNOWN ポート番号（0-1023）、REGISTERED ポート番号（1024-49151）を避けて、基本的に空いている49152番から65535番で指定するとよいでしょう。

完了したらsshdを再起動

```
$ sudo service sshd restart
```

###ファイアウォール
ポート番号を変えたので、ファイアウォールの設定を修正します。

参考：https://qiita.com/DQNEO/items/5780d81b2e0af4cc1544
参考：https://qiita.com/sak_2/items/fe996c518e8075214b49

####firewalldの起動・確認
起動

```
$ sudo systemctl enable firewalld
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
ln -s '/usr/lib/systemd/system/firewalld.service' '/etc/systemd/system/basic.target.wants/firewalld.service'

$ sudo systemctl start firewalld
```

確認

```
$ systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Mon 2015-04-06 14:33:20 UTC; 1s ago
 Main PID: 10921 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─10921 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Apr 06 14:33:20 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
```

####/usr/lib/firewalld/ と /etc/firewalld/ の使い分け
/usr/lib/firewalld/ 以下にはシステムデフォルトの設定ファイルが置かれています。ここは基本的にいじってはいけません。
自分用にカスタマイズしたい場合は、/usr/lib/firewalld/にあるファイルを /etc/firewalld/にコピーしてから編集します。
/etc/firewalld/下にファイルが存在する場合は、それによってシステム設定が上書きされます。

####/usr/lib/firewalld/services/ssh.xml を確認
サービスごとの設定ファイルは/usr/lib/firewalld/services/の下にあります。 確認してみましょう。

```
$ cat /usr/lib/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>
```

####/etc/firewalld/services/ssh.xml ファイルを作成
/etc/firewalld/ の下にファイルを作ればこの設定でシステムデフォルトを上書きできます。 作るといってもコピーして編集するだけです。

```
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml
```

ポート番号を書き換えます。

```
$ sudo vim /etc/firewalld/services/ssh.xml

/etc/firewalld/services/ssh.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>　#削除
  <port protocol="tcp" port="新しいポート番号"/> #追加
</service>
```

リロードして設定を反映させる。

```
$ sudo firewall-cmd --reload
success
```

ポート番号をデフォルトから変更したので、以降はポート番号を指定してログインします。
ポート番号を指定しないとログインに失敗します。

```
$ sudo ssh -p ポート番号 -i ~/Downloads/キー root@IPアドレス
```

##7.公開鍵作成
いよいよ公開鍵の作成です。
これが終われば、SSHの設定は完了です。
もう一息なので頑張りましょう。

〈参考〉
https://qiita.com/ongaeshi/items/bb17ebfbd4d22057c8fd
https://webkaru.net/linux/ssh-keygen-command/
https://qiita.com/suthio/items/2760e4cff0e185fe2db9

###サーバー側で公開鍵の作成
サーバー

```
$ cd ~
$ mkdir .ssh # sshのフォルダ作成
$ cd .ssh

# キーペアの作成
$ ssh-keygen -t rsa -b 4096
Enter file in which to save the key: #エンターでOK
Enter passphrase: # 5文字以上のパスフレーズを入力                          
Enter same passphrase again: #5文字以上のパスフレーズを入力  

# 2つの鍵が作成されます
$ ls .
id_rsa id_rsa.pub

# id_rsa.pubが公開鍵です。これをsshd_configで設定したauthorized_keysにリネームします。
$ mv id_rsa.pub authorized_keys

# 権限の設定
$ chmod 700 ~/.ssh
$ chmod 600 authorized_keys

# 秘密鍵の内容を確認
# 表示された文字列をクリップボードにコピーしてください
# -----BEGIN RSA PRIVATE KEY-----から
# -----END RSA PRIVATE KEY-----までです。
$ cat id_rsa
-----BEGIN RSA PRIVATE KEY-----
xxxxxxxxxxxx
xxxxxxxxxxxx
xxxxxxxxxxxx
-----END RSA PRIVATE KEY——
```

〈参考〉
権限・パーミッション
http://itdoc.hitachi.co.jp/manuals/3021/3021313320/JPAS0348.HTM
所有者
https://linux-for-beginners.net/linux/command/chown/

###秘密鍵をローカルのSSHへ登録

ここはローカルでの作業です！

```
$ cd ~/.ssh

# 鍵の保存場所の作成
$ mkdir conoha_hoge #名前は任意

# 鍵ファイルの作成 
$ sudo cd conoha_hoge
$ vi id_rsa     
# 先程クリップボードにコピーした内容をそのまま貼り付けて保存

# sshの設定ファイルの作成
$ cd ..
$ vim config

~/.ssh/config
Host conoha_hoge
  HostName サーバのIPアドレス
  User hoge
  Port 変更したSSHのポート番号
  IdentityFile  ~/.ssh/conoha_hoge/id_rsa


# 権限の設定
cd conoha_hoge
chmod 600 id_rsa
```

以下のコードでリモートサーバーにアクセスできるようになりました。

```
$ ssh conoha_hoge
# パスフレーズが聞かれるので作成時のものを入力
```

###SSH agentへの登録

今のままでもサーバーへアクセスはできますが、毎回パスフレーズを入力するのは面倒です。
また、このままではデプロイ時に以下のエラーが発生します。

```
SSHKit::Runner::ExecuteError: Exception while executing on host
Net::SSH::AuthenticationFailed: Authentication failed for user
```

そうならないために、ssh-agentに鍵を登録します。
そうすることで、ssh接続時に鍵が自動で読み込まれるようになります。

参考：https://qiita.com/naoki_mochizuki/items/93ee2643a4c6ab0a20f5

以下のように入力してください。

```
$ sudo ssh-add -K ~/.ssh/conoha_hoge/id_rsa
```

これでパスフレーズなしでサーバーに接続できます。

##8.パスワードログインの禁止
サーバー

```
sudo vim /etc/ssh/sshd_config
# パスワードログインを禁止。yesからnoへ変更
PasswordAuthentication no
```

##SSH接続エラー
SSHの接続エラーは度々発生しますが、初めてのデプロイだととても焦ります。
なので、僕がデプロイしている時に接続エラーが発生した際に参考にした記事をまとめました。

接続エラーが発生した時は参考にしてみてください。

https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938
http://www.profaim.jp/tools/soft/network/ssh/server_changed.php
https://teratail.com/questions/140243

##まとめ

以上、
Railsアプリ〜デプロイへの道〜その①リモートサーバーへのSSH接続編でした。

次の記事はRubyとMySQLのインストール・設定です。
[Railsアプリ〜デプロイへの道〜その②Ruby・MySQLインストール編](https://qiita.com/fukaya_dea/items/ab7b380827eedf885c16)

SSH接続はデプロイ作業の最初の山です。
なので割と詳しく書きました。

はじめてのデプロイ作業は大変ですがとても勉強になります。
挫けず頑張りましょう。

少しでもこの記事が役に立てば嬉しいです。