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

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


なぜ今更、Node.jsの環境構築の記事を書くのか

今更、これを記事にしなくてもと思う人が大半だろう。Node.jsとNginxの連携など、いくらでも情報がある。しかし意外なことに、UNIXドメインソケットを使って連携する方法はQiitaの記事に存在しなかった。何故かTCPのlocalhost:3000を使用しているものばかりだ。

 パフォーマンス的にはUNIXドメインソケットを使う方が優れているので、同じサーバ上で動いているのなら、わざわざTCPを使う必要性は無い。

 この辺りの比較記事は他力本願で丸投げしたいと思う。

  TCP localhostとUnix Domain Socketはどちらが速いのか?

  調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話

 などを参照されたし。


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

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)