オレオレAdvent Calendar2014-4日目、前回の続きです。
Twitter Source CheckerはConoHa WordPressテンプレート(Nginx)…このブログをホスティングしてるVPSにバックエンドにExpressを利用して作った簡単なアプリで動いています。
NginxをリバースプロクシにしてバックエンドでExpress
Twitter Source Checkerは単純なアプリですがTwitter REST APIを叩きます。そうでなくても毎回バックエンドのアプリにリクエストを送るのは無駄です。また、フロントはWordpressやHPで利用している80番ポートで受け、virtual Hostを利用する必要がありました。そこでNginxの出番です。
今回リバースプロクシでproxy_cacheを利用していますが、実はこれ、WordPress用の設定を流用できるんです。
/var/www/vhosts/express/にExpressアプリをおいていると仮定して、次のようなNginx設定ファイルを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
# Backend upstream backend_express { server unix:/var/www/vhosts/express/express.sock } # front server { listen 80; server_name express.example.com; access_log /var/log/nginx/express.access.log main; error_log /var/log/nginx/express.error.log; include /etc/nginx/drop; set $mobile ""; #モバイル分岐の場合設定ファイルを読み込む。 # include /etc/nginx/mobile-detect; set $do_not_cache 0; # POSTを利用する場合 if ($request_method = POST) { set $do_not_cache 1; } location / { include /etc/nginx/expires; proxy_no_cache $do_not_cache; proxy_cache_bypass $do_not_cache; proxy_redirect off; proxy_cache czone; proxy_cache_key "$scheme://$host$request_uri$mobile"; proxy_cache_valid 200 200m; proxy_pass http://backend_express } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } |
一方、Expressの方は一般的な自動生成テンプレートでは環境変数PORT
が指定されていればそのポート、なければ3000番でListenされるかと思うので起動する際にUnixドメインソケットでListenする位置を指定します。
今回はpm2を使ってデーモン化しているので次のようなprocess.jsonを作りました。
|
[ { "name":"tw-scc", "script":"./bin/www", "env":{ "NODE_ENV":"production", "PORT":"./express.sock" } } ] |
あるいはコマンドラインから起動する場合は
|
PORT=./express.sock ./bin/www |
これでエラーが出なければアクセスできるようになるはずです。が、Node.jsはプロセス終了時にこのListenしたsockを解放してくれないようです。
解放されないなら解放させればいい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
#!/usr/bin/env node require('coffee-script/register'); var debug = require('debug')('express_tw_s'); var app = require('../app'); var fs = require("fs"); app.set('port', process.env.PORT || 3000); var socket=app.get('port'); if (fs.existsSync(socket)) { fs.unlinkSync(socket); } var server = app.listen(app.get('port'), function() { debug('Express server listening on port ' + server.address().port); if (fs.existsSync(socket)) { fs.chownSync(socket,0,496);//chown root:nginx fs.chmodSync(socket,"775");//chmod 適切なパーミッションに変えること。 } }); |
これで多分Nginxでリバースプロクシ(200分キャッシュ)のExpressが配置できた。pm2については今回は省略。
ちなみにwebsocketを使うなら
|
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; |
をNginxのexpress.confに加えればリバースプロクシ出来るっぽい。なおNginxの負荷には注意。
次回はNode.jsからユーザー認証をせずにTwitter APIを叩いていきます。
関連