bekkou68 の日記

Gogengo! や IT 技術など。

さくらVPS で Railsアプリ Gogengo! を Thin で起動してドメインを割り当てるまで

はじめに

Gogengo! をローンチするにあたってどのような手順をふんだかの覚書です。全体の流れは『はじめてのさくら VPS + CentOS の初期設定からチューニングなどの作業まとめ | ウェブル』を参考にしました。とても詳しくて助かりました!

ゴール

さくらVPS 上で Railsアプリ Gogengo! を Thin で起動してドメインを割り当ててアクセスできればOKです。
Nginx はかましません。Thin のインスタンス 1つだけです。お手軽です。手抜きとも言えます。しかしあなどることなかれ、開発合宿 でいまの環境で負荷テストしたら秒間10リクエストを10分流しても耐えてくれました。スモールスタートのサービスなら余裕で動いてくれるのではないでしょうか。
トラフィックが一気に増えない限り当分大丈夫そうですが、何があるかわからないし、むしろ何かあってほしいし、勉強のためにもそのうち Nginx + Unicorn あたりを試してみたいと思ってます。まずはお手軽スタートで Thin だけで動かします。
用意する環境のバージョンはこちら。

前提条件

環境

IPアドレスドメインはさくらVPS から割り当てられたものと置き換えてください。このエントリでは次のように想定します。

SSHログインするための準備(2015/06/05 更新)

コントロールパネルにログインしたらリモートコンソールをアクセスします。
初めてアクセスしたら "Server returned status code 0" と悲しいダイアログが表示されて使えませんでした。Java の実行をブラウザから許可したからか、しばらく放置していたからか、使えるようになってました。なぞ。
リモートコンソールが起動したら事前に設定した root の情報でログインします。

xxx-xxx-xxxxx login: root
Password: xxxxxx

そして次のコマンドを打ち込みます。

remote> passwd root
remote> yum -y install vim-enhanced # 何かと vim を使いたい
remote> adduser deploy
remote> passwd deploy

sudoer にユーザを追加します。

remote> sudo /usr/sbin/visudo

以下のように編集します。なお、JPキーボードだとコロンを打てない罠があるので、`$ loadkeys us` を事前に実行しておくといいかもしれません。ログアウトすると loadkeys の設定は元に戻ります。

  root   ALL=(ALL) ALL
+ deploy ALL=(ALL) ALL

リモートコンソールを終了します。iTerm などお好きな端末を起動して SSHログインできることを確認します。まずはパスワード認証で疎通確認をします。

local> ssh deploy@www12345ue.sakura.ne.jp

SSHポート番号を変更

セキュアにするため SSHのポートを変更します。22以外にします。今回は例として 10050 にします。

sakura> sudo vim /etc/ssh/sshd_config

このように編集します。

- Port 22
+ Port 10050

パスワード認証だとパスワードがバレたら終わりです。よりセキュアにするため公開鍵認証で SSH接続できるよう設定します。ssh-keygen で鍵はつくられているとします。

さくらVPS 上で .sshディレクトリをつくります。

sakura> mkdir .ssh

ローカルからさくらVPS へ公開鍵を転送し、適切なアクセス権を設定します。さくらVPSへの接続は保ちつつ、ローカルで別セッションを立てて次のコマンドを打ちます。

local> scp ~/.ssh/id_rsa.pub deploy@www12345ue.sakura.ne.jp:~/.ssh/authorized_keys

sakura> chmod 700 ~/.ssh
sakura> chmod 600 ~/.ssh/authorized_keys

これから適切にログインできる設定を行います。

sakura> sudo vim /etc/ssh/sshd_config

各項目を編集します。

PermitRootLogin no        # root によるログインを禁止
PasswordAuthentication no # すべてのユーザでパスワードによるログインを禁止する。認証鍵でなければログインできないようにする
PermitEmptyPassword no    # 空のパスワードでのログインを禁止

設定をロードします。

sakura> sudo /etc/init.d/sshd restart

さて、これから公開鍵で SSH接続することを確認しますが、ここで注意です。いま端末で開いているウィンドウではログアウトせず、別ウィンドウを立ち上げましょう。万が一設定に問題があった場合、二度とログインできなくなり、サーバの初期化をしてやり直さないといけないハメになります。

local> ssh deploy@www12345ue.sakura.ne.jp -p 10050

ログインできたら成功です。次のステップに進みましょう。

ファイアーウォールを構築する(2015年01月24日更新)

ファイルを新規作成します。

sakura> sudo vim /etc/sysconfig/iptables

ファイルの内容は次のようにします。10050を開けるのを忘れずに。

*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10050 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306  -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

# Outbound UDP Flood protection
-N udp-flood
-A OUTPUT -p udp -j udp-flood
-A udp-flood -p udp -m limit --limit 10/s -j RETURN
-A udp-flood -j LOG --log-level 4 --log-prefix "UDP-flood attempt: "
-A udp-flood -j DROP

COMMIT

参考: [Code Snippet: iptables settings to prevent UDP abuse](http://blog.thoward37.me/articles/code-snippet-iptables-settings-to-prevent-udp-floods/)


ロードします。

sakura> sudo /etc/rc.d/init.d/iptables restart

以下のコマンドで iptables が反映されていることが確認できます。

sakura> sudo iptables -L

つかってないデーモンを終了する

sakura> sudo /sbin/chkconfig auditd off
sakura> sudo /sbin/chkconfig autofs off
sakura> sudo /sbin/chkconfig avahi-daemon off
sakura> sudo /sbin/chkconfig bluetooth off
sakura> sudo /sbin/chkconfig cups off
sakura> sudo /sbin/chkconfig firstboot off
sakura> sudo /sbin/chkconfig gpm off
sakura> sudo /sbin/chkconfig haldaemon off
sakura> sudo /sbin/chkconfig hidd off
sakura> sudo /sbin/chkconfig isdn off
sakura> sudo /sbin/chkconfig kudzu off
sakura> sudo /sbin/chkconfig lvm2-monitor off
sakura> sudo /sbin/chkconfig mcstrans off
sakura> sudo /sbin/chkconfig mdmonitor off
sakura> sudo /sbin/chkconfig messagebus off
sakura> sudo /sbin/chkconfig netfs off
sakura> sudo /sbin/chkconfig nfslock off
sakura> sudo /sbin/chkconfig pcscd off
sakura> sudo /sbin/chkconfig portmap off
sakura> sudo /sbin/chkconfig rawdevices off
sakura> sudo /sbin/chkconfig restorecond off
sakura> sudo /sbin/chkconfig rpcgssd off
sakura> sudo /sbin/chkconfig rpcidmapd off
sakura> sudo /sbin/chkconfig smartd off
sakura> sudo /sbin/chkconfig xfs off
sakura> sudo /sbin/chkconfig yum-updatesd off

対象のデーモンない場合は実行できませんがスルーします。設定を反映させるためさくらVPS を再起動します。

sakura> sudo reboot

メモリ使用量を確認してみました。
再起動前。

sakura> free
             total       used       free     shared    buffers     cached
Mem:       1020580     611160     409420          0      76120     403700
-/+ buffers/cache:     131340     889240
Swap:      2097144          0    2097144

再起動後。

sakura> free
             total       used       free     shared    buffers     cached
Mem:       1020580     144508     876072          0       9104      75404
-/+ buffers/cache:      60000     960580
Swap:      2097144          0    2097144

なんということでしょう。free なメモリが 2倍になりました!

yum をアップデート

sakura> sudo yum update

Postfix を使わないのなら

踏み台にされるリスクがあるので削除してしまいましょう。

$ sudo postfix stop

$ rpm -qa | grep postfix
postfix-2.x.x-x
$ sudo rpm -e --nodeps postfix-2.x.x-x

RubyMySQL を用意 (2015/06/06 更新)

必要なパッケージをいれます。

sakura> sudo yum -y install zlib-devel libxml2-devel libxslt-devel mysql-devel libssl-dev mysql-server
# zlib-devel ... gem をちゃんと動かす
# libxml2-devel ... nokogiri で 必要
# libxslt-devel ... nokogiri で 必要

RVM をいれます。RVMのインストール方法は頻繁に変わる印象があるので毎回公式サイトを確認してます。

sakura> curl -L https://get.rvm.io | bash -s stable --ruby
sakura> source ~/.rvm/scripts/rvm # RVM を有効にする

MySQL の設定をします。

sakura> sudo vim /etc/my.cnf

内容は次のようにします。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# character-set
default-character-set=utf8
skip-character-set-client-handshake

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

設定を反映します。

sakura> sudo /sbin/chkconfig mysqld on
sakura> sudo /etc/rc.d/init.d/mysqld start

Railsアプリのセットアップ

Rails のお決まりのセットアップ手順をふみます。

sakura> gem install bundler
sakura> bundle install --without development test
sakura> RAILS_ENV=production bundle exec rake db:create db:migrate

assets まわりの準備をします。以下のように Gemfile が書かれているとします。

group :assets do
  ...
  gem 'execjs'
  gem 'therubyracer', :platform => :ruby
  ...
end

プリコンパイルを実行します。

sakura> RAILS_ENV=production bundle exec rake assets:precompile

起動・停止

さあ、アプリを起動しましょう。

sakura> rvmsudo rails s -e production -d -p 80

http://www12345ue.sakura.ne.jp/ もしくは http://1.2.3.4/ にアクセスしましょう。これで動いてたら勝つる!

ちなみに次のコマンドで停止できます。

sakura> sudo kill -9 $(cat tmp/pids/server.pid) 

ドメインの割り当て

ドメインを割り当てて仕上げです。

DNSレコードを設定
ネームサーバを設定

(すみません。ここの手順をメモし忘れました。以下に参考にさせていただいた文献があるのでそちらをご参照ください)

おわりに

何か間違えなどありましたら教えてください>< 素敵なさくらVPSライフをお送りください。