2024年1月24日 星期三

使用 Nginx 提供 http 反向代理

作者陳勇勳 Jacky Chen    精誠資訊/恆逸教育訓練中心-資深講師

說到Proxy Server想必大家都有耳聞,且大多數的internet使用者或多或少都有使用Proxy Server的經驗,但如果說Proxy Server除了常用的Cache Proxy還有Reverse Proxy,這可能就有部分的使用者沒有聽過了,那這兩者有何不同呢?


  • Cache Proxy

    Cache Proxy主要的目的在提供Cache來加速用戶端瀏覽網頁的速度,如上圖所示,當企業內部的User A透過Proxy Server來下載檔案readme.pdf時,Proxy Server會化身為用戶端的角色,去跟internet上的Web Server要求readme.pdf這個檔案,當Proxy Server將readme.pdf下載回來之後,會將readme.pdf存一分到Proxy Server的硬碟之中,接著再將readme.pdf傳送給 User A,如此User A就完成下戴readme.pdf檔的流程;此時若企業內的User B也需要下載readme.pdf時,因此Proxy Server的硬碟中已有一分readme.pdf檔案,因此Proxy Server就直接從硬碟中將readme.pdf傳送給User B,如此User B就無需等待readme.pdf從internet下載回來需等待的時,Cache Proxy除了可以加速網頁的瀏覽之外,另一個好處是隱藏了用戶端的IP,因為internet上的Web Server會將Proxy Server視為用戶端。

  • Reverse Proxy

    如上圖所示,假設某企業有兩部Web Server,分別是www.abc.io及www.xyz.io兩部獨立的主機,這兩台Web Server透過Reverse Proxy將網站發佈到internet之上。
    首先我們需要將www.abc.io及www.xyz.io的名稱指向Reverse Proxy的IP,如此當internet有user要瀏覽www.abc.io時,其瀏覽器會將Reverse Proxy視為Web Server來存取,而這時Reverse Proxy可以從http header中看到user所要存取的網站名稱為何,接著Reverse Proxy化身為用戶端的角色向後端的www.abc.io提出網頁的請求,接著再將取得的網頁內容回應給internet上的user,如此就完成internet user瀏覽企業網站的流程。


    Reverse Proxy所帶來的好處:

    1. 隱藏了企業Web Server真實的IP位址

    2. 可在Reverse Proxy上執行存取的檢查

    3. 可以Cache某些靜態的網頁內容,以減少Web Server的負荷

    4. 節省Public IP的使用,而相同的概念也可以運用到Container之上,如下圖,主機上有4個Web Site分別以Container來執行,而4個Web Site所使用的Prot分別為 8001、8002、8003及8004,我們可以在起一個Container並在其中執行Reverse Proxy,如此就可以以一個Public IP來提供多個網站使用

  • 使用Nginx來擔任Reverse Proxy
    參數如下:
    主機外部 IP內部 IP
    Reverse Proxy10.0.0.1192.168.1.100
    www.abc.io10.0.0.1192.168.1.101
    www.xyz.io10.0.0.1192.168.1.103
  • Web Server

    分別在 Web1及Web2上建立 web service

    [root@ www ~]# dnf -y install httpd 
    [root@ www ~]# echo 'www.abc.io ...........'> /var/www/html/index.html
    [root@ www ~]# systemctl enable httpd --now
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
    [root@ www ~]#
  • Reverse Proxy Server
    1. 安裝nginx
      [root@ reverse ~]# dnf -y install nginx
    2. 建力檔案 /etc/nginx/conf.d/abc.conf
      server {
          listen       80;
          listen       [::]:80;
          server_name  www.abc.io;
          root         /usr/share/nginx/html;
          location/{
              proxy_pass http://www.abc.io:80; 
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
            }
      }
    3. 建力檔案 /etc/nginx/conf.d/xyz.conf
      server {
          listen       80;
          listen       [::]:80;
          server_name  www.xyz.io;
          root         /usr/share/nginx/html;
          location/{
              proxy_pass http://www.xyz.io:80; 
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
              }
      }
    4. 啟動nginx
      [root@ reverse ~]# systemctl enable nginx --now
  • 測試
    [root@localhost~]#
    [root@localhost~]# curl http://www.abc.io
    www.abc.io ..........
    [root@localhost~]#
    [root@localhost~]# curl http://www.xyz.io
    www.xyz.io ..........
    [root@localhost~]#

0 意見:

張貼留言