node.js用の環境作り - ディレクトリ構成とnginxの設定から起動テストまで
Posted: Updated:
開発環境を設定してみる
前回の,node.jsとnpmのインストールをしたメモ(CentOS さくらのVPS)でnode.jsとnpmをインストールしましたが,まだ環境設定ができてなかったので今回も引き続き下準備.
(仮に) /hogehoge/public/dev/ で開発することに.環境のディレクトリ構成とか,サーバー設定についてあまり参考になる記事を見つけられなかったので,以下適当に設定をしてみた.サーバーは,nginxを使います.
ディレクトリ構成の予定
/hogehoge/public/dev/server.js : 8124をlistenするHTTPサーバー的なJSファイル..
/hogehoge/public/dev/app/ : その他lib的に,nodeで実行するJSを設置する.
/hogehoge/public/dev/www/ : 公開ディレクトリとして,CSSやクライアント用のJSを設置する.
/etc/nignx/conf.d/virtual.conf を設定
http://example.com/ 的なリクエストのときに,index.htmlを優先して欲しい設定.
$request_filenameで判定すると,当然のようにindexディレクティブは考慮されないようで,http://example.com/へのリクエスト時に,http://example.com/index.htmlが存在しても無視される.
そこで下記のように2段構えの判定にして,index.htmlがあればrewriteすることに.この場合,indexディレクティブに意味がないと思う.どうやるのが一般的なんでしょ?
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_max_temp_file_size 0;
server {
listen 80;
server_name example.com;
index index.html;
root /hogehoge/public/dev/www;
location / {
# 実存パスへのリクエストならbreak
if ( -f $request_filename ) {
break;
}
# index.htmlがあればrewrite
if ( -f $request_filename/index.html ) {
rewrite (.*) $1/index.html break;
}
# 非実存パスへのリクエストならnode.jsにpass
if ( !-f $request_filename ) {
proxy_pass http://127.0.0.1:8124;
break;
}
}
}
追記: staticファイルの取り扱いって,express使うなら,express.staticProvider(__dirname+'www')みたいな感じで任せておけば,それで良かったんですね.問答無用で,8124にpassしてしまっても問題なさそう.このエントリを書き終えて,さらに試して遊んでる最中に気づきました.
テストファイルを実行してみる
node.jsのトップにあるサンプルスクリプトを,少しだけ改変してリクエストされたパスも返すようにしてみた. さらにconsole.logで同様に,リクエストのあったパスをサーバー側でも出力するようにしてみる.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n\n'+req.url);
console.log('request for '+req.url);
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
node-devで起動
node-dev(後述)という,ファイルの更新を検知して勝手に再起動してくれるモジュールを使って,上のサンプルを起動します.
% node-dev server.js
22 Feb 01:00:09 - [INFO] Started
Server running at http://127.0.0.1:8124/
serverが起動したようです.
http://example.com/hoge でブラウザからリクエスト
Hello World
/hogehoge
ブラウザでHello Worldとパスが確認できました.
request for /favicon.ico
request for /hogehoge
起動しているサーバーのほうでも,ログが出力されています.Firefoxがfaviconも勝手に探しにいってるみたいですね.
これで何とかnode.jsを動かすところまではきたので,次回以降で実際にサーバーサイドJSを書いていってみたいと思います.
おまけ: 開発ツール的なモジュールを追加でインストール
node.jsの開発時に役立つモジュール : アシアルブログ
こちらを参考に,node-devとnode-inspectorをインストール.npm使ってるだけなので,特に目新しいことはないけど一応ログ.
% envsudo npm install node-dev
npm info it worked if it ends with ok
npm info using npm@0.3.3
npm info using node@v0.5.0-pre
npm info fetch http://registry.npmjs.org/node-dev/-/node-dev-0.0.5.tgz
npm info calculating sha1 /usr/local/lib/node/.npm/.cache/node-dev/0.0.5/package.tgz
npm info shasum d83897b6389f8ce55fc774e98353466b2f0aaa1e
npm info preinstall node-dev@0.0.5
npm info install node-dev@0.0.5
npm info postinstall node-dev@0.0.5
npm info preactivate node-dev@0.0.5
npm info activate node-dev@0.0.5
npm info postactivate node-dev@0.0.5
npm info build Success: node-dev@0.0.5
npm ok
% envsudo npm install node-inspector
npm info it worked if it ends with ok
npm info using npm@0.3.3
npm info using node@v0.5.0-pre
npm info fetch http://registry.npmjs.org/node-inspector/-/node-inspector-0.1.6.tgz
npm info calculating sha1 /tmp/npm-1298299553438/1298299553438-0.5866224074270576/tmp.tgz
npm info shasum 61efaad99355c40ae89f7c46304882b822c3b4a8
npm info calculating sha1 /usr/local/lib/node/.npm/.cache/node-inspector/0.1.6/package.tgz
npm info shasum 13d013df81b4f24b6aebf056a45494f391dc782b
npm info preinstall node-inspector@0.1.6
npm info install node-inspector@0.1.6
npm info postinstall node-inspector@0.1.6
npm info preactivate node-inspector@0.1.6
npm info activate node-inspector@0.1.6
npm info postactivate node-inspector@0.1.6
npm info build Success: node-inspector@0.1.6
npm ok