日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx反向代理与负载均衡应用实践(二)

發布時間:2024/3/13 Nginx 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx反向代理与负载均衡应用实践(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Nginx反向代理與負載均衡應用實踐(二)

鏈接:https://pan.baidu.com/s/1xB20bnuanh0Avs4kwRpSXQ
提取碼:migq
復制這段內容后打開百度網盤手機App,操作更方便哦

根據URL中的目錄地址實現代理轉發

1.軟硬件準備

1.1硬件準備

準備4臺VM虛擬機(有物理服務器更佳),一臺做負載均衡,三臺做RS,如下表:

HOSTNAMEIP說明分類
lb192.168.200.64Nginx負載均衡器
web01192.168.200.63Web01服務器上傳服務器池
web02192.168.200.60Web02服務器動態服務器池
web03192.168.200.65Web03服務器靜態服務器池

1.2軟件準備

  • 系統:CentOS6.5 x86_64
  • 軟件:nginx-1.10.2.tar.gz

2.根據URL中的目錄地址實現代理轉發的說明

案例背景:

  • 通過Nginx實現動靜分離,即通過Nginx反向代理配置規則實現讓動態資源和靜態資源及其他業務分別由不同的服務器解析,以解決網站性能,安全,用戶體驗等重要問題。
  • 下圖為企業常見的動靜分離集群架構圖,此架構圖適合網站前端只使用同一個域名提供服務的場景,例如,用戶訪問的域名是www.yunjisuan.com,然后,當用戶請求www.yunjisuan.com/upload/xx地址時候,代理會分配請求到上傳服務器池處理數據;當用戶請求www.yunjisuan.com/static/xx地址的時候,代理會分配請求到靜態服務器池請求數據;當用戶請求www.yunjisuan.com/xx地址的時候,即不包含上述指定的目錄地址路徑時,代理會分配請求到默認的動態服務器池請求數據(注意:上面的xx表示任意路徑)。

3.項目實戰準備

3.1先進行企業案例需求梳理:

  • 當用戶請求www.yunjisuan.com/upload/xx地址時,實現由upload上傳服務器池處理請求。
  • 當用戶請求www.yunjisuan.com/static/xx地址時,實現由靜態服務器池處理請求。
  • 除此以外,對于其他訪問請求,全都由默認的動態服務器池處理請求.

3.2在反向均衡上進行upstream模塊服務器池的配置

[root@lb conf]# pwd /usr/local/nginx/conf [root@lb conf]# cat nginx.conf worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream upload_pools { #將符合upload的請求交給上傳服務器池upload_poolsserver 192.168.200.63:80 weight=1;}upstream default_pools { #不符合上述規則的請求,默認全部交給動態服務器池default_poolsserver 192.168.200.60:80 weight=1;}upstream static_pools { #將符合static的請求交給靜態服務器池static_poolsserver 192.168.200.65:80 weight=1; }server {listen 80;server_name www.yunjisuan.com;location /upload/ {proxy_pass http://upload_pools;include extar/proxy.conf;}location / {proxy_pass http://default_pools;include extar/proxy.conf;}location /static/ {proxy_pass http://static_pools;include extar/proxy.conf;}} }[root@lb conf]# nginx -t #檢查配置文件是否有誤 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lb conf]# /usr/local/nginx/sbin/nginx -s reload #重啟Nginx服務

3.3在web上進行文件配置(方法一)

3.3.1 web01配置(上傳)

[root@web01 www]# pwd /usr/local/nginx/html/www [root@web01 www]# mkdir upload [root@web01 www]# echo "upload_pools" >> upload/index.html

3.3.2 web02測試

3.3.3 web02配置(默認-->動態)

[root@web02 www]# pwd /usr/local/nginx/html/www [root@web02 www]# echo "default_pools" > index.html

3.3.4 web01測試

3.3.5 web03配置(靜態)

[root@web03 www]# pwd /usr/local/nginx/html/www [root@web03 www]# mkdir static [root@web03 www]# echo "static_pools" >> static/index.html

3.3.6 web01測試

3.3.7其地址與實際訪問的內容輸出請對照下表:

節點IP及端口測試地址字符串為代表業務
web01192.168.200.63:80http://www.yunjisuan.com/upload/index.htmlstatic_pools
web02192.168.200.60:80http://www.yunjisuan.com/upload_pools
web03192.168.200.65:80http://www.yunjisuan.com/static/index.htmldefault_pools

3.4以if語句實現(方法二)

if ($request_uri ~* "^/static/(.*)$") { proxy_pass http://static_pools/$1; } if ($request_uri ~* "^/upload/(.*)$") { proxy_pass http://upload_pools/$1; } location / { proxy_pass http://default_pools; include proxy.conf; }

3.5根據URL目錄地址轉發的應用場景

  • 根據HTTP的URL進行轉發的應用情況,被稱為第7層(應用層)的負載均衡,而LVS的負載均衡一般用于TCP等的轉發,因此被稱為第4層(傳輸層)的負載均衡。
  • 在企業中,有時希望只用一個域名對外提供服務,不希望使用多個域名對應同一個產品業務,此時就需要在代理服務器上通過配置規則,使得匹配不同規則的請求會交給不同的服務器池處理。這類業務有:
  • 業務的域名沒有拆封或者不希望拆分,但希望實現動靜分離,多業務分離,這在前面已經講解過案例了。
  • 不同的客戶端設備(例如:手機和PC端)使用同一個域名訪問同一個業務網站,就需要根據規則將不同設備的用戶請求交給后端不同的服務器處理,以便得到最佳用戶體驗。這也是非常重要的.

4.根據客戶端的設備(user_agent)轉發實踐需求

為了讓不同的客戶端設備用戶訪問有更好的體驗,需要在后端架設不同服務器來滿足不同的客戶端訪問,例如:移動客戶端訪問網站,就需要部署單獨的移動服務器及程序,體驗才能更好,而且移動端還分蘋果,安卓,Ipad等,在傳統的情況下,一般用下面的辦法解決這個問題

4.1常規4層負載均衡解決方案架構

在常規4層負載均衡架構下,可以使用不同的域名來實現這個需求,例如,人為分配好讓移動端用戶訪問wap.yunjisuan.com,PC客戶端用戶訪問www.yunjisuan.com,通過不同域名來引導用戶到指定的后端服務器,該解決方案的架構圖如下:

此解決方案的最大問題就是不同客戶端的用戶要記住對應的域名!而絕大多數用戶只會記住www.yunjisuan.com,不會記住wap.yunjisuan.com,這樣一來就會導致用戶體驗不是很好。有沒有辦法讓所有客戶端用戶只訪問一個統一的www.yunjisuan.com這個地址,還能讓不同客戶端設備都能有更好的訪問體驗呢?當然有!那就是下面的第7層負載均衡解決方案。

4.2第7層負載均衡解決方案

在第7層負載均衡架構下,就可以不需要人為拆分域名了,對外只需要用一個域名,例如www.yunjisuan.com,通過獲取用戶請求中的設備信息(利用$http_user_agent獲取),根據這些信息轉給后端合適的服務器處理,這個方案最大好處就是不需要讓用戶記憶多個域名了,用戶只需要記住主網站地址www.yunjisuan.com,剩下的由網站服務器處理,這樣的思路大大地提升了用戶訪問體驗,這是當前企業網站非常常用的解決方案。下圖描述了上述解決方案相應的架構邏輯圖:

4.3根據客戶端設備(user_agent)轉發請求實踐

這里還是使用static_pools,upload_pools作為本次實驗的后端服務器池。下面先根據計算機客戶端瀏覽器的不同設置對應的匹配規則。(由于沒有合適的實驗驗證環境,這里僅作需求實現的細節講解)

location / { if ($http_user_agent ~* "MSIE") #如果請求的瀏覽器為微軟IE瀏覽器(MSIE),則讓請求由static_pools池處理 { proxy_pass http://static_pools; } if ($http_user_agent ~* "Chrome") #如果請求的瀏覽器為谷歌瀏覽器(Chrome),則讓請求由upload_pools池處理 { proxy_pass http://upload_pools; } proxy_pass http://default_pools; #其他客戶端,由default_pools處理 include proxy.conf; }

除了針對瀏覽器外,上述“$http_user_agent”變量也可針對移動端,比如安卓,蘋果,Ipad設備進行匹配,去請求指定的服務器,具體細節配置如下:

location / { if ($http_user_agent ~* "android") { proxy_pass http://android_pools; #這里是android服務器池 } if ($http_user_agent ~* "iphone") { proxy_pass http://iphone_pools; #這里是iphone服務器池 } proxy_pass http://pc_pools; #這里是默認的pc服務器池 include extra/proxy.conf; }

4.4根據文件擴展名實現代理轉發

除了根據URI路徑及user_agent轉發外,還可以實現根據文件擴展名進行轉發(這里僅以細節配置作為講解內容,如需測試請同學們自行實驗)

4.4.1相關server配置

#先看看location方法的匹配規則,如下: location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ { proxy_pass http://static_pools; include proxy.conf; } #下面是if語句方法的匹配規則: if ($request_uri ~* ".*\.(php|php5)$") { proxy_pass http://php_server_pools; } if ($request_uri ~* ".*\.(jsp|jsp*|do|do*)$") { proxy_pass http://java_server_pools; }

4.4.2 根據擴展名轉發的應用場景

可根據擴展名實現資源的動靜分離訪問,如圖片,視頻等請求靜態服務器池,PHP,JSP等請求動態服務器池。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ { proxy_pass http://static_pools; include proxy.conf; } location ~ .*\.(php|php3|php5)$ { proxy_pass http://dynamic_pools; include proxy.conf }

在開發無法通過程序實現動靜分離的時候,運維可以根據資源實體進行動靜分離,而不依賴于開發,具體實現策略是先把后端的服務器分成不同的組。注意,每組服務器的程序都是相同的,因為開發沒有把程序拆開,分組后,在前端代理服務器上通過講解過的路徑,擴展名進行規則匹配,從而實現請求的動靜分離。

5.Nginx負載均衡檢測節點狀態

5.1簡介

  • 淘寶技術團隊開發了一個Tengine(Nginx的分支)模塊Nginx_upstream_check_module,用于提供主動式后端服務器健康檢查。通過它可以檢測后端realserver的健康狀態,如果后端realserver不可用,則所有的請求就不會轉發到該節點上。
  • Tengine原生支持這個模塊,而Nginx則需要通過打補丁的方式將該模塊添加到Nginx中。補丁下載地址:https://github.com/yaoweibin/nginx_upstream_check_module下面介紹如何使用這個模塊。

5.2安裝nginx_upstream_check_module模塊

5.2.1檢查環境

#系統已經安裝了nginx-1.10.2軟件 [root@lb yang]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.10.2 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

5.2.2#安裝必備安裝包

[root@lb ~]# yum -y install wget unzip patch [root@yangwenbo ~]# rpm -qa wget unzip patch wget-1.12-1.8.el6.x86_64 patch-2.6-6.el6.x86_64 unzip-6.0-1.el6.x86_64

5.2.3下載補丁包

[root@lb ~]# cd /yang [root@lb yang]# wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master [root@lb yang]# ls master [root@lb yang]# unzip master [root@lb yang]# mv nginx_upstream_check_module-master /usr/src/

5.2.4因為是對源程序打補丁,所以還需要Nginx源程序

[root@lb yang]# cd /usr/src/nginx-1.10.2/ [root@lb nginx-1.10.2]# patch -p0 < /usr/src/nginx_upstream_check_module-master/check_1.9.2+.patch patching file src/http/modules/ngx_http_upstream_hash_module.c patching file src/http/modules/ngx_http_upstream_ip_hash_module.c patching file src/http/modules/ngx_http_upstream_least_conn_module.c patching file src/http/ngx_http_upstream_round_robin.c patching file src/http/ngx_http_upstream_round_robin.h

5.2.5備份源安裝程序

[root@lb nginx-1.10.2]# cd /usr/local/ [root@lb local]# ls bin etc games include lib lib64 libexec nginx sbin share src [root@lb local]# mv nginx{,.ori} [root@lb local]# ls bin etc games include lib lib64 libexec nginx.ori sbin share src

5.2.6#重新進行編譯,編譯的參數要和以前一致,最后加上 --add-module=/usr/src/nginx_upstream_check_module-master/

[root@lb local]# cd /usr/src/nginx-1.10.2/ [root@lb nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/usr/src/nginx_upstream_check_module-master/ #以下省略。。。 [root@lb nginx-1.10.2]# make && make install #以下省略。。。

5.2.7拷貝源配置文件到當前Nginx的安裝目錄下

[root@lb local]# pwd /usr/local [root@lb local]# cp nginx.ori/conf/nginx.conf nginx/conf/ cp: overwrite `nginx/conf/nginx.conf'? y [root@lb local]# cp nginx.ori/conf/extar/proxy.conf nginx/conf/extar/[root@lb local]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

5.3配置Nginx健康檢查,如下:

[root@lb conf]# pwd /usr/local/nginx/conf [root@lb conf]# cat nginx.conf worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream static_pools {server 192.168.200.63:80 weight=1;server 192.168.200.65:80 weight=1;check interval=3000 rise=2 fall=5 timeout=1000 type=http; #對static服務器池開啟健康監測}upstream default_pools {server 192.168.200.60:80 weight=1;}server {listen 80;server_name www.yunjisuan.com;location / {proxy_pass http://default_pools;include extar/proxy.conf;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {proxy_pass http://static_pools;include extar/proxy.conf;}location /status {check_status; #啟動健康檢查模塊 access_log off; #關閉此location的訪問日志記錄 }} }

5.4重啟lb1的nginx服務

[root@lb conf]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lb conf]# /usr/local/nginx/sbin/nginx [root@lb conf]# netstat -antup | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3817/nginx #注意此處必須重啟Nginx,不能重新加載

check interval=3000 rise=2 fall=5 timeout=1000 type=http;
上面配置的意思時,對static_pools這個負載均衡條目中的所有節點,每隔3秒檢測一次,請求2次正常則標記realserver狀態為up,如果檢測5次都失敗,則標記realserver的狀態為down,超時時間為1秒,檢查的協議是HTTP。
詳細用法見官網:http://tengine.taobao.org/document_cn/http_upstream_check_cn.html

5.5訪問頁面時,顯示如下圖所示:

5.6在lb1配置文件的upstream default_pools{}里也加入健康監測命令

[root@lb conf]# cat nginx.conf worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;upstream static_pools {server 192.168.200.63:80 weight=1;server 192.168.200.65:80 weight=1;check interval=3000 rise=2 fall=5 timeout=1000 type=http; }upstream default_pools {server 192.168.200.60:80 weight=1;check interval=3000 rise=2 fall=5 timeout=1000 type=http;對default服務器池開啟健康監測}server {listen 80;server_name www.yunjisuan.com;location / {proxy_pass http://default_pools;include extar/proxy.conf;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {proxy_pass http://static_pools;include extar/proxy.conf;}location /status {check_status; access_log off; }} }[root@lb conf]# /usr/local/nginx/sbin/nginx -s reload #重啟服務

5.7再次訪問健康監測頁面時,顯示如下圖所示:

5.8宕掉任意一個RS節點后(3個Web服務器任選一個關閉nginx服務)

[root@web01 ~]# /usr/local/nginx/sbin/nginx -s stop

5.9再次訪問健康監測頁面時,顯示如下圖所示:

6. proxy_next_upstream 參數補充

當Nginx接收后端服務器返回proxy_next_upstream參數定義的狀態碼時,會將這個請求轉發給正常工作的后端服務器,例如500,502,503,504,此參數可以提升用戶的訪問體驗,具體配置如下:

server {listen 80; server_name www.yunjisuan.com; location / {proxy_pass http://static_pools; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; include proxy.conf;}}

總結

以上是生活随笔為你收集整理的Nginx反向代理与负载均衡应用实践(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。