Nginx反向代理和負載均衡

負載均衡:在多個提供相同服務的服務器中,負載均衡服務器存在虛擬的IP,當大量客戶端從外部訪問虛擬服務IP地址時,
  負載均衡設備將這些報文請求根據負載均衡算法,將流量均衡的分配給後臺服務器以平衡各個服務器的負載壓力。
  反向代理:反向代理(Reverse Proxy)方式是指用代理服務器來接受 internet 上的鏈接請求,而後將請求轉發給內部
  網絡上的服務器,並將從服務器上獲得的結果返回給 internet 上請求鏈接的客戶端,此時代理服務器對外
  就表現爲一個反向代理服務器。
舉個例子,一個用戶訪問 http://www.example.com/readme,可是 www.example.com 上並不存在 readme 頁面,
它是偷偷從另一臺服務器上取回來,而後做爲本身的內容返回給用戶。可是用戶並不知情這個過程。對用戶來講
,就像是直接從 www.example.com 獲取 readme 頁面同樣。這裏所提到的 www.example.com 這個域名對應的服務器
就設置了反向代理功能。html

 

反向代理實例!nginx

什麼是反向代理

反向代理(Reverse Proxy)方式是指用代理服務器來接受 internet 上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給 internet 上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。git

舉個例子,一個用戶訪問 http://www.example.com/readme,可是 www.example.com 上並不存在 readme 頁面,它是偷偷從另一臺服務器上取回來,而後做爲本身的內容返回給用戶。可是用戶並不知情這個過程。對用戶來講,就像是直接從 www.example.com 獲取 readme 頁面同樣。這裏所提到的 www.example.com 這個域名對應的服務器就設置了反向代理功能。github

反向代理服務器,對於客戶端而言它就像是原始服務器,而且客戶端不須要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將得到的內容返回給客戶端,就像這些內容本來就是它本身的同樣。以下圖所示:web

proxy

反向代理典型應用場景

反向代理的典型用途是將防火牆後面的服務器提供給 Internet 用戶訪問,增強安全防禦。反向代理還能夠爲後端的多臺服務器提供負載均衡,或爲後端較慢的服務器提供 緩衝 服務。另外,反向代理還能夠啓用高級 URL 策略和管理技術,從而使處於不一樣 web 服務器系統的 web 頁面同時存在於同一個 URL 空間下。算法

Nginx 的其中一個用途是作 HTTP 反向代理,下面簡單介紹 Nginx 做爲反向代理服務器的方法。後端

場景描述:訪問本地服務器上的 README.md 文件 http://localhost/README.md,本地服務器進行反向代理,從 https://github.com/moonbingbing/openresty-best-practices/blob/master/README.md 獲取頁面內容。瀏覽器

nginx.conf 配置示例:安全

worker_processes 1; pid logs/nginx.pid; error_log logs/error.log warn; events { worker_connections 3000; } http { include mime.types; server_tokens off; ## 下面配置反向代理的參數 server { listen 80; ## 1. 用戶訪問 http://ip:port,則反向代理到 https://github.com location / { proxy_pass https://github.com; 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; } ## 2.用戶訪問 http://ip:port/README.md,則反向代理到 ## https://github.com/.../README.md location /README.md { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass https://github.com/moonbingbing/openresty-best-practices/blob/master/README.md; } } }

成功啓動 Nginx 後,咱們打開瀏覽器,驗證下反向代理的效果。在瀏覽器地址欄中輸入 localhost/README.md,返回的結果是咱們 GitHub 源代碼的 README 頁面。以下圖:服務器

proxy_example

咱們只須要配置一下 nginx.conf 文件,不用寫任何 web 頁面,就能夠偷偷地從別的服務器上讀取一個頁面返回給用戶。

下面咱們來看一下 nginx.conf 裏用到的配置項:

(1) location

location 項對請求 URI 進行匹配,location 後面配置了匹配規則。例如上面的例子中,若是請求的 URI 是 localhost/,則會匹配 location / 這一項;若是請求的 URI 是 localhost/README.md,則會匹配 location /README.md 這項。

上面這個例子只是針對一個肯定的 URI 作了反向代理,有的讀者會有疑惑:若是對每一個頁面都進行這樣的配置,那將會大量重複,可否作 批量 配置呢?此時須要配合使用 location 的正則匹配功能。具體實現方法可參考本書的 URL 匹配章節

(2) proxy_pass

proxy_pass 後面跟着一個 URL,用來將請求反向代理到 URL 參數指定的服務器上。例如咱們上面例子中的 proxy_pass https://github.com,則將匹配的請求反向代理到 https://github.com

(3) proxy_set_header

默認狀況下,反向代理不會轉發原始請求中的 Host 頭部,若是須要轉發,就須要加上這句:proxy_set_header Host $host;

除了上面提到的經常使用配置項,還有 proxy_redirect、proxy_set_body、proxy_limit_rate 等參數,具體用法能夠到Nginx 官網查看。

正向代理

既然有反向代理,天然也有正向代理。簡單來講,正向代理就像一個跳板,例如一個用戶訪問不了某網站(例如 www.google.com),可是他能訪問一個代理服務器,這個代理服務器能訪問 www.google.com,因而用戶能夠先連上代理服務器,告訴它須要訪問的內容,代理服務器去取回來返回給用戶。例如一些常見的FQ工具、遊戲代理就是利用正向代理的原理工做的,咱們須要在這些正向代理工具上配置服務器的 IP 地址等信息。

相關文章
相關標籤/搜索