さくらのVPS上にサーバーを立てたときにやったこと備忘録

# サーバー環境
 * CentOS6
 * ruby 2.4.1
 * rails 5.1
 * node.js 7.10.0
 * mysql 5.7.18

# 各種設定手順
### デフォルトで入っているyumパッケージの更新
```
# yum update
```
### wgetのインストール
```
# yum install wget
```
### gitのインストール
```
# yum install git
```
## NTPのインストールと設定
※デフォルトで設定されているが一応、設定する
[NTP](https://ja.wikipedia.org/wiki/Network_Time_Protocol)とは、NTPとは、NetWork Time Protocolの略。時刻を問い合わせる機能を持ち、正確な時間をコンピュータに反映することができるもの。

### NTPのインストール

```
# yum install ntp
```
### NTPの設定
ntp.nict.jpというサーバから正確な時刻を取得する。

```
# ntpdate ntp.nict.jp
```
時刻を自動的に同期するようにする

```
# vi /etc/ntp.conf
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
```
と記載されているところを

```
server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp
```
とする。
### NTPを起動
```
# service ntpd start
```
### NTPを常時起動
```
# chkconfig ntpd on
```
* [CentOSにntpサーバを入れて、日本標準時刻に自動的に合わせるためのメモ](http://qiita.com/tsu_nera/items/9be676b04b190e45b281)

## cronのインストール
※デフォルトで設定されているが一応、設定する
[cron](https://ja.wikipedia.org/wiki/Crontab)とはコマンドの定時実行のスケジュール管理を行うために用いられるコマンド。
### cronのインストール
```
# yum install crontabs
# yum install vixie-cron
```
### cronを起動する
```
# service crond start
```
### crontabの確認
```
# crontab -l
```
* [CentOS5へのcrontabインストール](http://d.hatena.ne.jp/momiage3dau/20081204/1228388516)

# swap領域の確保
初期設定だと[swap領域](http://e-words.jp/w/%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97.html)が確保されていないので、メモリを使いすぎると、使いすぎてるプロセスがキルされます。それだとrailsやnginxをサーバーとして起動しているときに、いつの間にかkillされてしまうことがあり、困るのでswap領域を確保しておきます。
※ただし、スワップ領域を使うことになると処理が重くなるので注意が必要。
### swap割当用にディスクを確保
```
# dd if=/dev/zero of=/swapfile bs=1M count=1024
```
of はswapfileのパス、bsはブロックサイズ(1Mで1MB)、countはブロック数なので、`1MB * 1024個 = 1GB`のswap領域を確保したことになる。
確保すべくswap領域の目安はこちらを参照。

* [推奨される Swap 領域の目安](http://server.etutsplus.com/allocate-swap-space/)

### 確保した領域をswapファイルに変換
```
# mkswap /swapfile
```
### swapファイルを有効化
```
# swapon /swapfile
```
### freeコマンドとswaponコマンドで確認
```
# free -m
# swapon -s
```

### 自動で有効化するように設定
```
# vi /etc/fstab
以下を追記
/swapfile swap swap defaults 0 0
```
ここまできたら、念のため一旦PCをrebootする。(しなくても大丈夫だと思うが)

### 拡張したSWAP領域を外す場合
```
# swapoff /swpfile 
```
swap領域を拡大したいときは一旦外して、上記のコマンドを実行すると拡大できる。

* [CentOS7, Ruby on Rails 5, PumaでProducrion環境構築@VPS + Capistranoでのデプロイ](http://qiita.com/eiei19/items/7c08d358c82cb538def0)
* [サービスを止めずにSWAP領域を拡張する](http://qiita.com/sand_bash/items/30cb42ed53946e6eefa5)

# MySQLのインストールと設定
## MySQLのインストール
### デフォルトで入っているMySQLが5.1と古すぎるので消す
```
# yum uninstall mysql
# yum remove mysql-server mysql-devel
```
### rpm経由でMySQL5.7をダウンロード
```
# rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
```
### yumで確認
```
# yum info mysql-community-server
```
### yum経由でMySQL5.7をインストール
```
# yum install mysql-community-server
```
### インストールできているか確認する
```
# rpm -qa | grep mysql
# mysql --version
```
## MySQLの設定
### my.cnfを修正して、MySQLに保存するデータをUTF8にする。
```mysql:my.cnf
# vi /etc/my.cnf
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
```
### MySQLを起動
```
# service mysqld start
```
### MySQLを自動的に起動させる
```
# chkconfig mysqld on
```
### MySQLの設定のためにインストール
```
# yum install mysql-devel
```
### MySQLの初期パスワード
```
# grep 'temporary password' /var/log/mysqld.log
```
### パスワードの変更
初期パスワードを使い、MySQLに接続

```
# mysql -u root -p
```

接続したら初期パスワードからパスワードを変更

```
>set password for 'root'@'localhost' = password('大文字小文字英数字記号を混ぜたもの');
>exit
```

MySQL5.7以降では設定できるパスワードが`'大文字小文字英数字記号を混ぜたもの'`にしないといけない。
その他、ユーザーを作成したり、アクセス権を変更したりなど、必要に応じて行う。

# nginxのインストールとiptablesの設定
## nginxをインストールして、起動する
### nginxをrpmを用いてダウンロード
```
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```
### rpmでダウンロードしたものをyumでインストールする
```
# yum install nginx
```
### nginxを起動する
```
# service nginx start
```
### nginxを常時起動する
```
# chkconfig nginx on
```
## iptable(ファイアーウォール)を編集してポートを開放する
nginxが起動していれば、ブラウザwebページを確認することができるが、iptablesでアクセスに必要な[ポート番号](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7)が開放されていなければ見ることができない。
そこでアクセスするのに必要なポート番号の開放を行う。
### 開いているポート番号を確認する
```
# iptables -nL
```
### iptablesの場所を探す。
```
# which iptables
```
### ポートを開放する設定を記述
```
# vi /etc/sysconfig/iptables

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m state --syn --state NEW --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

COMMIT
```
iptablesの設定や意味について、詳しくは[こちら](http://knowledge.sakura.ad.jp/beginner/4048/)を参照。

### 変更した内容を反映させる。
```
# service iptables restart
```

### ポートが開いているか確認する
コマンドで確認

```
# iptables -nL
```

ブラウザで確認するには、
`http://[サーバーのIPアドレス]`
これでnginxが稼働していれば画像のような画面が表示されればOK。
![nginx_3.png](https://qiita-image-store.s3.amazonaws.com/0/72596/e167bf5d-1940-bfff-5673-de6ddb3490aa.png)


# node.jsのインストール
 * ruby on railsをスムーズにインストールする
 * websocketサーバーはnode.jsのほうが使いやすい(実際に使うケースについては後日記載)

このためにnode.jsをインストールする。
※node.jsをいれなかった場合、railsを起動させるにはtherubyracerというgemをインストールする必要がある。このgemのインストールは手間取るので、インストールしないですすめたい。
### [nodebrew](https://github.com/hokaccha/nodebrew)をインストール
node.jsのバージョン管理ツールである[nodebrew](https://github.com/hokaccha/nodebrew)を使ってnode.jsをインストールする。

```
# curl -L git.io/nodebrew | perl - setup
```

### パスを通す
```
# vi ~/.bashrc
以下を追記
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

そして通したパスを反映する。

```
# source ~/.bashrc
```

### インストール可能なnode.jsのバージョンを調べる
```
# nodebrew ls-remote
```

### node.jsのバイナリをインストール

```
# nodebrew install-binary v7.10.0
```

### いつも使うnode.jsのバージョンに設定

```
# nodebrew alias default v7.10.0
```

#ruby + railsのインストール
### RVMのインストール
RVMをインストールしようとすると警告が出るので先にSSLの更新をしておく

```
# gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
```

[RVM](https://rvm.io/)をインストール

```
# curl -sSL https://get.rvm.io | bash -s stable
```

### Rubyのインストール
RVMでインストール可能なrubyのバージョンを調べる

```
# rvm list known
```

ruby をインストール

```
# rvm install 2.4.1
```

インストールしたrubyを使えるようにする

```
# rvm use 2.4.1
```

プロジェクトごとにインストールするgemは違うので、gemsetを作成する

```
rvm gemset create project_name
```

作成したgemsetを使えるようにする。

```
# rvm gemset use project_name
```

毎回、rubyを有効にする設定を行うのは面倒なので.rvmrcというファイルを作ると、プロジェクトの場所に移動したら自動的にrvmにある設定を有効にしてくれます。
https://rvm.io/workflow/rvmrc

```
# vi .rvmrc
以下を記述
rvm use 2.4.1
rvm gemset use project_name
```

# Railsの設定
### [bundler](http://bundler.io/)のインストール
まずrubyのgemを一気にインストールさせるためにbundlerをインストールする。

```
# gem install bundler
```

### railsの導入
 * すでに作成済みのrailsプロジェクトを使用する場合  

```
# git clone remote_progect
# bundle install
```

 * 新しくrailsプロジェクトを立ち上げたいとき

```
# gem install rails
# rails new ./
# bundle install
```

### railsとmysqlをつなぐ
新しくrailsプロジェクトを立ち上げたとき Gemfile というファイルが出来上がっている。ここにrubyやrailsで使いたいライブラリ(gem)記述し、bundle installとするとライブラリが一気にインストールされる
ここではrailsとmysqlを使いたいので、rubyとmysqlをつなぐライブラリ、[mysql](https://github.com/brianmario/mysql2)を使う。Gemfileに

```ruby:Gemfile
gem 'mysql2'
```

を追加する。(gem 'sqlite3'は消す)
そして`config/database.yml`の該当箇所を以下のように書き換える

```yml:database.yml
adapter: mysql2
```

さらにmysqlにアクセするためのusernameとpasswordもここに記述する
### DBとテーブルの作成
Databaseを作成

```
# rails db:create
```

DataMigrationを行いテーブル作成

```
# rails db:migrate
```

### railsサーバーの起動

```
# rails server
```

でrails server(rails 5.0以降だと[puma](https://github.com/puma/puma))が起動する。
デフォルトが3000番ポートでサーバーが立ち上がるので、
ローカルでは http://localhost:3000/ にアクセスするとページが表示される。
![20160626180707.png](https://qiita-image-store.s3.amazonaws.com/0/72596/30dffbf8-3722-5ff7-d781-e130d7527790.png)


上記iptablesの設定で3000番ポートを開放していた場合、ブラウザで
`http://[サーバーのIPアドレス]:3000/`
と入力するとページが表示される。

# nginxから、railsサーバーにリバースプロキシする
nginxの設定ファイルを編集して、nginxで受けたものをrailsサーバーに転送できるようにする。(リバースプロキシ)
この設定をする理由として

 * nginxを止めることは今後ほぼ無い(あまり更新が入らない)
 * nginxを[ロードバランサ](http://knowledge.sakura.ad.jp/sacloud/6274/)として、複数のrailsサーバーに負荷を分散することができる
 * 80番(HTTP)、443番(HTTPS)といったお決まりの番号([ウェルノウンポート番号](https://ja.wikipedia.org/wiki/TCP%E3%82%84UDP%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E7%95%AA%E5%8F%B7%E3%81%AE%E4%B8%80%E8%A6%A7#.E3.82.A6.E3.82.A7.E3.83.AB.E3.83.8E.E3.82.A6.E3.83.B3.E3.83.9D.E3.83.BC.E3.83.88.E7.95.AA.E5.8F.B7_.280.E2.80.931023.29))を使いたい場合にroot化してサーバーを立ち上げなくてもいい
 * nginxで受けることでエラーがあったり、railsサーバが停止していても何かしらのresponseを返せる(メンテナンスなど)

がある。

### nginxの設定ファイルを編集しリバースプロキシできるようにする。
※ちょくちょくいじることになるのでgitでバージョン管理した方がいいです。
nginxの設定ファイル、`nginx.conf`を編集して、リバースプロキシを有効にします。

```nginx:nginx.conf
vi /etc/nginx/nginx.conf
http{
  ...
  server {
    listen 80;
    server_name server_name;

　　　　　　　　location / {
      index index.html index.htm;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://127.0.0.1:3000;
    }
    ...
  }
}
```

なお、
`proxy_set_header X-Forwarded-Proto https;`
としているのは、これをつけて、rails側に送らないと、『リダイレクトが繰り返し行われました。』のようなメッセージがブラウザで表示されるためです。
[Rails + Nginx HTTPSでアクセスをする](http://keruuweb.com/rails-nginx-https%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E3%81%99%E3%82%8B/)

### 編集した内容を反映させる

```
# service nginx restart
```

これでブラウザで`http://[サーバーのIPアドレス]`にアクセスしてrailsのページが表示されればOK

# SSL化したい
こちらに記載しましたので、こちらを参照。
[nginx と Let's Encrypt で1台のサーバーで複数サイトを SSL 化](http://qiita.com/taptappun/items/5a87eda053d7181430c9)
また、リバースプロキシなどnginxの設定は
[ActivatingNginxConf](https://github.com/TakuKobayashi/ActivatingNginxConf)
こちらも参照


#参考
* [【5分で！】centOS6.5にMySQLの最新版をyum使ってインストールするぜ](http://qiita.com/ritukiii/items/f4e2fbae5d6e7b1aa5f9)
* [CentOS6にMySQL5.7をyumでインストール](http://qiita.com/ozawan/items/648bdc146041ceb2e390)
* [ファイアウォールiptablesを簡単解説～初心者でもよくわかる！VPSによるWebサーバー運用講座(4)](http://knowledge.sakura.ad.jp/beginner/4048/)
* [Rails + Nginx HTTPSでアクセスをする](http://keruuweb.com/rails-nginx-https%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E3%81%99%E3%82%8B/)
* [Nginx リバースプロキシサーバ構築](https://sys-guard.com/yuu_linux/19-01.php) 
* [ロードバランサの仕組み – 「さくらのクラウド入門」(4)](http://knowledge.sakura.ad.jp/sacloud/6274/)
* [CentOS7, Ruby on Rails 5, PumaでProducrion環境構築@VPS + Capistranoでのデプロイ](http://qiita.com/eiei19/items/7c08d358c82cb538def0)
* [サービスを止めずにSWAP領域を拡張する](http://qiita.com/sand_bash/items/30cb42ed53946e6eefa5)
* [推奨される Swap 領域の目安](http://server.etutsplus.com/allocate-swap-space/)
* [CentOS7, Ruby on Rails 5, PumaでProducrion環境構築@VPS + Capistranoでのデプロイ](http://qiita.com/eiei19/items/7c08d358c82cb538def0)