Nginx實戰(五) 反向代理

樑桂釗發表於2016-10-18

Nginx實戰系列目錄

反向代理(Reverse Proxy)方式是指以代理伺服器來接受Internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給Internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

什麼是反向代理

反向代理(Reverse Proxy)方式是指以代理伺服器來接受Internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給Internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。

有反向代理,當然也存在正向代理的概念咯。正向代理指的是,一個位於客戶端和原始伺服器之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。

我們通過一個簡單例子,我們就很好的理解兩者之間的區別了。

所以,簡單的理解,就是正向代理是為客戶端做代理,代替客戶端去訪問伺服器,而反向代理是為伺服器做代理,代替伺服器接受客戶端請求。(感謝@Charles道道 補充)

為什麼使用反向代理

  • 可以起到保護網站安全的作用,因為任何來自Internet的請求都必須先經過代理伺服器。
  • 通過快取靜態資源,加速Web請求。
  • 實現負載均衡。順便說下,目前市面上,主流的負載均衡方案,硬體裝置有F5,軟體方案有四層負載均衡的LVS,七層負載均衡的Nginx、Haproxy等。

Nginx反向代理的實戰

在生產環境,Tomcat伺服器一般不單獨使用在專案中,我們一般通過nginx用於反向代理的伺服器,並將請求轉發給後端多臺Tomcat伺服器,從而達到負載均衡的目的。

Nginx的叢集配置

在http節點下,新增upstream節點,新增tomcat叢集。

upstream tomcats {
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
}

配置location為tomcat叢集

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_pass http://tomcats;
}

upstream還可以為每個裝置設定狀態值,這些狀態值的含義分別如下:

  • down:表示單前的server暫時不參與負載.
  • weight:預設為1.weight越大,負載的權重就越大。
  • max_fails:允許請求失敗的次數預設為1.當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤.
  • fail_timeout : max_fails次失敗後,暫停的時間。
  • backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
upstream tomcats{
      server 127.0.0.1:9001 down;
      server 127.0.0.1:9002 backup;
      server 127.0.0.1:9003 weight=2;
      server 127.0.0.1:9004 max_fails=2 fail_timeout=60s;   
}

分配策略

none(輪詢)

upstream按照輪詢(預設)方式進行負載,每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。雖然這種方式簡便、成本低廉。但缺點是:可靠性低和負載分配不均衡。

weight(權重)

指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。例如

server 192.168.61.22 weight = 6; # 60% 請求
server 192.168.61.23 weight = 4; # 40% 請求

ip_hash(訪問ip)

每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。

配置只需要在upstream中加入ip_hash;即可。

upstream tomcats {
      ip_hash;
      server 127.0.0.1:9001;
      server 127.0.0.1:9002;
}

fair(第三方)

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。與weight分配策略類似。

upstream tomcats {
      server 127.0.0.1:9001;
      server 127.0.0.1:9002;
      fair;
}

url_hash(第三方)

和IP雜湊類似,只不過針對請求的url進行hash(基於快取的server,頁面靜態化)。

一個模板

upstream tomcats  {
    server ip:8080; 
}

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

    location / {
        proxy_pass  http://tomcats;

        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
   }
}

反向代理實戰

現在,我們開始一個完整的配置,配置如下

upstream tomcats {
    server 127.0.0.1:9001;
    server 127.0.0.1:9002;
}

server {
    listen 80;
    server_name  www.lianggzone.com;
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://tomcats;
    }
}

這個時候,我們請求http://www.lianggzone.com/ 就會跳轉到響應的頁面了。

相關文章