UbuntuにNode.js環境の構築とUNIXドメインソケットによるNginxとの連携
UbuntuにNode.js環境の構築とUNIXドメインソケットによるNginxとの連携:
今更、これを記事にしなくてもと思う人が大半だろう。Node.jsとNginxの連携など、いくらでも情報がある。しかし意外なことに、UNIXドメインソケットを使って連携する方法はQiitaの記事に存在しなかった。何故かTCPのlocalhost:3000を使用しているものばかりだ。
パフォーマンス的にはUNIXドメインソケットを使う方が優れているので、同じサーバ上で動いているのなら、わざわざTCPを使う必要性は無い。
この辺りの比較記事は他力本願で丸投げしたいと思う。
TCP localhostとUnix Domain Socketはどちらが速いのか?
調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話
などを参照されたし。
Node.jsの10系統をインストールする(デフォルトだと現時点では8系統)
CentOS系だとaptをyumに置き換えるだけ
プログラムをホームディレクトリに置くのを前提条件として以下のような構成を作る
テストプログラムの作成
UNIXドメインソケットを使用する場合いくつかの注意事項がある
・UNIXドメインソケットは通信を行うのにファイルが生成されるのだが、プログラムが終了しても自動的に削除されない
ファイルが存在した場合ソケットの生成に失敗するので、事前に削除
・実行ユーザとNginxのIDが異なると、アクセス権の問題で接続できない
その場合はOtherに書き込み権限を与える必要がある
Otherにアクセス権を与えたくない場合は、実行ユーザのグループにnginxのID(www-data)を追加する
usermod -Ga ユーザ名 www-data
ちなみにCentOSではnginxのIDはnginxだ
グループへの追加コマンドを実行したらnginxの再起動を行わないと、アクセス権が更新されないので注意すること
/etc/nginx/sites-enabled/default に以下の設定を追加
サイトの設定を別のファイルに行っている場合は、適宜内容を読み替えて欲しい
node_appフォルダをカレントディレクトリに設定し、以下のコマンドを実行
確認
ログアウトしても動作させたい場合は、コマンドを以下のようにする
ただしこの方法をテスト以外の目的で使用するのはお勧めしない
daemon化するならpm2辺りを使うと幸せになれる
UNIXドメインソケットはNode.jsだけでなく、その他のアプリケーションサーバやDBなどでも利用できる。通信対象が同じインスタンス内であるのならlocalhost:xxxxは無駄にパフォーマンスを下げるだけなので、それをやってしまっているのなら切り替えていくことをおすすめする。
なぜ今更、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ドメインソケットは通信を行うのにファイルが生成されるのだが、プログラムが終了しても自動的に削除されない
ファイルが存在した場合ソケットの生成に失敗するので、事前に削除
・実行ユーザと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辺りを使うと幸せになれる
コメント
コメントを投稿