代理
要想弄明白反向代理,首先要知道啥是正向代理,要搞懂正向代理只需要知道啥是代理即可。代理其實就是一箇中介,在不同事物或同一事物內部起到居間聯繫作用的環節。比如買票黃牛,房屋中介等等。
在互聯網中代理更多指的是代理服務器,代理服務器位於客戶端和服務器之間,它充當兩者之間的中介。這種代理在生活中是比較常見的,比如我們常說的搭個梯子上網,用到的就是代理技術。
正向代理
正向代理(forward proxy):是一個位於客戶端和目標服務器之間的服務器(代理服務器),為了從目標服務器取得內容,客戶端向代理服務器發送一個請求並指定目標,然後代理服務器向目標服務器轉交請求並將獲得的內容返回給客戶端。
比如國內訪問谷歌,直接訪問是不行的,我們可以通過一個能夠訪問谷歌的正向代理服務器,請求發到代理服務器,由代理去谷歌獲取數據並返回,這樣就變相的實現了訪問谷歌的需求。
一句話總結:正向代理,就是代理服務器代理了客戶端,去和目標服務器進行交互。
正向代理的用途:
突破 IP 訪問限制
通過緩存加速訪問資源
隱藏客戶端真實 IP
客戶端訪問授權
反向代理
反向代理(Reverse Proxy):與正向代理正好相反,反向代理中的代理服務器,代理的是服務器那端。代理服務器接收客戶端請求,然後將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給客戶端,此時代理服務器對外表現為一個反向代理服務器的角色。
反向代理服務器位於用戶與目標服務器之間,但是對於用戶而言,反向代理服務器就相當於目標服務器,即用戶直接訪問反向代理服務器就可以獲得目標服務器的資源。同時,用戶不需要知道目標服務器的地址,也無須在用戶端作任何設定。
一句話總結:反向代理,就是代理服務器代理了目標服務器,去和客戶端進行交互。
反向代理的用途:
隱藏服務器真實 IP
負載均衡
通過緩存加速訪問資源
提供安全保障
負載均衡
實際生產環境中,反向代理服務器代理的目標服務器可能不止一個。比如開發好的某個應用部署在一臺 Tomcat 服務器上,而 Tomcat 的併發上限不優化情況下,默認只有兩百左右,這時候為了解決高併發的問題,就只能選擇更替服務器或者搭建多臺服務器通過反向代理與負載均衡的技術解決併發問題。
負載均衡(Load Balance)是由多臺服務器以對稱的方式組成一個服務器集群,每臺服務器都具有等價的地位,都可以單獨對外提供服務而無須其他服務器的輔助。經過某種負載分管技術,將外部發送來的中央請求均勻分配到對稱結構中的
某一臺服務器上。
總結
正向代理,就是代理服務器代理了客戶端,去和目標服務器進行交互。現實生活中的場景:黃牛買票。
反向代理,就是代理服務器代理了目標服務器,去和客戶端進行交互。現實生活中的場景:房屋中介。
Nginx 反向代理與負載均衡
前面我們提到搭建多臺服務器並通過反向代理與負載均衡的技術可以解決併發問題,那麼負載均衡的實現從哪來?為了避免重複造輪子,我們選擇現成已有的成熟工具幫助我們完成這項工作。Nginx 就是一個不錯的選擇。
Nginx 是由 Igor Sysoev(伊戈爾 · 賽索耶夫)為俄羅斯訪問量第二的 https://www.rambler.ru/ 站點開發的。Nginx 是一個高性能的 HTTP 和反向代理服務器,可以扛得住 5W 左右的併發。Ngnix 一方面可以做反向代理服務器,另外一方面還可以做靜態資源服務器。本文主要學習如何使用 Nginx 實現反向代理與負載均衡。
官網:http://nginx.org/
環境
三臺
CentOS 7.8.2003
機器
192.168.10.101
安裝
Nginx 1.18.0
192.168.10.102
和
192.168.10.103
安裝
Tomcat 9.0.38
安裝 Nginx
下載資源
下載 Nginx 並解壓。
<code># 下載 nginx 壓縮包 wget -P /usr/local/src http://nginx.org/download/nginx-1.18.0.tar.gz # 解壓 tar -zxvf /usr/local/src/nginx-1.18.0.tar.gz -C /usr/local/src/<code>
安裝依賴
Nginx 是基於 C 語言開發的,HTTP 模塊使用了 pcre 來解析正則表達式,且可以使用 zlib 對 HTTP 包的內容進行 gzip 壓縮,Nginx 不僅支持 HTTP 協議,還支持 HTTPS,HTTPS 需要 openssl 提供支持,所以安裝 Nginx 之前必須先安裝它所依賴的環境。
<code>yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl-devel/<code>
安裝 Nginx
編譯並安裝。
<code># 切換至 nginx 的解壓目錄 cd /usr/local/src/nginx-1.18.0 # 創建 nginx 的安裝目錄 mkdir -p /usr/local/nginx # 指定 nginx 的安裝路徑 ./configure --prefix=/usr/local/nginx/ # 編譯並安裝 make && make install/<code>
常用命令
<code># 切換目錄 cd /usr/local/nginx # 啟動 sbin/nginx # 重啟 sbin/nginx -s reload # 停止 sbin/nginx -s quit/<code>
訪問
啟動 Nginx 以後,瀏覽器訪問:http://192.168.10.101:80/ 結果如下:
安裝 Tomcat
下載資源
下載 Tomcat 並解壓。
<code># 下載 tomcat 壓縮包 wget -P /usr/local/src https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.tar.gz # 創建目錄 mkdir -p /usr/local/tomcat # 解壓t /usr/local/src/apache-tomcat-9.0.38.tar.gz -C /usr/local/tomcat/<code>
修改頁面
修改 Tomcat 自帶 ROOT 項目中的 index.jsp 頁面。
<code># 編輯 index.jsp vim /usr/local/tomcat/apache-tomcat-9.0.38/webapps/ROOT/index.jsp/<code>
在 body 標籤中隨便添加點內容用於區分不同的服務器。
<code>192.169.10.102:8080
192.169.10.103:8080
/<code>
啟動訪問
/usr/local/tomcat/apache-tomcat-9.0.38/bin/startup.sh 啟動 Tomcat。
啟動 Tomcat 以後,瀏覽器訪問:http://192.168.10.102:8080/ 和 http://192.168.10.103:8080/ 結果如下:
配置 Nginx
vim /usr/local/nginx/conf/nginx.conf 編輯配置文件。
在 http 節點下,添加 upstream 節點。使用 upstream name{} 語法定義一組服務器。
然後在 server 節點的 80 端口下添加下圖中的內容。默認情況下,Nginx 是按加權輪詢的方式將請求分發到各個服務器,當權重 weight 不指定時,各服務器 weight 相同。關於 Nginx 啟動用戶的問題請根據自身實際環境進行配置。
反向代理負載均衡
通過上面的流程,我們已經完成基於 Nginx 實現反向代理 Tomcat 服務器集群與負載均衡的需求。重啟 Nginx 以後,此時再訪問 Nginx 則會被路由到被代理的 Tomcat 服務器上,並且採用了輪詢方式(默認)的負載均衡算法。客戶端請求到 Nginx 的中央請求會每臺一次的平均分配至 Tomcat 每個機器上。