意外に解説のないUNIXドメインソケット
今更、これを記事にしなくてもと思う人が大半だろう。Node.jsとNginxの連携など、いくらでも情報がある。しかし意外なことに、UNIXドメインソケットを使って連携する方法はQiitaの記事に存在しなかった。何故かTCPのlocalhost:3000を使用しているものばかりだ。
パフォーマンス的にはUNIXドメインソケットを使う方が優れているので、同じサーバ上で動いているのなら、わざわざTCPを使う必要性は無い。
Node.jsのインストール
Node.jsの10系統をインストールする(デフォルトだと現時点では8系統)
CentOS系だとaptをyumに置き換えるだけ
curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
sudo apt -y install nodejs
インストール結果の確認
nodejs -v
#テストアプリケーションの作成
プログラムをホームディレクトリに置くのを前提条件として以下のような構成を作る
~/node_app/ Node.jsアプリ作成用親ディレクトリ
app/ Node.jsのプログラム置き場
sock/ UNIXドメインソケット置き場
テストプログラムの作成
const SOCK_PATH = 'sock/app.sock' //ドメインソケット用パス
var fs = require('fs')
var http = require('http')
var server = http.createServer()
server.on('request',function(req,res) {
res.writeHead(200)
res.write('<html><body>Hello world</body></html>\n')
res.end()
})
try{fs.unlinkSync(SOCK_PATH)}catch(e){} //ソケットファイルの削除
server.listen(SOCK_PATH) //ソケットの待ち受け設定
fs.chmodSync(SOCK_PATH, '666') //アクセス権の変更
UNIXドメインソケットを使用する場合いくつかの注意事項がある
・UNIXドメインソケットは通信を行うのにファイルが生成されるのだが、プログラムが終了しても自動的に削除されない
ファイルが存在した場合ソケットの生成に失敗するので、事前に削除
・実行ユーザとNginxのIDが異なると、アクセス権の問題で接続できない
その場合はOtherに書き込み権限を与える必要がある
Otherにアクセス権を与えたくない場合は、実行ユーザのグループにnginxのID(www-data)を追加する
usermod -Ga ユーザ名 www-data
ちなみにCentOSではnginxのIDはnginxだ
グループへの追加コマンドを実行したらnginxの再起動を行わないと、アクセス権が更新されないので注意すること
#Nginxの設定
/etc/nginx/sites-enabled/default に以下の設定を追加
サイトの設定を別のファイルに行っている場合は、適宜内容を読み替えて欲しい
upstream nodesock{
server unix:/対象ディレクトリ/node_app/sock/app.sock;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
・
・
・
location = /nodejs/ {
proxy_pass http://nodesock/;
}
}
#結果の確認
node_appフォルダをカレントディレクトリに設定し、以下のコマンドを実行
nodejs app/index.js
確認
http://アドレス/nodejs/
ログアウトしても動作させたい場合は、コマンドを以下のようにする
nohup nodejs app/index.js &
ただしこの方法をテスト以外の目的で使用するのはお勧めしない
daemon化するならpm2辺りを使うと幸せになれる
#まとめ
UNIXドメインソケットはNode.jsだけでなく、その他のアプリケーションサーバやDBなどでも利用できる。通信対象が同じインスタンス内であるのならlocalhost:xxxxは無駄にパフォーマンスを下げるだけなので、それをやってしまっているのなら切り替えていくことをおすすめする。