さくらのVPS上にサーバーを立てたときにやったこと備忘録
※ Qiitaにて記述した記事を移行してきました→移行元:さくらの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にする。
# 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にある設定を有効にしてくれます。
# 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に
gem 'mysql2'
を追加する。(gem 'sqlite3'は消す)
そしてconfig/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
を編集して、リバースプロキシを有効にします。
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
こちらも参照
#参考
- 【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でのデプロイ
Discussion