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 去獲取用戶的真實地址