Express.js4で、静的ページをst.jsで配信する


Express4使っていますか? 私はちょっと久々です。色々さまよっている間に、「結局、nginxをフロントに立てるの過剰じゃね?」と思うようになりました。で、「こんな記事」にも励まされて、今は直接フロントにnode.jsを立てて遊んでいます。で、そうすると、リンク先にもある、express.staticの遅さが気になります。あと、gzipとか、キャッシュサイズもコントロールしたいですね。そうすると、なにか代わりが必要になります。

で、上記リンクでちょっと推奨気味だったst.jsを組み込んでみました。設定値は、その道に詳しい人とご自身のプロジェクトを熟知した人に聞いて下さい。私は、「瞬間最大風速の時に効けばそれでよし。それ以外はキャッシュなんてあってないような存在がよろし」という感じで設定しているので、参考になるかどうかはわかりません。

とは言え、こういう単機能で CPU bound な処理は、来るべき将来ネイティブモジュールが出てきてスタンダードになる気がします。っていうか誰かやって(jsで600行、ロジックも明快なので、そこそこお手頃だと思いますよん。そしてキャッシュのexpire処理とかは別スレッドでやって欲しいな)。それまでの繋ぎとして、いかがでしょうか。

app.js(部分)
st = require('st')

#下記行の代わりにその後に続く記述を入れるよ
#app.use express.static(path.join(__dirname, 'public'))
mount = st 
  path: __dirname + '/public' #配信するファイルのパス
  url: '/public'              #pathに相当するURL
  cache:
    fd:
      max: 100           #保持するfdの数
      maxAge: 1000*20    #fdの有効期限(ms)
    stat:
      max: 1000          #保持するstatオブジェクト
      maxAge: 1000*20    #statオブジェクトの有効期間(ms)
    content:
      max: 1024*1024*256 #キャッシュメモリのサイズ
      maxAge: 1000*60*10 #キャッシュの有効期限(ms)
      cacheControl: 'public, max-age=600' #cache-controlヘッダに明示する内容
    index: true   #autoindexを使わないならtrueを入れる(さもなくば、{max,maxAge})
    readdir: true #autoindexを使わないならtrueを入れる(さもなくば、{max,maxAge})
  index:       false, #ディレクトリアクセスは404(trueだとautoindex,indexファイル名の指定も可
  dot:         false, #「.」で始まるファイル名は403
  passthrough: true, #ファイルがない時はnextを呼ぶ(express側で404を処理する)
  gzip:        true, #原則としてgzipで配信する

app.use mount