Node.js de Server 〜仮想環境を添えて〜


aratana Advent Calendar 2018 3日目の記事です。

宮崎在住エンジニアのジョウ(@JotarO_Oyanagi) です。
つい先日の 12/1 でまた一つ大人の階段を登りましたが、心は永遠のハイティーン・ブギです。

今年の夏頃までは「フロントエンド一筋!一生バックエンドは触らない!」と誓っていたんですが、運命とは皮肉なもので、ここ最近はバックエンド気味のあれこれを行う毎日です。

バックエンドをやるにしても、どうせなら Node.js を使おう!ということで、ローカルでの開発環境用に Vagrant を使った環境構築の手順を記します。

TL;DR

  • 環境は centos 7.5、Node.js 8.11.4
  • anyenvndenv を使用して Node.js をインストール
  • Node アプリの常駐化に PM2 を使用し、ホットリロード、自動起動までを設定

[準備] 仮想環境用ファイルをインストール

まずは仮想環境用アプリケーション一式を取得します。

準備1. VirtualBox をインストール

公式より取得し、インストールしてください。
https://www.virtualbox.org/wiki/Downloads

準備2. Vagrant をインストール

公式より取得し、インストールしてください。
https://www.vagrantup.com/downloads.html

1. 作業用フォルダに仮想環境を作成

1-1. 作業用フォルダを作成

作業用フォルダを作成して移動します。


$ mkdir 作業用フォルダ && cd 作業用フォルダ

1-2. VagrantFile を作成


$ vagrant init bento/centos-7.5

1-3. VagrantFile にローカル用の設定を記述

Vagrantfile を編集します。


$ vi Vagrantfile

1-3-1. ローカル環境用 IP を設定

private_network にローカル環境用 IP を設定します。

ここでは 10.10.10.11 をローカル環境用 IP とします。

(コメントアウトを外すのを忘れずに)


- # config.vm.network "private_network", ip: "192.168.33.10"
+ config.vm.network "private_network", ip: "10.10.10.11"

1-3-2. Vagrant と同期させるローカルフォルダを設定

ここでは作業用フォルダを同期させるローカルフォルダとします。

(コメントアウトを外すのを忘れずに)


- # config.vm.synced_folder "../data", "/vagrant_data"
+ config.vm.synced_folder "./", "/vagrant", create: true, owner: "vagrant", group: "vagrant", mount_options: ["dmode=777", "fmode=777"]

Vagrantfile を保存して閉じます。

1-4. 仮想環境を起動


$ vagrant up

そこそこ時間かかるので ☕️でも飲んで待ちましょう。

2. Node.js を準備する

Node.js de Server なので、Node.js をインストールします。

2-1. Git を準備する

yum でインストールされる Git がバージョン 1.8 と古かったりするので、最新版をインストールする方法を記します。

2-1-1. パッケージの Git を削除

これをしておかないと、この先に記したことを実行しても 1.8 がインストールされることに。


$ sudo yum -y remove git

2-1-2. ライブラリをインストール


$ sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel autoconf asciidoc xmlto docbook2X make gcc
$ sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi

2-1-3. Git をダウンロード&インストール

最新版のバージョン 2.19.2(2018.12.3 現在)をインストールします。


$ cd ~
$ wget https://github.com/git/git/archive/v2.19.2.tar.gz
$ tar -zxf v2.19.2.tar.gz
$ cd git-2.19.2
$ make configure
$ ./configure --prefix=/usr
$ sudo make install

そこそこ時間かかるので ☕️でも飲んで待ちましょう。

2-1-4. バージョン確認し、OKならインストール用のファイルを削除


$ git --version
git version 2.19.2
$ cd ~
$ sudo rm -rf git-2.19.2 && rm -f v2.19.2.tar.gz

2-2. Node.js をインストール

Node.js のバージョン管理ツールよりインストールします。

その前に、各言語のバージョン管理ツールの総合管理ツールとして anyenv をインストールします。


$ cd ~
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

続いて Node.js のバージョン管理ツール ndenv をインストールします。


$ anyenv install ndenv
$ source ~/.bash_profile
$ git clone https://github.com/riywo/node-build.git $(ndenv root)/plugins/node-build

いよいよ Node.js をインストールします。


$ ndenv install v8.11.4
$ ndenv rehash
$ ndenv global v8.11.4

バージョンが問題ないか確認します。


$ node -v
v8.11.4

2-3. yarn をインストール

Node モジュールのパッケージマネージャとして、 yarn を使用したいのでインストールします。


$ npm install -g yarn

ただインストールしただけだと yarn global add で追加したモジュールが使えないので、パスを通します。


$ echo 'export PATH="$PATH:`yarn global bin`"' >> ~/.bash_profile
$ source ~/.bash_profile

2-4. PM2 をインストール

Node アプリを常駐化させる PM2 をインストールします。


$ yarn global add pm2

2-5. Node アプリ起動用ファイルを作成・設定する

普通に PM2 で Node アプリを起動(常駐させる)には pm2 start アプリファイル名 でいいんですが、起動オプションや環境変数を設定できるファイルを作成し、そこから起動するようにします。

2-5-1. 起動用ファイルを作成


$ pm2 ecosystem

これで ecosystem.config.js というファイルが作成されます。

このファイルを修正します。

ecosystem.config.js

module.exports = {
  apps : [{
    name: 'アプリ名', // 任意で
    script: 'app.js', // アプリファイル名
    watch: true, // ホットリロードにする設定
    watch_options: {
      usePolling: true // 後述
    },
    env: { // env オプション無しで起動した場合の設定
      NODE_ENV: 'development' // 環境変数
      // 他にポートやタイムゾーンなど、Node のオプションを設定できる
    },
    env_production: { // --env production で起動した場合の設定
      NODE_ENV: 'production'
    }
  }]
};

上記で設定した watch_optionsusePolling: true ですが、Vagrant で共有フォルダ配下のファイルを監視(ホットリロード対象に)するための記述です。

あとは、このファイルを PM2 起動時に指定します。


$ pm2 start ecosystem.config.js

production 用の設定をしていて、その設定で起動する場合は以下になります。


$ pm2 start ecosystem.config.js --env production

2-6. サーバー起動時に PM2 も起動させる

サーバー(Vagrant)を起動時に PM2 も起動させる設定をしておきます。

2-5-1. PM2 をサービス化


$ pm2 startup

出力された sudo env PATH=******** をコピペして実行します。

/etc/systemd/system/ にサービスファイルが作成されましたので、確認します。


$ cd /etc/systemd/system/

pm2-ユーザー名.service ができていればリネームします。


$ sudo mv pm2-vagrant.service pm2.service

2-5-2. 自動起動にする

以下を実行すれば、次回からサーバー起動時に PM2 も起動します。


$ sudo systemctl enable pm2

終わりに

これで、同期させたフォルダで Node.js によるアプリ開発をガシガシ行う準備が完了しました。

あとは、Webアプリのフレームワークとして Express.js を使うもよし、お好みで各種ミドルウェアを入れるもよし。
気軽に Node.js de Apps 制作をお楽しみください😃