node.js用の環境作り - ディレクトリ構成とnginxの設定から起動テストまで

開発環境を設定してみる

前回の,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