Nginx(四):Nginx常見應用示例

Nginx常見應用

Nginx 最常見的幾種應用場景

  • 反向代理
  • 負載均衡(反向代理某個應用服務器集羣)
  • 動靜分離(可以作爲靜態服務器來使用)
  • Nginx集羣部署(實現高可用)

上述應用都會牽扯到nginx.conf配置文件的配置,具體配置詳解參見道人另一篇文章。


一:反向代理

示例演示(Nginx服務器反向代理兩個tomcat服務)

Nginx服務器部署在192.168.32.133虛機上

web服務器(道人配置的兩臺虛機)

  • 192.168.32.134 上佈置tomcat1(端口8080)
  • 192.168.32.135 上佈置tomcat2(端口8080)

關鍵在於Nginx配置文件的配置

主要是在http塊中的server塊中配置 server_name 和 location 這兩個屬性,詳細配置如下。

修改window客戶端hosts文件(模仿下域名訪問)

  • hosts目錄是:C:\Windows\System32\drivers\etc
192.168.32.133 www.tomcat1.com
192.168.32.133 www.tomcat2.com

Nginx.conf 配置文件配置如下

...
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    # 第一個虛擬服務器
	server {
	    listen       80;
	    # 這裏需要修改爲你代理的服務器地址
	    server_name  www.tomcat1.com;
	    location / {
	        root  html;
	        # 這裏要更換爲你代理的服務器路徑
	        proxy_pass   http://192.168.32.134:8080;
	        index  index.jsp;
	    }
	}
	# 第二個虛擬服務器
    server {
        listen       80;
        # 這裏需要修改爲你代理的服務器地址
        server_name  www.tomcat2.com;
        location / {
            root  html;
            # 這裏要更換爲你代理的服務器路徑
            proxy_pass   http://192.168.32.135:8080;
            index  index.jsp;
        }
    }
}

關鍵配置:

在這裏插入圖片描述

重啓Nginx,訪問www.tomcat1.com,和www.tomcat2.com網址,均可正常訪問。

二:負載均衡

假設tomcat1,tomcat2佈置的是同一服務,Nginx實現請求在兩臺服務器上均勻分佈。

關鍵配置

http{
    ...
    #設定負載均衡的服務器列表
    upstream myserver {
        #weigth參數表示權值,權值越高被分配到的機率越大
        server 192.168.32.134:8080  weight=1;
        server 192.168.32.135:8080  weight=1;
    }
    server {
        #偵聽80端口
        listen       80;
        #定義使用www.xx.com訪問
        server_name  www.xx.com;
        #默認請求
        location / {
            # 代理地址
            proxy_pass  http://myserver;
            root   /root;      #定義服務器的默認網站根目錄位置
            index index.php index.html index.htm;  
        }
    }
}

Nginx.conf 配置文件配置如下
在這裏插入圖片描述

在這裏提一下,負載均衡算法有以下幾種方式。

1、熱備:如果你有2臺服務器,當一臺服務器發生事故時,才啓用第二臺服務器給提供服務。服務器處理請求的順序:AAAAAA突然A掛啦,BBBBBBBBBBBBBB…

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333 backup;  #熱備     
}

2、輪詢:nginx默認就是輪詢其權重都默認爲1,服務器處理請求的順序:ABABABABAB…

upstream mysvr { 
    server 127.0.0.1:7878;
    server 192.168.10.121:3333;       
}

3、加權輪詢:跟據配置的權重的大小而分發給不同服務器不同數量的請求。如果不設置,則默認爲1。下面服務器的請求順序爲:ABBABBABBABBABB…

upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

4、ip_hash:nginx會讓相同的客戶端ip請求相同的服務器。

upstream mysvr { 
    server 127.0.0.1:7878; 
    server 192.168.10.121:3333;
    ip_hash;
}

5、關於nginx負載均衡配置的幾個狀態參數講解。

  • down,表示當前的server暫時不參與負載均衡。

  • backup,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,纔會請求backup機器,因此這臺機器的壓力最輕。

  • max_fails,允許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。

  • fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails可以和fail_timeout一起使用。

upstream mysvr { 
    server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
    server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    
}

三:動靜分離

靜態資源:

http塊中server塊中location如下配置

表示url爲 /static/*.xxx 的圖片或者js等靜態資源則會到/html/static目錄下去尋找資源

location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
  alias html;
}

動態資源:

其他訪問url則轉發到proxy_pass 指向的 http://192.168.32.135:8080;

location / {
  proxy_pass http://192.168.32.135:8080;
}

四:Nginx集羣(保證高可用)

解決的是Nginx宕機導致服務不可用的問題。

採用方式:Keepalived+Nginx實現雙機熱備(主流方案)。

Keepalived高可用軟件

Keepalived軟件起初是專爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了可以實現高可用的VRRP功能。因此,keepalived除了能夠管理LVS軟件外,還可以作爲其他服務的高可用解決方案軟件。

keepalived軟件主要是通過VRRP協議實現高可用功能的。VRRP是Virtual Router Redundancy Protocol(虛擬路由冗餘協議)的縮寫,VRRP出現的目的就是爲了解決靜態路由的單點故障問題的,它能保證當個別節點宕機時,整個網絡可以不間斷地運行。所以,keepalived一方面具有配置管理LVS的功能,同時還具有對LVS下面節點進行健康檢查的功能,另一方面也可以實現系統網絡服務的高可用功能。

Nginx雙機熱備配置示例

準備兩臺服務器192.168.32.134 192.168.32.135 均安裝上Keepalived和Nginx。

Keepalived安裝

yum install keepalived -y

安裝成功後,/etc 目錄下會存在一個keepAlived目錄,該目錄即是keepAlived的安裝目錄。

Keepalived 配置文件修改以及說明

Keepalived的配置文件可以分爲三塊:

  • 全局定義塊:對整個 Keepalive 配置生效的,不管是否使用 LVS;
  • VRRP 實例定義塊:是 Keepalived 的核心;
  • 虛擬服務器(LVS)定義塊:LVS 配置只在使用 Keepalived 來配置和管理 LVS 時才需要使用,如果僅僅使用 Keepalived做 HA,LVS 的配置完全是不需要的。

配置文件的詳細說明如下:

global_defs {					#全局配置
	notification_email {		#指定keepalived在發生切換時需要發送email到的對象,一行一個
		[email protected]	#指定收件人郵箱
		[email protected]
		[email protected]
	}
	notification_email_from [email protected] #指定發件人
	smtp_server 192.168.200.1	#指定smtp服務器地址
	smtp_connect_timeout 30		#指定smtp連接超時時間
	router_id LVS_DEVEL			#此處注意router_id爲負載均衡標識,在局域網內應該是唯一的。
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}
 
vrrp_sync_group VG_1{				#監控多個網段的實例
	group {
		inside_network				#實例名
		outside_network
	}
	notify_master /path/xx.sh		#指定當切換到master時,執行的腳本
	netify_backup /path/xx.sh		#指定當切換到backup時,執行的腳本
	notify_fault "path/xx.sh VG_1" 	#故障時執行的腳本
	notify /path/xx.sh
	smtp_alert 						#使用global_defs中提供的郵件地址和smtp服務器發送郵件通知
}
 
vrrp_instance inside_network {
	state BACKUP 			#指定那個爲master,那個爲backup,如果設置了nopreempt這個值不起作用,主備考priority決定
	interface eth0 			#設置實例綁定的網卡
	dont_track_primary 		#忽略vrrp的interface錯誤(默認不設置)
	track_interface{ 		#設置額外的監控,裏面那個網卡出現問題都會切換
		eth0
		eth1
	}
	mcast_src_ip			#發送多播包的地址,如果不設置默認使用綁定網卡的primary ip
	garp_master_delay		#在切換到master狀態後,延遲進行gratuitous ARP請求
	virtual_router_id 50	#VPID標記
	priority 99				#優先級,高優先級競選爲master
	advert_int 1			#檢查間隔,默認1秒
	nopreempt				#設置爲不搶佔 注:這個配置只能設置在backup主機上,而且這個主機優先級要比另外一臺高
	preempt_delay			#搶佔延時,默認5分鐘
	debug					#debug級別
	authentication {		#設置認證
		auth_type PASS		#認證方式,類型主要有PASS、AH 兩種
		auth_pass 111111	#認證密碼
	}
	virtual_ipaddress {		#設置vip
		192.168.36.200
	}
}
 
vrrp_instance VI_1 {		#虛擬路由的標識符
	state MASTER			#狀態只有MASTER和BACKUP兩種,並且要大寫,MASTER爲工作狀態,BACKUP是備用狀態
	interface eth0			#通信所使用的網絡接口
    lvs_sync_daemon_inteface eth0  #這個默認沒有,相當於心跳線接口,DR模式用的和上面的接口一樣,也可以用機器上的其他網卡eth1,用來防止腦裂。
    virtual_router_id 51	#虛擬路由的ID號,是虛擬路由MAC的最後一位地址
    priority 100			#此節點的優先級,主節點的優先級需要比其他節點高
    advert_int 1			#通告的間隔時間
    nopreempt				#設置爲不搶佔 注:這個配置只能設置在backup主機上,而且這個主機優先級要比另外一臺高
    preempt_delay			#搶佔延時,默認5分鐘
    authentication {		#認證配置
		auth_type PASS		#認證方式
        auth_pass 1111		#認證密碼
    }
    virtual_ipaddress {		#虛擬ip地址,可以有多個地址,每個地址佔一行,不需要子網掩碼,同時這個ip 必須與我們在lvs 客戶端設定的vip 相一致!
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
 
virtual_server 192.168.200.100 443 { #集羣所使用的VIP和端口
    delay_loop 6					#健康檢查間隔,單位爲秒
    lb_algo rr						#lvs調度算法rr|wrr|lc|wlc|lblc|sh|dh
    nat_mask 255.255.255.0			#VIP掩碼
    lb_kind NAT						#負載均衡轉發規則。一般包括DR,NAT,TUN 3種
    persistence_timeout 50			#會話保持時間,會話保持,就是把用戶請求轉發給同一個服務器,不然剛在1上提交完帳號密碼,就跳轉到另一臺服務器2上了
    protocol TCP					#轉發協議,有TCP和UDP兩種,一般用TCP,沒用過UDP
    persistence_granularity <NETMASK> #lvs會話保持粒度
 
    real_server 192.168.201.100 443 { #真實服務器,包括IP和端口號
        weight 1					#默認爲1,0爲失效
        inhibit_on_failure			#在服務器健康檢查失效時,將其設爲0,而不是直接從ipvs中刪除
        notify_up <string> | <quoted-string> #在檢測到server up後執行腳本
        notify_down <string> | <quoted-string> #在檢測到server down後執行腳本
 
		TCP_CHECK {					#通過tcpcheck判斷RealServer的健康狀態
            connect_timeout 3		#連接超時時間
            nb_get_retry 3			#重連次數
            delay_before_retry 3	#重連間隔時間
            connect_port 23			健康檢查的端口的端口
            bindto <ip>  
        }
           
        HTTP_GET | SSL_GET {		#健康檢測方式,可選有 SSL_GET、TCP_CHECK、HTTP_GET
            url {					#檢查url,可以指定多個
              path /				#檢查的url路徑
              digest ff20ad2481f97b1754ef3e12ecd3a9cc  #需要檢查到的內容。檢查後的摘要信息。
              status_code 200		#檢查的返回狀態碼
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3		#連接超時時間
            nb_get_retry 3			#檢測嘗試幾次
            delay_before_retry 3	#檢測的時間間隔
        }
    }
}
 
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
 
    sorry_server 192.168.200.200 1358
 
    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
 
    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

本次示例只需做以下關鍵配置修改

在這裏插入圖片描述

# global_defs塊(全局塊中)
route_id XXX #MASTER和BACKUP不同

# vrrp_instance塊中需修改部分
state MASTER			#狀態只有MASTER和BACKUP兩種,並且要大寫,MASTER爲工作狀態,BACKUP是備用狀態
interface ens33			#通信所使用的網絡接口(道人使用的是虛機,橋聯方式)
virtual_router_id 51    #同一個實例下,MASTER和BACKUP相同
priority 100            #優先級,同一個實例下,MASTER高於BACKUP
virtual_ipaddress {		#虛擬ip地址,可以有多個地址,每個地址佔一行,不需要子網掩碼,同時這個ip 必須與我們在lvs 客戶端設定的vip 相一致!
        192.168.32.50
        192.168.32.51
        192.168.32.52
}

vrrp_script check_nginx {       # check_nginx 爲自定義的一個監控名稱
  script "/etc/keepalived/check_nginx.sh"     # 採用腳步呢監控nginx是否正常運行
  interval 2                    # 檢測間隔時間,即兩秒檢測一次
  weight 30                     # 一個正整數或負整數。權重值,關係到整個集羣角色選舉。
}
 
track_script {
  check_nginx                   # 引用上面定義的監控模塊
}

/etc/keepalived/check_nginx.sh 監控腳本內容 (Shell腳本)

A=`ps -C nginx --no-header |wc -l`                 ## 查看是否有 nginx進程 把值賦給變量A 
if [ $A -eq 0 ];then                               ## 如果沒有進程值得爲 零
      /usr/local/nginx/sbin/nginx
      sleep 3
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived                     ## 則結束 keepalived 進程
      fi
fi 

最後啓動nginx與keepalived

./nginx
systemctl start keepalived.service

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章