Help us understand the problem. What is going on with this article?

さくらの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とは、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

cronのインストール

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

cronのインストール

# yum install crontabs
# yum install vixie-cron

cronを起動する

# service crond start

crontabの確認

# crontab -l

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ファイルに変換

# 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領域を拡大したいときは一旦外して、上記のコマンドを実行すると拡大できる。

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化したい

こちらに記載しましたので、こちらを参照。
nginx と Let's Encrypt で1台のサーバーで複数サイトを SSL 化
また、リバースプロキシなどnginxの設定は
ActivatingNginxConf
こちらも参照

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away