反向代理指的是以代理服務器接收用戶的的訪問請求,代理用戶向內部服務器從新發起請求,最後把內部服務器的響應信息返回給用戶。這樣,代理服務器對外就表現爲一臺服務器,而訪問內部服務器的客戶端用的就是代理服務器,而不是真實網站訪問用戶。html
環境說明前端
假若有AB兩個服務器。A服務器提供web資源,而且只給內網訪問。B服務器有兩塊網卡,一塊與A服務器在一個內網,以塊是外網。此時,用戶C想直接訪問A服務器是行不通的。這時就能夠經過B服務器代理用戶C的請求去訪問A服務器了。nginx
hostname | 網卡 | IP | 說明 |
---|---|---|---|
moli-04 | ens33 | 192.168.30.6 | 內網IP,代理服務器 |
moli-04 | ens37 | 192.168.93.129 | 外網IP,代理服務器 |
moli-05 | ens33 | 192.168.30.7 | 內網服務器 |
配置虛擬主機
moli-04機器上編輯虛擬主機配置文件,內容以下:web
[root@moli-04 extra]$ cat blog.syushin.org.conf server{ listen 80; server_name blog.syushin.org; location / { proxy_pass http://192.168.30.7; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
更改hosts文件
windows上修改hosts文件,添加配置算法
192.168.93.129 blog.syushin.org
瀏覽器測試windows
訪問地址是192.168.93.129,出現的界面的05機器的頁面,配置成功。後端
負載均衡集羣在運行時,通常是經過一個或者多個前端負載均衡器將客戶訪問請求發到後端的一組服務器上。瀏覽器
嚴格來講,Nginx僅僅是做爲Nginx Proxy反向代理的使用的,可是由於這個反向代理功能表現的效果是負載均衡機器的效果,所以nginx負載均衡是特殊的反向代理。緩存
實現Nginx負載均衡的主要組件:安全
Nginx模塊 | 說明 |
---|---|
ngx_http_proxy_module | proxy代理模塊,用於把請求發送給服務器節點或upstream服務器池 |
ngx_http_upstream_module | 負載均衡模塊,能夠實現網站的負載均衡功能及節點的健康檢查 |
ngx_http_upstream_module模塊支持的代理方式有proxy_pass,fastcgi_pass等,主要使用proxy_pass
。
upstream模塊容許nginx定義一組或多組節點服務器組,使用時經過proxy_pass代理把網站的請求發送到定義好的對應的節點組中。
示例:建立節點服務器池
upstream blog { server 192.168.30.5:80 weight=5; server 192.168.30.6:81 weight=10; server 192.168.30.7:82 weight=15; }
upstream
:建立節點服務器組的關鍵字,必須有;blog
:節點服務器組的名字,必須有,可自定義名字;server
:關鍵字,後面可加IP或者域名或者IP:端口,不指定端口默認80;weight
:權重,數值越大被分配的請求越多。默認爲1
設置節點服務器的狀態值除了weight以外,還有:max_fails
:容許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤.fail_timeout
:max_fails次失敗後,暫停的時間。down
:表示當前的節點服務器不參與負載,標誌機器永遠不可用,可配合iP_hash使用backup
:其它全部的非backup機器down或者忙的時候,請求backup機器。因此這臺機器壓力會最輕。
使用域名的upstream
upstream blog2{ server www.syushin.com weight=5; server blog.syushin.org down; server blog.syushin.cc backup; }
rr輪詢(默認調度算法,靜態調度算法)
按客戶端請求順序把客戶端的請求逐一分配到不一樣的後端節點服務器。
wrr(權重輪詢,靜態調度算法)
在rr輪詢的基礎上加上權重,使用該算法的時候,權重和用戶訪問成正比,權重值越大,被轉發的請求就越多。
好比有30個請求,2臺服務器A(10.0.0.1)和B(10.0.0.2),若是但願A處理10個請求,B處理20個請求,能夠這樣定義:
upstream pools{ server 10.0.0.1 weight=1; server 10.0.0.2 weight=2; }
ip_hash(靜態調度算法)
每一個請求按客戶端IP的hash結果分配,當新的請求到達,先將客戶端IP經過哈希算法哈希出一個值,在隨後的分配客戶端請求中,客戶IP的哈希值只要相同,就會被分配到同一臺服務器。
upstream blog_pool{ ip_hash; server 192.168.30.5:80; server 192.168.30.6:8090; }
注意:當使用ip_hash時,不能有weight和backup。
least_conn算法
least_conn算法會根據後端服務器的鏈接數來以爲分配狀況,哪臺服務器鏈接數最少就分發多的請求。
調度算法除了上面所列的(經常使用)還有不少,就不一一列舉了。
http_proxy_module能夠將請求轉發到另一臺服務器,在反向代理中,會經過location
功能匹配指定的URI,而後把收到符合匹配的URI的請求經過proxy_pass
拋給定義好的upstream節點池
。
http_proxy模塊參數
參數 | 說明 |
---|---|
proxy_set_header | 設置http請求header項傳給後端服務器節點,例如:可實現讓代理後端的服務器節點獲取訪問客戶端用戶的真實IP地址 |
client_body_buffer_size | 用於指定客戶端請求主體緩衝區大小 |
proxy_connect_timeout | 表示反向代理後端節點服務器鏈接的超時時間,即發起握手等候響應的超時時間 |
proxy_send_timeout | 表示代理後端服務器的數據回傳時間,即在規定時間內後端服務器必須傳完全部數據,不然nginx將斷開這個鏈接 |
proxy_read_timeout | 設置nginx從代理的後端服務器獲取信息的時間,表示鏈接創建成功後,nginx等待後端服務器的響應時間,實際上是nginx已經進入後端的排隊之中等候處理的時間 |
proxy_buffer_size | 設置緩衝區大小,默認該緩衝區大小等於指令proxy_buffers設置的大小 |
proxy_buffers | 設置緩衝區的數量和大小,nginx從代理的後端服務器獲取的響應信息,會設置到緩衝區 |
proxy_busy_buffers_size | 用於設置相同很忙時可使用的proxy_buffers大小,官方推薦的大小爲 proxy_buffers * 2 |
proxy_trmp_file_write_size | 指定proxy緩存臨時文件的大小 |
proxy_pass使用
格式:proxy_pass URL;
示例以下:
proxy_pass http://blog.syushin.com/; proxy_pass http://192.168.30.7:8080/uri; proxy_pass http://tmp/www.sock;
URL能夠是域名,IP地址也能夠是socket文件。
對於proxy_pass的配置有幾點須要注意:
示例1
location /upload/ { proxy_pass http://192.168.30.7; }
示例2
location /upload/ { proxy_pass http://192.168.30.7/; # 注意多了一個斜杆 }
示例3
location /upload/ { proxy_pass http://192.168.30.7/blog/; }
示例4
location /upload/ { proxy_pass http://192.168.30.7/blog; }
假如server_name爲blog.syushin.com,當請求http://blog.syushin.com/uploa...,上面示例1-4的請求結果是:
示例1:http://192.168.30.7/upload/index.html 示例2:http://192.168.30.7/index.html 示例3:http://192.168.30.7/blog/index.html 示例4:http://192.168.30.7/blogindex.html