1. 程式人生 > 實用技巧 >nginx 配置反向代理

nginx 配置反向代理

nginx 配置反向代理

基本概念

代理:代替處理

正向代理

正向代理方式是指用代理伺服器來代替內部網路中的計算機(配置好代理伺服器的 IP)發出 Internet 上的連線請求,然後將請求結果返回給他們。

反向代理

反向代理方式是指用代理伺服器來接受 Internet 上的連線請求,然後將請求轉發給內部網路中的上游伺服器,並將從上游伺服器得到的結果返回給 Internet 上請求連線的客戶端,此時代理伺服器對外的表現就是一個 Web 伺服器。充當反向代理伺服器也是 Nginx 的一種常見用法。

正向代理、反向代理區別

  • 正向代理代理客戶端,反向代理代理服務端。
  • 正向代理隱藏客戶端,反向代理隱藏服務端。

練習

下面練習配置 nginx 反向代理,讓 nginx 充當反向代理伺服器。

  1. 部署 travel 專案 到被代理伺服器 tomcat

    刪除 tomcat 自帶專案
        cd /usr/local/tomcat/apache-tomcat-7.0.57/webapps  
        rm -rf ./*
    
    將 travel 專案打包成 ROOT.war
        修改 finalName
        <finalName>ROOT</finalName>
        打包
        mvn package
        注:打成 ROOT.war 的好處是在 tomcat 中部署後,不需要去輸入專案名稱訪問。
    
    上傳 ROOT.war
        cd /usr/local/tomcat/apache-tomcat-7.0.57/webapps
        rz
    
    啟動 tomcat
        cd /usr/local/tomcat/apache-tomcat-7.0.57/bin
        ./startup.sh
    
    訪問 ROOT 專案
        本地火狐瀏覽器位址列輸入:192.168.214.128:8080
    
  2. 配置反向代理伺服器 nginx

    在 nginx 配置檔案 nginx.conf 中:
    
    # upstream 定義了一個上游伺服器的叢集(這裡只有一個上游伺服器),便於反向代理中的 proxy_pass 使用
    upstream tomcat-travel {
        server 192.168.214.128:8080; # 被代理伺服器的 ip 和埠
    }
    
    server {
        listen       80; 
        server_name  www.hmtravel.com;
    
        location / {
            proxy_pass http://tomcat-travel; # 引用上面 upstream 中的 tomcat-travel
            index  index.html index.htm;
        }
    
        error_page   500 502 503 504  /50x.html;
    
        location = /50x.html {
            root   html;
        }
    }
    
  3. 啟動反向代理伺服器 nginx

    cd /usr/local/nginx/sbin
    ./nginx
    
  4. 訪問 travel 專案

    直接訪問被代理伺服器上的 travel 專案
        本地火狐瀏覽器位址列輸入 http://192.168.214.128:8080
    
    通過反向代理伺服器訪問 travel 專案
        本地火狐瀏覽器位址列輸入 http://wwww.hmtravel.com
    

nginx 基於反向代理/轉發的負載均衡

基本概念

伺服器叢集

多個 tomcat 上部署同一個專案,同時對外提供服務,就形成了 tomcat 的叢集。

好處:
    增強併發能力
    避免單點故障

負載均衡

如果伺服器叢集中的計算機效能都一樣,那麼應該做到每一個被訪問的機率一樣,這就是負載均衡。

練習

下面練習使用 nginx 實現基於反向代理/轉發的負載均衡。

部署 travel 專案到 3 個 tomcat

需要在 3 臺不同的機器上安裝 tomcat,部署同一個 travel 專案。

但是為了學習方便,現在將 3 個 tomcat 安裝在同一臺機器上。

這臺機器上之前已經通過解壓安裝了一份 tomcat,解壓在 /usr/local/tomcat/apache-tomcat-7.0.57,
並且已經上傳了 travel 專案,
因此再安裝 3 份 tomcat 並部署 travel 的做法如下:

1. 停止 tomcat
    cd /usr/local/tomcat/apache-tomcat-7.0.57/bin
    ./shutdown.sh

2. 複製 3 份
    cd /usr/local/tomcat
    cp -r apache-tomcat-7.0.57 tomcat1
    cp -r apache-tomcat-7.0.57 tomcat2
    cp -r apache-tomcat-7.0.57 tomcat3

3. 修改埠
    3.1 修改 tomcat1 埠
        cd /usr/local/tomcat/tomcat1/conf
        vim server.xml

        設定忽略大小寫
        :set ignorecase

        查詢 port
        /port

        按 n 查詢下一個,按 N 查詢上一個

        將查詢到的所有埠值 + 1(一共修改 5 個)

        儲存退出

    3.2 修改 tomcat2 埠
        同樣的方法,將對應配置檔案中查詢到的埠值 + 2

    3.3 修改 tomcat3 埠
        同樣的方法,將對應配置檔案中查詢到的埠值 + 3

4. 啟動 3 個tomcat
    cd /usr/local/tomcat/tomcat1/bin
    ./startup.sh

    cd /usr/local/tomcat/tomcat2/bin
    ./startup.sh

    cd /usr/local/tomcat/tomcat3/bin
    ./startup.sh

配置反向代理伺服器 nginx

nginx 配置檔案 nginx.conf 中:

# upstream 定義了一個上游伺服器的叢集
upstream tomcat-travel {
    # 向這 3 臺上遊伺服器轉發的機率相同,都為 1/3
    server 192.168.214.128:8081; # 被代理伺服器 tomcat1 的 ip 和埠
    server 192.168.214.128:8082; # 被代理伺服器 tomcat2 的 ip 和埠
    server 192.168.214.128:8083; # 被代理伺服器 tomcat3 的 ip 和埠
}

server {
    listen       80; 
    server_name  www.hmtravel.com;



    location / {
        proxy_pass http://tomcat-travel; # 引用上面 upstream 中的 tomcat-travel
        index  index.html index.htm;
    }


    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   html;
    }

}

啟動 nginx 或 重新載入 nginx 配置檔案

cd /usr/local/nginx/sbin
./nginx
或
cd /usr/local/nginx/sbin
./nginx -s reload

通過反向代理伺服器訪問 travel 專案

本地火狐瀏覽器位址列輸入 http://www.hmtravel.com,可以訪問到 travel 專案。
這個 travel 專案來自 tomcat1,也可能來自 tomcat2,還有可能來自 tomcat3,機率相等。 

驗證負載均衡

  1. 區分 travel 專案

    為了驗證訪問 3 個 tomcat 的機率相同,故意將部署在 3 個 tomcat 裡的 travel 專案變得不一樣。
    
    將部署在 tomcat1 裡的travel 專案的首頁 index.html 的標題改為 tomcat1
    將部署在 tomcat2 裡的travel 專案的首頁 index.html 的標題改為 tomcat2
    將部署在 tomcat3 裡的travel 專案的首頁 index.html 的標題改為 tomcat3
    
    注:html 的修改不必重啟 tomcat
    
  2. 再通過反向代理伺服器訪問 travel 專案

    本地火狐瀏覽器位址列輸入 http://www.hmtravel.com,可以訪問到 travel 專案。 
    非常快地重新整理 n 次,能夠看出 tomcat1,tomcat2,tomcat3 的比例接近 1:1:1。
    
  3. 修改負載均衡配置

    將來 tomcat1 tomcat2 tomcat3 會部署在不同的機器上。假設 tomcat3 所在機器是新買的,效能較好。希望 tomcat3 接受 50% 訪問量,tomcat1,tomcat2 分別接受 25% 訪問量。可以修改 nginx 配置檔案 nginx.conf 進行配置。

    # upstream 定義了一個上游伺服器的叢集
    upstream tomcat-travel {
        # 向這 3 臺上遊伺服器轉發的機率相同,都為 1/3
        server 192.168.214.128:8081; # 被代理伺服器 tomcat1 的 ip 和埠
        server 192.168.214.128:8082; # 被代理伺服器 tomcat2 的 ip 和埠
        server 192.168.214.128:8083 weight=2; # 被代理伺服器 tomcat3 的 ip 和埠
    }
    
    server {
        listen       80; 
        server_name  www.hmtravel.com;
    
    
    
        location / {
            proxy_pass http://tomcat-travel; # 引用上面 upstream 中的 tomcat-travel
            index  index.html index.htm;
        }
    
    
        error_page   500 502 503 504  /50x.html;
    
        location = /50x.html {
            root   html;
        }
    
    }
    
  4. 重新載入 nginx 配置檔案

    cd /usr/local/nginx/sbin
    ./nginx -s reload
    
  5. 通過反向代理伺服器訪問 travel 專案

    本地火狐瀏覽器位址列輸入 http://www.hmtravel.com,可以訪問到 travel 專案。
    非常快地重新整理 n 次,能夠看出 tomcat1,tomcat2,tomcat3 的比例接近 1:1:2。