(Legacy)
Unix Socket#
今天心血來潮在看 unix socket 突然想到 node 可不可以把 服務監聽在一個 socket file 這樣在設定的時候就不用記哪個服務是幾 port
node 部份#
監聽在 unix socket#
查完資料後發現其實只要把原本填 port 的地方改成 socket file 的路徑就好了 像這樣
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World\n');
});
app.listen('/tmp/express.sock');
js刪除 socket file#
因為每次的 listen 都會新增一個 socket file
相當於佔用一個 port
如果不刪除的話就相當於 port 被佔用了
會噴錯
所以每次程式結束的時候要把這個 socket file 刪掉
然後在 /tmp
下的檔案會在開機後自動刪掉
所以如果部屬後發什麼問題重開機就對了!
修改完的 code 長這樣
const fs = require('fs');
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World\n');
});
app.listen('/tmp/express.sock', console.log);
process.on('SIGINT', () => {
fs.unlinkSync('/tmp/express.sock');
process.exit(0);
});
js測試#
弄完了伺服器
要怎麼測試呢?
這時候可以用 curl
來測試
$ curl --unix-socket /tmp/express.sock http://localhost
Hello World
plaintextnginx reverse proxy#
現在我們把伺服器開好了
但是 unix socket 只能在本機瀏覽啊!
所以我們要透過 nginx 來幫忙做 reverse proxy
先新增一個 /etc/nginx/sites-available/test.conf
server{
listen 80;
server_name t.localhost;
location / {
proxy_pass http://unix:/tmp/express.sock:/;
}
}
plaintext然後在 /etc/hosts
新增一條
127.0.0.1 t.localhost
plaintext最後就可以打開瀏覽器 http://t.localhost ↗ 應該會出現 502 Getway Error 為什麼呢? 因為 socket file 的權限設定 其他使用者 (nginx) 無法開啟 所以要
$ chmod 777 /tmp/express.sock
plaintext這樣就可以啦!