使用 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所帶來的好處:
隱藏了企業Web Server真實的IP位址
可在Reverse Proxy上執行存取的檢查
可以Cache某些靜態的網頁內容,以減少Web Server的負荷
節省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 Proxy 10.0.0.1 192.168.1.100 www.abc.io 10.0.0.1 192.168.1.101 www.xyz.io 10.0.0.1 192.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
安裝nginx
[root@ reverse ~]# dnf -y install nginx
建力檔案 /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; } }
建力檔案 /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; } }
啟動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 意見:
張貼留言