さくらVPSを契約してCentOS6.4をNode.js Webアプリケーションサーバーとして構築するチュートリアル

このドキュメントは、Node.jsが楽しくてたまらない人のための、さくらVPSでアプリケーションサーバーを構築するためのチュートリアルです。
**さくらVPS-Nodeチュートリアル**とでも呼ぶことにします。

このチュートリアルを完遂すると、Node.jsを用いたWebアプリケーションの公開サーバーを構築することができます。  
また、デプロイにはDropboxによる同期を利用します。これは開発作業やメンテナンスを容易にします。

このチュートリアルは初学者向けを意図しており、構築するアプリケーション・サーバーも開発したWebアプリの個人レベルでの公開や、動作チェックなどを用途として意識しています。  

そのため、あえてセキュリティ関連については触れていません。  
このチュートリアルで重要なのはまずアプリケーションサーバーを構築することです。  
確かなセキュリティを保ち続けるのは容易ではありませんし、一度確保したとしても日々新しい穴が見つかり続けます。  
もしWebサービスとして公開するための本番環境として運用するなら、そこはググって調べてみて下さい。

それでは始めましょう。

### やるべきこと

先に、これからやるべきことを一度確認しておきます。

1. **さくらVPSを契約する**  
2. **いろいろな初期設定をする**  
3. **Dropboxをインストールする**  
4. **Node.jsをインストールする**  
5. **nginxをインストールする**  
6. **MongoDBをインストールする**  

手順はたったの6つです。  
このチュートリアルは、手順1と手順2を除けば、すべて任意・順不同で進められるようになっています。  
たとえばNode.jsをすでにインストールしている人は、手順4を省略することができます。  
ただ、手順1と手順2は必ず目を通し、やってないことがあればやって下さい。

## 1. さくらVPSを契約する

さくらインターネットのVPSを契約します。  
以下のURLから契約して下さい。

> VPS（仮想専用サーバ）のさくらインターネット
> [http://vps.sakura.ad.jp/](http://vps.sakura.ad.jp/)

契約するのは、1番安い、月額980円のプランで充分です。  
リージョンは東京/大阪/石狩と選べますが、故郷が石狩の人だけ石狩を選択して下さい。故郷を大切にするのはいいことです。  
他の人はおとなしく東京にしましょう。

クレジットカードで契約すれば、最初の2週間はお試し期間とされ無料になります。  
その間にキャンセルすれば、お金は請求されません。このチュートリアルを進めて気に入れば、是非そのまま本登録しましょう。  
月額980円とはいえ、何の制限もなく自分用のWebアプリをデプロイできる環境があるのはものすごく便利なことです。

### 1-2. サーバーを起動する

契約してしばらくすると、「仮登録完了のお知らせ」メールが届きます。  
このメールがきたら、もうサーバーで遊ぶことができます。

このメールには、サーバーのIPアドレスやrootユーザーのパスワードが書かれています。  
今後しばらく使うことになるので、別のタブで開いておきましょう。また、大切に保管しましょう。

それではさっそく、サーバーを起動させてみましょう。  
「VPSコントロールパネル」にログインし、「仮想サーバ操作」の「起動」を押します。  
初回起動は少し時間がかかります。「稼働中」という表示になってから、15分ほど待ってから次の手順に移りましょう。

### 1-3. とりあえずSSH接続を試す

ターミナルで以下を実行します。

```
$ ssh root@<接続先IPアドレス>
```

今後、ターミナルでの操作は先頭に「$ 」をつけて表記します。  
「$ 」を入力する必要はありません。
また、コマンドを「実行する」とは、コマンドを入力してEnterキーを押すことです。言わなくてもわかるか、それくらい。

`<接続先IPアドレス>`はお知らせメールに書かれているものに置き換えて下さい。  
一例として僕の環境では、`ssh root@153.123.45.67`のようになります。  
入力後、パスワードを求められます。これもお知らせメールに書かれているのでそれを見ながら入力して下さい管理ユーザの初期パスワードがそれです)。

(もし、`Are you sure you want to continue connecting (yes/no)?`と聞かれたら`yes`と入力してEnterを押して下さい)

接続に成功すると、

```
[root@www4408uo ~]#
```

入力待ち状態の表示がこんな感じに変わります(詳細の個人差はあります)。

この状態を、このチュートリアルでは今後「VPSにログインして〜」などと表現します。  
そうでない通常の状態は、「ローカルマシンで〜」などと表現します。ローカルマシンとは、今あなたが使っているそのPCそのもののことです。

#### Windowsの人へ

ターミナルとは、Mac版のコマンドプロンプトのことです。  
このチュートリアルでは、手順の多くをCUI(コマンド)操作で行います。

しかしながら、Windowsのコマンドプロンプトからでは上の`ssh`コマンドが使えません。  
Windowsでこのチュートリアルを進める場合は、[**Git**]([http://git-scm.com/](http://git-scm.com/))をインストールして下さい。  

すると、「Git Bash」というアプリケーションが付随してインストールされます。  
Git Bashはコマンドプロンプトがより強化されたものです。それであれば、Macユーザーと同じコマンドで手順を進められます。

## 2. いろいろな初期設定をする

ここでやることは2つです。

まず、普段使いのためのユーザーを作成します。  
最初から用意されている「root」ユーザーは、システム全てを支配している管理ユーザーです。これを普段使いとして利用するのはおすすめしません。

もうひとつは、その後の作業に必要なツールが入っているか確認することです。  
このチュートリアルで一番の要といっても差し支えないかもしれません(とはいえ、ほとんどの場合やることはありませんが)。

### 2-2. ユーザーを作成する

VPSにログインした状態で、以下を実行します。

```
$ useradd <ユーザー名> -G wheel
```

`<ユーザー名>`の部分は自由に決めて下さい。半角英数小文字と「_」(アンダースコア)で構成した名前がいいでしょう。  
普段あなたが使っているハンドルネームにでもすればいいと思います。

次に、そのまま以下を実行します。

```
$ passwd <ユーザー名>
```

これは、ユーザー名に対してパスワードを設定するコマンドです。  
`<ユーザー名>`は、先ほど決めたユーザー名を入力して下さい。  
確認のためパスワードを2回尋ねられますので、2回とも同じものを入力して下さい。

### 2-3. ユーザー設定ファイルを編集する

3つのファイルを編集します。

この手順では、ファイルの編集に「vi」というテキストエディタを使います。  
操作がちょっと特殊です。馴染みがない人は以下の5つだけ覚えて下さい。  
あとは普通のテキストエディタと同じように扱えるはずです。

- 入力モードとコマンドモードがある  
- 入力モードに入るにはiキー  
- コマンドモードに戻るにはEscキー  
- コマンドモードの状態で「:wq」と入力してEnterキーで「上書き保存して終了」  
- コマンドモードの状態で「:q」と入力してEnterキーで「保存せずに終了」

それでは始めましょう。

#### /etc/pam.d/su

以下を実行します。

```
$ vi /etc/pam.d/su
```

/etc/pam.d/su がviで開かれるので編集します。

**Before**

```
# auth    required    pam_wheel.so use_uid
```

この行をコメントインします。

**After**

```
auth    required    pam_wheel.so use_uid
```

こうなればOKです。

#### /etc/login.defs

以下を実行します。

```
$ vi /etc/login.defs
```

etc/login.defs がviで開かれるので編集します。

末尾に以下の行を追加します。

```
SU_WHEEL_ONLY yes
```

#### visudo

以下を実行します。

```
$ visudo
```

viの設定ファイルがviで開かれるので編集します。

**Before**

```
# %wheel  ALL=(ALL)    ALL
```

この行をコメントインします。

**After**

```
%wheel  ALL=(ALL)    ALL
```

こうなればOKです。

これで設定の編集は完了です。

### 2-4. ログイン(接続)しなおす

お疲れ様でした。  
無事にユーザーを作成して、設定も済ませたのでそのユーザーでログインしなおしましょう。

以下を実行します。

```
$ exit
```

さくらVPSから切断され、ローカルマシンでの操作に戻ってきます。  
そのまま、先ほどのユーザーでログインしなおします。

以下を実行します。

```
$ ssh <ユーザー名>@<接続先IPアドレス>
```

パスワードを求められます。先ほど設定したパスワードを入力すると、ログインできると思います。  
VPSへのログインに成功すると、以下のような表示に変わります。

```
[axross@www4408uo ~]$
```

rootからaxrossに変わってますね。

### 2-5. 各種ツールがインストールされているか確認する

この先必要になってくるのは、sudoとyumとgitという3つのツールです。  
さくらVPSを契約した段階で、最初からインストールされているはずですが、念のため確認しておきましょう。

もしこれらがインストールされていない場合は、ググってインストールするか、さくらVPSのコントロールパネルからOSの再インストールを検討して下さい(適当)。

まずはsudoを確認します。以下を実行します。

```
$ sudo -V
```

なにやら3行くらい出ますが、バージョン番号が表示されてればOKです。

次に、yumの確認のため以下を実行します。

```
$ yum --version
```

1行目にバージョン番号が出てればOKです。

最後にgitです。以下を実行します。

```
$ git --version
```

「git version ○○」みたいな表示になるはずです。

## 3. Dropboxをインストールする

Dropboxをインストールしておくことで、ローカルマシン(開発環境)で書いたコードをさくらVPS(公開環境)にデプロイする際の手間がなくなります。  
ローカルマシンでコードを編集した時点で、さくらVPS側でも瞬時に変更が反映されるからです。  
また、逆方向にも同期されますので、データベースの閲覧・編集といった保守作業も楽にできるようになります。

まず、VPSにログインした状態で以下を実行します。

```
$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf - && ~/.dropbox-dist/dropboxd
```

何やら処理がはじまって勝手にダウンロード・インストールされます。

インストールが終わると、以下のようなメッセージが表示されます。

```
このコンピュータは Dropbox アカウントにリンクされていません...
このデバイスをリンクするには、https://www.dropbox.com/cli_link?host_id=<ランダムな文字列> にアクセスしてください。
```

これに書かれているURLをコピーして、ローカルマシンのブラウザでアクセスしましょう。  
着く先はDropboxのストレージのWebです。パスワードを求められるので、Dropboxアカウントのパスワードを入力します。

これにより、VPSがDropboxアカウントで認証されます。  
「このコンピュータは Dropbox にリンクされました。ようこそ、<名前> さん。」のようなメッセージが表示されればOKです。

Ctrl+Cを押して、インストーラを終了させます。

### 3-2. 管理スクリプトをインストールする

以下のコマンドを実行します。

```
$ mkdir -p ~/bin && cd ~/bin && wget "https://www.dropbox.com/download?dl=packages/dropbox.py" -O dropbox.py && chmod +x ~/bin/dropbox.py
```

~/bin/にdropbox.pyというDropboxを管理するためのPythonスクリプトが置かれます。

### 3-3. 管理スクリプトを使う

```
$ dropbox.py <コマンド>
```

Dropboxの管理スクリプトは、インストールの段階で実行権限を与えているのでそのままファイル名で呼んで実行することができます。  
いくつかの操作を以下に記します。

- start - Dropboxを起動する
- stop - Dropboxを終了させる
- running - 起動しているか確認する
- status - 同期状況を確認する
- autostart - 自動的にDropboxが起動するように設定する

他にも、同期したくないファイルを設定できるexcludeコマンドなどもあります。詳しくは[こちら](http://www.dropboxwiki.com/tips-and-tricks/using-the-official-dropbox-command-line-interface-cli)。

とりあえずは、Dropboxを起動しておくために以下を実行しましょう。

```
$ dropbox.py start
```

### 3-4. lansyncをオフにする

```
$ dropbox.py lansync n
```

同LAN内のマシンにpingを飛ばして同期を促す機能をオフにしておきます。  
VPSではこの機能は不要などころか、他のVPS利用者にとって邪魔になるかもしれません。

設定の後はDropboxを再起動したいので、以下を実行しておきましょう。

```
$ dropbox.py stop
```

Dropboxが終了したら、以下を実行してもう一度起動します。

```
$ dropbox.py start
```

また、下記を実行すると、VPSへログインした際にも自動的にDropboxが起動するようになります。

```
$ dropbox.py autostart y
```

### 3-5. Dropboxを使う

Dropboxは、ユーザーのホームディレクトリ直下にインストールされています(`~/Dropbox/`)。  
今後、Node.jsのプロジェクト(jsファイルなど)をDropboxに入れることで、さくらVPS環境からもそれらを実行・閲覧・変更できます。

## 4. Node.jsをインストールする

このチュートリアルでは、Node.jsのインストールにバージョン管理ツールの「nodebrew」を利用します。  
nodebrewを用いると、複数のバージョンのNode.jsをインストールしておいて切り替えたり、手軽に新しいバージョンのNode.jsをインストールしたりできます。  
Node.jsは今も成長しており、盛んにアップデートされるためこれができるのは重要なことです。

### 4-2. nodebrewをインストールする

まず、VPSにログインした状態で以下を実行します。

```
$ cd ~/ && curl https://raw.github.com/hokaccha/nodebrew/master/nodebrew | perl - setup
```

自動的に必要なパッケージがダウンロード、インストールされます。

次に、PATHを通すために以下を実行します。

```
$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile && source ~/.bash_profile
```

きちんとnodebrewがインストールされているか、以下を実行することで確認できます。

```
$ nodebrew -v
```

1行目にバージョン番号が書かれていればOKです。

### 4-3. nodebrewを使ってNode.jsをインストールする

Node.jsをインストールするには、以下を実行します。

```
$ nodebrew install-binary stable
```

「stable」としているところは、インストールしたいNode.jsのバージョンです。stableであれば安定版の最新のものがインストールされます。  
過去のバージョンや開発版のものをインストールしたい場合は、数字で直接指定することもできます。

その後、以下を実行します。

```
$ nodebrew use stable
```

これにより、実際に「stable」バージョンのNode.jsを「使う」という指定ができます。  
Node.jsのバージョンを切り替える際はこのコマンドを用います。もちろん、数字で指定することもできます。

最後に、Node.jsが無事にインストールされているか確認するために以下を実行します。

```
$ node -v
```

バージョン番号が表示されればOKです。  
(うっかり`-v`をつけずにnodeコマンドを実行してしまった場合は、`.exit`と入力してEnterを押せば終了できます)

## 5. nginxをインストールする

「nginx」はHTTP機能を持ったプロキシサーバーです。このチュートリアルではこれをリバースプロキシサーバーとして利用します。

ここではnginxの持つバーチャルホスト機能を利用します。  
詳細は後で説明するとして、まずはインストールしましょう。

nginxのインストールには、以下を実行します。

```
$ sudo yum install -y nginx
```

「sudo」はこのコマンドの時だけ管理ユーザーで実行する、といった働きをするコマンドです。それに「yum」を組み合わせ、nginxを管理者権限でインストールしています。  
この操作の後、パスワードを求められます。手順2-2で設定したユーザーパスワードを入力して下さい。

その後、以下の2つを実行します。

```
$ sudo service nginx start
```

```
$ sudo chkconfig nginx on
```

1つ目のコマンドはnginxの起動です。  
2つ目は、nginxをVPS起動時に同時起動(Windowsでいうスタートアップ)するようにするコマンドです。

### 5-2. nginxのバーチャルホストの設定をする

まずは今後ググる時のために、すべきことを整理しておきます。

Webアプリの割り振りには、「バーチャルホスト」と呼ばれる技術を利用します。
バーチャルホストとは、1つのマシン(サーバー)に対して、あたかも複数のIPアドレスまたはドメインが割り振られているように振る舞わせる技術のことです。  
そして、その割り振り先にポートを指定できるので、複数のWebアプリを運用する場合はそれらをすべて違うポート番号でアクセスできるようにしておきます。そうすれば、「○○○.axross.org」はこのWebアプリへ、「△△△.axross.org」はこのWebアプリへ、と割り振ることができます。

1つのサーバーで複数のWebアプリを運用するので、負荷の大きいWebアプリを運用する際は気をつけて下さい。負荷が他のWebアプリにも影響します。

では、実際に設定する際の方法です。

以下を実行します。

```
$ sudo vi /etc/nginx/conf.d/virtual.conf
```

sudoしているのでパスワードを求めれます。rootのパスワードを入力して下さい。  
すると、virtual.conf という設定ファイルがviで開かれます。

まずは、以下の書き方を覚えて下さい。

```
server {
  listen 80;
  server_name <ドメイン>;
  location / {
    proxy_pass http://127.0.0.1:<ポート番号>;
  }
}
```

<ドメイン>と<ポート番号>は適宜置き換えて下さい。  
たとえば僕が開発した「僕のはてブ」であれば、ドメインは「hatebu.axross.org」で、内部的には「4567」ポートで動かしています。  
ですので、その場合は下記のようになります。

```
server {
  listen 80;
  server_name hatebu.axross.org;
  location / {
    proxy_pass http://127.0.0.1:4567;
  }
}
```

必要のない設定などは「#」を行頭につけることでコメントアウトできます。

また、設定を編集した場合はnginxを再起動させる必要があります。それには以下を実行します。

```
sudo service nginx restart
```

sudoしているのでrootのパスワードを求められます。そろそろsudoにも慣れてきたでしょうか。

## 6. MongoDBをインストールする

MongoDBはNode.jsのWebアプリでよく用いられるNoSQLデータベースです。  
データの取り扱いがJSONによく似ていて、Javascriptで扱いやすいのが特徴です。

さっそくインストールしましょう。  
VPSにログインした状態で以下を実行します。

```
$ sudo vi /etc/yum.repos.d/mongodb.repo
```

mongodb.repo がviで開かれますので、以下のように書いて保存します。

```
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

次に、以下を実行します。

```
$ sudo yum install -y mongo-10gen mongo-10gen-server
```

yumを用いてMongoDBクライアントとサーバーがインストールされます。

### 6-2. MongoDBサーバーを起動する

以下を実行します。

```
$ sudo service mongod start
```

mongodサービスはMongoDBのサーバーデーモンです。`start`の他に、`stop`したり`restart`することもできます。

VPSを再起動した再などに同時にMongoDBサーバーも起動するには、以下を実行してchkconfigに登録します。

```
$ sudo chkconfig mongod on
```

これでOKです。

## 最後に

お疲れ様でした。  
このチュートリアルを終えたあなたの手元には、Node.jsアプリケーションサーバーとして構築されたさくらVPSがあるはずです。
  
開発したWebアプリを実験する環境として使ってもいいですし、バーチャルホストであることを利用してポートフォリオWebサイトにしても立ち上げてもいいかもしれません。

なんにせよ、まずは開発を楽しみましょう！

このドキュメントを書き上げるのに参考にさせていただいた各種公式ドキュメントと、Qiita、Googleに深く感謝します。