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

在这里插入图片描述

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