天天看點

Nginx實戰(三)反向代理與負載均衡

文章目錄

    • 寫在前面
    • 基本要點
    • 代理伺服器
      • 1、什麼是代理伺服器
      • 2、為什麼要使用代理伺服器
    • 反向代理 VS 正向代理
      • 1、什麼是正向代理?什麼是反向代理?
      • 2、反向代理有哪些主要應用?
    • 反向代理伺服器Nginx
    • 負載均衡
    • 總結

寫在前面

為什麼這一章節放在第三這麼靠前呢?前面的第一章節介紹和第二章節的安裝實話說都是沒什麼技術含量的。而反向代理和負載均衡的配置,是我覺得在nginx中是最常用、也是最關鍵的一個配置之一。

我最初接觸nginx,上司給我的第一個任務也是實作一個負載均衡。而實作負載均衡需要通過反向代理來實作。我開始配置時是蒙的,但之後發現,簡單的配置其實就是幾行配置而已,幾秒鐘就實作了。是以我把這個配置放在前面,作為入門可能比較合适。

基本要點

  • proxy_pass是首先要了解的指令,它是反向代理的關鍵,通過它可以配置代理的伺服器,這個伺服器可以是一個指定的伺服器,也可以是一組伺服器
  • 如果是一個伺服器,很簡單,就配置ip端口即可
  • 如果是一組伺服器,就需要用到upstream指令了
  • 是以了解upstream這個指令也非常重要
  • 我第一次看見别人配置的upstream,還以為是自定義的一個變量
  • 其實upstream是上遊伺服器的意思,通過它可以代理多台伺服器,這樣就達到了負載均衡的目的

下面詳細說一下代理和負載是怎麼配置的。

代理伺服器

1、什麼是代理伺服器

代理伺服器,客戶機在發送請求時,不會直接發送給目的主機,而是先發送給代理伺服器,代理服務接受客戶機請求之後,再向主機發出,并接收目的主機傳回的資料,存放在代理伺服器的硬碟中,再發送給客戶機。

2、為什麼要使用代理伺服器

1)提高通路速度

由于目标主機傳回的資料會存放在代理伺服器的硬碟中,是以下一次客戶再通路相同的站點資料時,會直接從代理伺服器的硬碟中讀取,起到了緩存的作用,尤其對于熱門站點能明顯提高請求速度。

2)防火牆作用

由于所有的客戶機請求都必須通過代理伺服器通路遠端站點,是以可在代理伺服器上設限,過濾某些不安全資訊。

3)通過代理伺服器通路不能通路的目标站點

網際網路上有許多開發的代理伺服器,客戶機在通路受限時,可通過不受限的代理伺服器通路目标站點,通俗說,我們使用的翻牆浏覽器就是利用了代理伺服器,雖然不能出國,但也可直接通路外網。

反向代理 VS 正向代理

1、什麼是正向代理?什麼是反向代理?

正向代理,架設在客戶機與目标主機之間,隻用于代理内部網絡對Internet的連接配接請求,客戶機必須指定代理伺服器,并将本來要直接發送到Web伺服器上的http請求發送到代理伺服器中。

反向代理伺服器架設在伺服器端,通過緩沖經常被請求的頁面來緩解伺服器的工作量,将客戶機請求轉發給内部網絡上的目标伺服器;并将從伺服器上得到的結果傳回給Internet上請求連接配接的用戶端,此時代理伺服器與目标主機一起對外表現為一個伺服器。

2、反向代理有哪些主要應用?

現在許多大型web網站都用到反向代理。除了可以防止外網對内網伺服器的惡性攻擊、緩存以減少伺服器的壓力和通路安全控制之外,還可以進行負載均衡,将使用者請求配置設定給多個伺服器。

反向代理伺服器Nginx

Nginx作為近年來較火的反向代理伺服器,安裝在目的主機端,主要用于轉發客戶機請求,背景有多個http伺服器提供服務,nginx的功能就是把請求轉發給後面的伺服器,決定哪台目标主機來處理目前請求。下面示範如何進行配置使Nginx發揮作用。

1、模拟n個http伺服器作為目标主機

用作測試,簡單的使用2個tomcat執行個體模拟兩台http伺服器,分别将tomcat的端口改為8081和8082

2、配置IP域名

192.168.1.9 8081.da.com

192.168.1.9 8082.da.com

3、配置nginx.conf

upstream tomcatserver1 {  
    server 192.168.2.9:8081;  
    }  
upstream tomcatserver2 {  
    server 192.168.2.9:8082;  
    }  
server {  
        listen       80;  
        server_name  8081.da.com;  
        location / {  
            proxy_pass   http://tomcatserver1;  
            index  index.html index.htm;  
        }       
    }  
server {  
        listen       80;  
        server_name  8082.da.com;  
        location / {  
            proxy_pass   http://tomcatserver2;  
            index  index.html index.htm;  
        }          
    }  
           

流程:

1)浏覽器通路8081.da.com,通過本地host檔案域名解析,找到192.168.2.9伺服器(安裝nginx)。其實就是把192.168.2.9:80代理到192.168.2.9:8081。這個明顯就是開發的時候弄的,真實的場景,一般是兩台不同ip的伺服器,這裡隻是測試,是以我們用同一台機器的兩個不同端口分開示範就可以了。

2)nginx反向代理接受客戶機請求,找到server_name為8081.da.com的server節點,根據proxy_pass對應的http路徑,将請求轉發到upstream tomcatserver1上,即端口号為8081的tomcat伺服器。

負載均衡

你可以發現,上面并沒有負載均衡啊!

是的,暫時還沒有。如果要負載多台,非常的簡單,改一下upstream即可。

upstream tomcatserver1 {  
    server 192.168.2.9:8081;  
    server 192.168.2.10:8081;  
    server 192.168.2.11:8081;  
}  
           

就這樣,就負載了三台tomcat了。當通路的時候,采用nginx預設的輪詢,平均的通路三台中的一台。

至于怎麼修改負載的政策,以後再寫。

總結

随便舉個假想的例子,以百度網站為例,如果客戶機的IP和百度伺服器(目标主機)的IP在同一個網段,那就形同區域網路内部發送請求,速度極快。

但這一般不太可能,是以如果滿足不了這種需求還想到達到一個較好的請求響應時,百度伺服器就可以對外提供一個與目标伺服器在一個網段的公網IP,也就是反向代理服務的IP,通過代理伺服器轉發客戶機請求,決定幕後的N台伺服器誰來處理這個請求,并且由于反向代理伺服器與目标主機在一個網段,通路速度也會很快。

Nginx用作反向代理伺服器時,它就是衆多反向代理伺服器中的一種,通過簡單的配置,指定到伺服器IP或域名位址便可将客戶機請求轉發給指定伺服器處理請求。

繼續閱讀