Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

SoraKumo
TypeScriptでフロントエンドフレームワーク JWF(JavaScript-Window-Framework)を開発しています 世の中のWebシステムをSPA化するため、活動を続けています
https://ttis.croud.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away