Edited at

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

More than 1 year has passed since last update.


サーバー環境


  • 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。


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/ にアクセスするとページが表示される。

上記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でのデプロイ

  • swap領域の確保
  • MySQLのインストールと設定
  • nginxのインストールとiptablesの設定
  • node.jsのインストール
  • ruby + railsのインストール
  • Railsの設定
  • nginxから、railsサーバーにリバースプロキシする
  • SSL化したい
  • 参考