Node.jsの開発環境をVagrantで構築することがあったのでメモ。
Express4を使っていますが少し変えればNode.js全般で使えると思います。
やりたいこと
- CentOS7.0 64bit上に構築する。
- ソースコードを変更したら自動的にNode.jsを再起動する。
- vagrant upしたら自動でNode.jsを立ち上げる。
Vagrantfile
まずVagrantfileは以下のようにします。
Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "your CentOS 7.0"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.provision :shell, :inline => "sudo systemctl start forever", run: "always"
end
ディレクトリ構成
ゲストOSのディレクトリ構成は以下のようにする予定です。
/
├── vagrant
│ ├── app.js
│ ├── bin
│ ├── node_modules
│ ├── package.box
│ ├── package.json
│ ├── public
│ ├── routes
│ ├── Vagrantfile
│ └── views
├── opt
│ ├── node -> node-v0.12.2-linux-x64
│ ├── node-v0.12.2-linux-x64
/Vagrant以下はexpress-generatorを使用してプロジェクトのひな形を作成しました。簡単なので割愛します。
Node.jsのインストール
Node.jsは公式のバイナリの64bitを利用します。
vagrant ssh
Console
$ wget http://nodejs.org/dist/v0.12.2/node-v0.12.2-linux-x64.tar.gz
$ sudo mkdir /opt
$ cd /opt
$ sudo tar xvfz /path/to/node-v0.12.2-linux-x64.tar.gz
$ sudo ln -s node-v0.12.2-linux-x64 node
Foreverのインストール
Node.jsをdaemon化するツールはいろいろあるようですが今回はForeverを使用します。
Console
$ sudo /opt/node/bin/npm install -g forever
CentOS7.0からsystemdになったのでsystemdのunitを登録します。
$ sudo vi /etc/systemd/system/forever.service
/etc/systemd/system/forever.service
[Unit]
Description=Forever Server
[Service]
StandardOutput=syslog
SyslogIdentifier=forever
Type=forking
Environment=PATH=/opt/node/bin
WorkingDirectory=/vagrant
ExecStart=/opt/node/bin/forever start -w --pidFile /var/run/forever.pid ./bin/www
ExecStop=/opt/node/bin/forever stop ./bin/www
PIDFile=/var/run/forever.pid
User=root
確認
起動確認
Console
$ sudo systemctl start forever
$ curl localhost:3000
vagrant reload
vagrant ssh
$ curl localhost:3000
感想
本当はsystemdでの自動起動でforeverを立ち上げたかった。
しかし/vagrantがマウントされる前にforeverが起動してしまい、
/vagrant/bin/wwwが見つからなくて起動でコケてしまうので、
仕方なくVagrantfileのprovisionでsudo systemctl start forever
しました。