Nginx反向代理與負載均衡

反向代理

反向代理指的是以代理服務器接收用戶的的訪問請求,代理用戶向內部服務器從新發起請求,最後把內部服務器的響應信息返回給用戶。這樣,代理服務器對外就表現爲一臺服務器,而訪問內部服務器的客戶端用的就是代理服務器,而不是真實網站訪問用戶。html

爲何使用反向代理

  • 能夠起到保護網站安全的做用,由於任何來自Internet的請求都必須先通過代理服務器。
  • 經過緩存靜態資源,加速Web請求。
  • 實現負載均衡

反向代理例子

環境說明前端

假若有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 內網服務器
  • 兩臺機器都安裝nginx
  • moli-05服務器訪問是wordpress博客,域名blog.syushin.org
  • 虛擬機實驗環境,就都關閉防火牆了

配置虛擬主機
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

clipboard.png
訪問地址是192.168.93.129,出現的界面的05機器的頁面,配置成功。後端

負載均衡

負載均衡的功能

  • 對用戶的訪問請求進行調度管理
  • 對用戶的訪問請求進行壓力分擔

負載均衡集羣在運行時,通常是經過一個或者多個前端負載均衡器將客戶訪問請求發到後端的一組服務器上。瀏覽器

Nginx負載均衡

嚴格來講,Nginx僅僅是做爲Nginx Proxy反向代理的使用的,可是由於這個反向代理功能表現的效果是負載均衡機器的效果,所以nginx負載均衡是特殊的反向代理。緩存

實現Nginx負載均衡的主要組件:安全

Nginx模塊 說明
ngx_http_proxy_module proxy代理模塊,用於把請求發送給服務器節點或upstream服務器池
ngx_http_upstream_module 負載均衡模塊,能夠實現網站的負載均衡功能及節點的健康檢查

upstream模塊介紹

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模塊

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
相關文章
相關標籤/搜索