1. 程式人生 > >一篇文章搞定 Nginx 反向代理與負載均衡

一篇文章搞定 Nginx 反向代理與負載均衡

## 代理      要想弄明白反向代理,首先要知道啥是正向代理,要搞懂正向代理只需要知道啥是代理即可。代理其實就是一箇中介,在不同事物或同一事物內部起到居間聯絡作用的環節。比如買票黃牛,房屋中介等等。   在網際網路中代理更多指的是代理伺服器,代理伺服器位於客戶端和伺服器之間,它充當兩者之間的中介。這種代理在生活中是比較常見的,比如我們常說的搭個梯子上網,用到的就是代理技術。    ## 正向代理      **正向代理(forward proxy)**:是一個位於客戶端和目標伺服器之間的伺服器(代理伺服器),為了從目標伺服器取得內容,客戶端向代理伺服器傳送一個請求並指定目標,然後代理伺服器向目標伺服器轉交請求並將獲得的內容返回給客戶端。   比如國內訪問谷歌,直接訪問是不行的,我們可以通過一個能夠訪問谷歌的正向代理伺服器,請求發到代理伺服器,由代理去谷歌獲取資料並返回,這樣就變相的實現了訪問谷歌的需求。   一句話**總結**:正向代理,就是`代理伺服器代理了客戶端`,去和目標伺服器進行互動。    ![](https://mrhelloworld.com/resources/articles/nginx/timg.jpg " ")      **正向代理的用途**: - 突破 IP 訪問限制 - 通過快取加速訪問資源 - 隱藏客戶端真實 IP - 客戶端訪問授權    ## 反向代理      **反向代理(Reverse Proxy)**:與正向代理正好相反,反向代理中的代理伺服器,代理的是伺服器那端。代理伺服器接收客戶端請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給客戶端,此時代理伺服器對外表現為一個反向代理伺服器的角色。   反向代理伺服器位於使用者與目標伺服器之間,但是對於使用者而言,反向代理伺服器就相當於目標伺服器,即使用者直接訪問反向代理伺服器就可以獲得目標伺服器的資源。同時,使用者不需要知道目標伺服器的地址,也無須在使用者端作任何設定。   一句話**總結**:反向代理,就是`代理伺服器代理了目標伺服器`,去和客戶端進行互動。    ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928153021318.png)      **反向代理的用途**: - 隱藏伺服器真實 IP - 負載均衡 - 通過快取加速訪問資源 - 提供安全保障    ## 負載均衡      實際生產環境中,反向代理伺服器代理的目標伺服器可能不止一個。比如開發好的某個應用部署在一臺 Tomcat 伺服器上,而 Tomcat 的併發上限不優化情況下,預設只有兩百左右,這時候為了解決高併發的問題,就只能選擇更替伺服器或者搭建多臺伺服器通過反向代理與負載均衡的技術解決併發問題。    ![](https://mrhelloworld.com/resources/articles/nginx/timg-1601280894041.jpg " ")      **負載均衡**(Load Balance)是由**多臺伺服器以對稱的方式組成一個伺服器叢集**,每臺伺服器都具有等價的地位,都可以單獨對外提供服務而無須其他伺服器的輔助。經過某種負載分管技術,將外部發送來的**中央請求均勻分配**到對稱結構中的**某一臺伺服器**上。    ## 總結      正向代理,就是`代理伺服器代理了客戶端`,去和目標伺服器進行互動。現實生活中的場景:黃牛買票。   反向代理,就是`代理伺服器代理了目標伺服器`,去和客戶端進行互動。現實生活中的場景:房屋中介。    ## Nginx 反向代理與負載均衡    ![](https://mrhelloworld.com/resources/articles/nginx/nginx.png " ")      前面我們提到搭建多臺伺服器並通過反向代理與負載均衡的技術可以解決併發問題,那麼負載均衡的實現從哪來?為了避免重複造輪子,我們選擇現成已有的成熟工具幫助我們完成這項工作。Nginx 就是一個不錯的選擇。 ![](https://mrhelloworld.com/resources/articles/nginx/timg-1601278769063.jpg " ")   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 並解壓。 ```shell # 下載 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 ```    #### 安裝依賴      Nginx 是基於 C 語言開發的,HTTP 模組使用了 pcre 來解析正則表示式,且可以使用 zlib 對 HTTP 包的內容進行 gzip 壓縮,Nginx 不僅支援 HTTP 協議,還支援 HTTPS,HTTPS 需要 openssl 提供支援,所以安裝 Nginx 之前必須先安裝它所依賴的環境。 ```shell yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl-devel ```    #### 安裝 Nginx      編譯並安裝。 ```shell # 切換至 nginx 的解壓目錄 cd /usr/local/src/nginx-1.18.0 # 建立 nginx 的安裝目錄 mkdir -p /usr/local/nginx # 指定 nginx 的安裝路徑 ./configure --prefix=/usr/local/nginx/ # 編譯並安裝 make && make install ```    #### 常用命令    ```shell # 切換目錄 cd /usr/local/nginx # 啟動 sbin/nginx # 重啟 sbin/nginx -s reload # 停止 sbin/nginx -s quit ```    #### 訪問      啟動 Nginx 以後,瀏覽器訪問:http://192.168.10.101:80/ 結果如下: ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928165146842.png " ")    ### 安裝 Tomcat    #### 下載資源      下載 Tomcat 並解壓。 ```shell # 下載 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 # 解壓 tar -zxvf /usr/local/src/apache-tomcat-9.0.38.tar.gz -C /usr/local/tomcat ```    #### 修改頁面      修改 Tomcat 自帶 ROOT 專案中的 index.jsp 頁面。 ```shell # 編輯 index.jsp vim /usr/local/tomcat/apache-tomcat-9.0.38/webapps/ROOT/index.jsp ```   在 body 標籤中隨便新增點內容用於區分不同的伺服器。 ```html

192.169.10.102:8080

192.169.10.103:8080

``` ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928170233146.png " ") ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928170011859.png " ")    #### 啟動訪問      `/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/ 結果如下: ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928170555573.png " ") ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928170635264.png " ")    ### 配置 Nginx      `vim /usr/local/nginx/conf/nginx.conf` 編輯配置檔案。   在 `http` 節點下,新增 `upstream` 節點。使用 `upstream name{}` 語法定義一組伺服器。   然後在 `server` 節點的 80 埠下新增下圖中的內容。預設情況下,Nginx 是按加權輪詢的方式將請求分發到各個伺服器,當權重 `weight` 不指定時,各伺服器 `weight` 相同。關於 Nginx 啟動使用者的問題請根據自身實際環境進行配置。 ![](https://mrhelloworld.com/resources/articles/nginx/image-20200928171300565.png " ")    ### 反向代理負載均衡      通過上面的流程,我們已經完成基於 Nginx 實現反向代理 Tomcat 伺服器叢集與負載均衡的需求。重啟 Nginx 以後,此時再訪問 Nginx 則會被路由到被代理的 Tomcat 伺服器上,並且採用了輪詢方式(預設)的負載均衡演算法。客戶端請求到 Nginx 的中央請求會每臺一次的平均分配至 Tomcat 每個機器上。關於 Nginx 更多詳細的配置及負載均衡演算法我們後面再另開文章細說。 ![](https://user-gold-cdn.xitu.io/2020/5/1/171cf87f564bc82e?w=433&h=133&f=gif&s=333013) 本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。 大家可以通過 `分類` 檢視更多關於 `Nginx` 的文章。