本稿ではNode.jsのビルトインモジュールhttpを使い、UNIXドメインソケットをリッスンするHTTPサーバの立て方を説明する。サンプルコードにはTypeScriptを用いる。
本稿のゴール
Node.jsのhttp.Server
でUNIXドメインソケットを使ったHTTPサーバを立て、そのサーバとHTTPで話してみる。
http.Serverでドメインソケットを使う
ドメインソケットをリッスンするHTTPサーバの立て方の実装例を示す。
import http, {IncomingMessage, ServerResponse} from 'http'
import fs from 'fs';
const socketFile = '/tmp/http.sock'
fs.existsSync(socketFile) && fs.unlinkSync(socketFile) // ソケットファイルがあるとHTTPサーバが起動しないため
// HTTPサーバ
http.createServer((req: IncomingMessage, res: ServerResponse): void => {
res.write('Hello!')
res.end()
}).listen(socketFile)
ポイントとしては、listen
関数にポート番号を与えるのではなく、ソケットファイルのファイルパスを与えること。与えられたファイルパスにファイルがあるとHTTPサーバは起動しない。そのため、listen
を呼び出す前にソケットファイルが無いことを確認しておく必要がある。
ドメインソケット越しにHTTPサーバと話す
ドメインソケットを通じて、HTTPサーバにリクエストを送ってみる。ここではnc
コマンドを使う。
echo -e "GET / HTTP/1.1\nHost:localhost\n" | nc -U /tmp/http.sock
出力結果
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2019 09:56:25 GMT
Connection: keep-alive
Transfer-Encoding: chunked
6
Hello!
0
HTTPサーバからのレスポンスが表示される。