Node.jsで80番ポートを使用するHTTPサーバ

一般ユーザーで動作させたい

0〜1023番はウェルノウンポートと呼ばれ、Linuxではスーパーユーザー(root権限)でないとサーバとして動かすことができません。しかし何も考えずにsudo node xxx.js的な感じで起動するとプロセスがrootで動作するため恐ろしいことこの上なく夜も眠れない日々を過ごす羽目になります。

そこで、以下のようにいったんrootとして起動した後に、子プロセスを別のユーザーに切り替えることで解決を図ります。

コード例

/**
 * Nodejs + expressで80番ポートを使用する(一般ユーザー)
 *
 * Usage:
 *   $ sudo node index.js
 *   listening on *:80
 * 
 *  親プロセスはrootだが、子プロセスが指定したユーザーになるる。
 */

var app  = require('express')();
var http = require('http').Server(app);

app.get('/', function(req, res){
  res.send("<h1>It works.</h1>");
})

http.listen(80, function(){   //80番ポートでlistenする
  // ユーザーを変更する
  process.setuid(501);

  console.log('listening on *:80');
});

ユーザーidの確認方法

setuid()メソッドに指定する数値は以下のようにidコマンドで確認することができます。node専用ユーザーを作っておくのが良いでしょう。

### 指定ユーザーのIDを表示(以下なら48)
$ id apache
uid=48(apache) gid=48(apache) groups=48(apache)

### オプションを指定しないとログイン中ユーザーのIDを表示
$ id 
uid=501(katsube) gid=501(ws) groups=501(ws),10(wheel)

ハンズオンNode.js

ハンズオンNode.js

Amazon