ruby on rails + nginx + mysql + node.jsでさくらのVPS上にサーバーを立てたときにやったこと備忘録

  • 4
    いいね
  • 0
    コメント

サーバー環境

  • 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とは、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サーバを入れて、日本標準時刻に自動的に合わせるためのメモ

cronのインストール

※デフォルトで設定されているが一応、設定する
cronとはコマンドの定時実行のスケジュール管理を行うために用いられるコマンド。

cronのインストール

# yum install crontabs
# yum install vixie-cron

cronを起動する

# service crond start

crontabの確認

# crontab -l

CentOS5へのcrontabインストール

swap領域の確保

初期設定だとswap領域が確保されていないので、メモリを使いすぎると、使いすぎてるプロセスがキルされます。それだと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 領域の目安

確保した領域を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でのデプロイ
サービスを止めずにSWAP領域を拡張する

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にする。

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でアクセスに必要なポート番号が開放されていなければ見ることができない。
そこでアクセスするのに必要なポート番号の開放を行う。

開いているポート番号を確認する

# 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の設定や意味について、詳しくはこちらを参照。

変更した内容を反映させる。

# service iptables restart

ポートが開いているか確認する

コマンドで確認

# iptables -nL

ブラウザで確認するには、
http://[サーバーのIPアドレス]
これでnginxが稼働していれば画像のような画面が表示されればOK。
nginx_3.png

node.jsのインストール

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

このためにnode.jsをインストールする。
※node.jsをいれなかった場合、railsを起動させるにはtherubyracerというgemをインストールする必要がある。このgemのインストールは手間取るので、インストールしないですすめたい。

nodebrewをインストール

node.jsのバージョン管理ツールである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をインストール

# 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のインストール

まず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を使う。Gemfileに

Gemfile
gem 'mysql2'

を追加する。(gem 'sqlite3'は消す)
そしてconfig/database.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)が起動する。
デフォルトが3000番ポートでサーバーが立ち上がるので、
ローカルでは http://localhost:3000/ にアクセスするとページが表示される。
20160626180707.png

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

nginxから、railsサーバーにリバースプロキシする

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

  • nginxを止めることは今後ほぼ無い(あまり更新が入らない)
  • nginxをロードバランサとして、複数のrailsサーバーに負荷を分散することができる
  • 80番(HTTP)、443番(HTTPS)といったお決まりの番号(ウェルノウンポート番号)を使いたい場合にroot化してサーバーを立ち上げなくてもいい
  • nginxで受けることでエラーがあったり、railsサーバが停止していても何かしらのresponseを返せる(メンテナンスなど)

がある。

nginxの設定ファイルを編集しリバースプロキシできるようにする。

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

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でアクセスをする

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

# service nginx restart

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

SSL化したい

こちらに記載しましたので、こちらを参照。
http://qiita.com/taptappun/items/5a87eda053d7181430c9
また、リバースプロキシなどnginxの設定は
https://github.com/TakuKobayashi/ActivatingNginxConf
こちらも参照

参考

【5分で!】centOS6.5にMySQLの最新版をyum使ってインストールするぜ
CentOS6にMySQL5.7をyumでインストール
ファイアウォールiptablesを簡単解説~初心者でもよくわかる!VPSによるWebサーバー運用講座(4)
Rails + Nginx HTTPSでアクセスをする
Nginx リバースプロキシサーバ構築
ロードバランサの仕組み – 「さくらのクラウド入門」(4)
CentOS7, Ruby on Rails 5, PumaでProducrion環境構築@VPS + Capistranoでのデプロイ
サービスを止めずにSWAP領域を拡張する
推奨される Swap 領域の目安
CentOS7, Ruby on Rails 5, PumaでProducrion環境構築@VPS + Capistranoでのデプロイ