目錄
- 前言
- 1. Nginx配置樣例
- 2. Nginx負載均衡方式
- 2.1 輪詢
- 2.2 權重
- 2.3 Nginx解決集群共享session問題的方案
- 3. Nginx動靜分離(靜態資源和動態資源來自于不同的服務器)
- 總結
前言
對于Nginx首先要了解的是Nginx的作用和它的代理方式,Nginx的作用為負載均衡、代理方式為反向代理。
負載均衡:平衡web服務器集群中轉發給各服務器的請求數,防止出現服務器因為處理請求壓力大或小導致內存溢出、宕機或資源浪費的情況發生。
反向代理:對外暴露的地址是代理服務器的地址隱藏了真實服務器的地址,客戶端將請求發送到代理服務器上。由代理服務器根據配置規則選擇真實服務器處理請求,在獲得服務器返回數據后再返回給客戶端。此時代理服務器在外看來就是提供服務的服務器,客戶端對代理是無感知的并不知道具體是哪臺服務器處理的它的請求且不需要做任何配置。
正向代理:例如當因工需要,需要訪問瀏覽器正常訪問不到的服務器時,此時要找到一個可以訪問該服務器的代理服務器??蛻舳藢⒄埱蟀l送給代理服務器,代理服務器去訪問該服務器,然后將訪問到的數據返回給我們,這樣的代理模式稱為正向代理。正向代理時真實客戶端的信息被屏蔽或者隱藏了,服務器只清楚請求來自哪臺代理服務器而不清楚來自哪個客戶端,但客戶端非常明確要訪問的服務器地址。
即:正向代理代理的是客戶端的請求,反向代理代理的是服務器。
1. Nginx配置樣例
例如頁面請求地址為http://www.sayhi.com/products/pageManage,則在nginx.conf中配置server如下:
server { listen 80; #監聽80的服務端口 server_name www.sayhi.com; #監聽的域名 location /{ root emstatic; index index.html; } location /products { proxy_pass http://127.0.0.1:8103/zuul-product/product/manage; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Origin' '*'; } }
根據域名www.sayhi.com和后綴/products匹配到server中的server_name和location后,將剩余url后綴/pageManage拼接到location中的配置項proxy_pass的url后通過網關訪問服務器資源。
所以訪問http://www.sayhi.com/products/pageManage時經過nginx配置后實際訪問的地址為http://127.0.0.1:8103/zuul-product/product/manage/pageManage。
2. Nginx負載均衡方式
2.1 輪詢
依次按照順序訪問后端的每一個服務器,按照這個計算,相當于平均分配請求給所有集群節點-物理均衡。首先準備一個upstream的虛擬域名,保管后端服務器的詳細信息。
? ? ? ?upstream ouservers{ ? ? ? ?? ? ? ?server 127.0.0.1:8091; ? ? ? ?? ? ? ?server 128.0.0.2:8092; ? ? ? ?? ? ? ?server 129.0.0.3:8093; ? ? ? ?}
nginx啟動時加載成為一個內存的list對象元素有3個分別是8091 8092 8093,負載均衡的計算都是通過這個list完成的,在server中使用proxy_pass指向這個新創建的upstream名稱ouservers。
添加server案例
? ? ? ?server{ ? ? ? ?? ? ? ?listen 80; ? ? ? ?? ? ? ?server_name www.ou.com; ? ? ? ?? ? ? ?location / { ? ? ? ?? ? ? ?? ? ? ?proxy_pass http://ouservers/; ? ? ? ?? ? ? ?} ? ? ? ?}
在訪問有多個用戶訪問www.ou.com時會把請求輪詢轉給127.0.0.1:8091、128.0.0.2:8093和129.0.0.3:8093服務器去處理。
2.2 權重
總是按照物理均衡分配并發有時候不滿足實際情況,按照情況通過占用比例的分配均衡邏輯就是權重(權衡比重)。權重基于輪詢完成,可以在upstream的輪詢基礎上添加權重的關鍵字weight,權重值越高轉發的請求越多(參數為整數等于down表示該server不可訪問)。
? ? ? ?upstream ouservers { ? ? ? ?? ? ? ?#補充后端服務器的ip:port-based ? ? ? ?? ? ? ?server 127.0.0.1:8091 weight=10; ? ? ? ?? ? ? ?server 128.0.0.2:8092 weight=5; ? ? ? ?? ? ? ?server 129.0.0.3:8093 weight=1; ? ? ? ?}
2.3 Nginx解決集群共享session問題的方案
在單節點進程中可以使用session屬性存儲一些數據。在一次會話中使用這些屬性如果是集群中會產生問題,不能實現集群共享session數據。由于session是屬于服務器端的技術,不同進程中生成的session對象無法共同使用,所以無法使用session會話技術實現攜帶狀態的請求功能。
數據通信共享:會話的session會被全部節點所存儲,并發高時會導致集群中每一個節點中都有量的session對象容易造成服務器內存溢出。
ip_hash黏著:根據ip做hash取余計算綁定服務器但有可能導致傾斜,會有服務器由于傾斜嚴重,提前宕機。
采用第三方容器:session數據不再存儲到服務器本地,采用第三方存儲使每個服務器連接這個第三方存儲讀寫數據。但引入第三方勢必導致多占用網絡訪問帶寬資源,對容器技術的穩定性,速度要求比較高。理論上存儲容器可以是關系型數據庫(例mysql)。但是非關系型數據庫(例redis)是更好的選擇。
nignx配置ip_hash黏著只需要在upstream的括號中填寫一個關鍵屬性 "ip_hash"。
? ? ? ?upstream ouservers { ? ? ? ?? ? ? ?ip_hash; ? ? ? ?? ? ? ?server 127.0.0.1:8091; ? ? ? ?? ? ? ?server 127.0.0.1:8092; ? ? ? ?? ? ? ?server 127.0.0.1:8093; ? ? ? ?}
3. Nginx動靜分離(靜態資源和動態資源來自于不同的服務器)
后端服務器集群是動態數據的來源,nginx作為http服務器代理用來管理后端所需文件和靜態資源,在nginx服務器中,準備好訪問的靜態資源可以通過域名url地址訪問。
添加server案例(以Linux系統為例)
? ? ? ?server{ ? ? ? ?? ? ? ?listen 80; ? ? ? ?? ? ? ?server_name www.image.com; ? ? ? ?? ? ? ?location /{ ? ? ? ?? ? ? ?? ? ? ?root?/home/static; #關鍵字root配置項為靜態資源的根目錄 ? ? ? ? ? ? ? ? ? ? ?index default.html #沒有找到指定靜態資源時默認訪問的靜態資源 ? ? ? ?? ? ? ?} ? ? ? ? }
具體流轉過程如下:請求地址http://www.image.com/xyy.png匹配server中的location后將靜態資源名稱tp.png銜接在root配置項后,拼接成資源在Nginx服務器上的絕對地址/home/static/tp.png根據地址拿到靜態資源返回到瀏覽器頁面給用戶展示。
root配置項:可以是文件夾絕對路徑,如Linux (root /home/static)、Windows(root C:/static)。也可以是文件夾相對路徑root static(表示在nginx安裝的根目錄有一個文件夾叫做static)。
index配置項:表示當訪問請求匹配到location中的root后,在沒有找到指定靜態資源時默認訪問的靜態資源地址。index也可以配置多個靜態資源,例如:index default1.html default2.html。如果靜態資源/home/static/default1.html不存在則接著驗證/home/static/default2.html是否存在,存在則用/default2.html在該server中發起內部重定向去重新匹配location)
注:在配置nginx.conf文件時需要將資源ip和監聽域名寫進Nginx服務器的本地hosts文件中(如127.0.0.1 www.sayhi.com)