LoginSignup
6
8

More than 5 years have passed since last update.

Node.js環境の構築とUNIXドメインソケットによるNginxとの連携

Posted at

意外に解説のない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ドメインソケット置き場

テストプログラムの作成

app/indes.js
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は無駄にパフォーマンスを下げるだけなので、それをやってしまっているのなら切り替えていくことをおすすめする。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8