Nginx 反向代理
如果有一個nodejs服務在你的機器上跑 並正在監聽3000端口 但你要把他發佈時又因為美觀問題想直接使用80端口 這時侯就你會用到反向代理了
代理這一個概念相信也不陌生 例如常用的網頁代理服務就是當你要瀏覽一個網站時 先經過一個跳板,他會把你的請求發到該網站上收到訊息後再轉發給你 而反向代理也類似,只是用在服務器上而已 在一個機器上的反向代理收到請求後,會把該請求轉發給正在監聽中的服務 然後把處理完的回覆再經反向代理發給用戶
反向代理有幾個優點
- 端口轉接
- 把原有服務的端口穩藏,代理幫你監聽更常用的http/https端口
- SSL終止
- 反向代理接收的是SSL加密訊息,但傳給服務時可以用回非SSL加密的http,使服務設計時不需兼顧到SSL的處理,方便佈置
- 負載平衡
- 也通過一些設定來把請求均分到多個服務上
- 緩存
- 亦可因應設計把部份不需即時回應的請求緩存
例子
一個nodejs的web server,正在監聽3000這個端口 再註冊一個域名 example.com,並把域名指到這台機器上 在/etc/nginx/conf.d/中新增 example.conf
server {
# 監聽 port 80
listen 80;
listen \[::\]:80;
# 只有是example.com的請求才會處理
server_name example.com;
location / {
# 把請求轉發到本機的port 3000
proxy_pass http://localhost:3000/;
# 在請求的http header中把原來的ip寫入到x-Real-IP header 中 (*)
proxy\_set\_header X-Real-IP $remote_addr;
}
}
(*) 這樣處理的原因是當反向代理轉發請求時, 本身請求的部份消息會被覆蓋掉 如果你在服務上處理請求時拿到的地址很有可能是本機的地址(127.0.0.1) 因為這是反向代理的地址 所以加入X-Real-IP後這可以在服務上利用該header 去獲取用戶的真實地址