在介绍完Nginx的反向代理之后,继续介绍Nginx的负载均衡、动静分离以及高可用。
负载均衡
负载均衡就是将负载分摊到不同的服务单元。
准备两个tomcat,8080端口和8081端口。在其webapp目录下分别新建文件夹edu,edu文件夹放入a.html,内容不一致。
nginx.conf中配置如下:autoindex on 表示列出访问目录。
测试:
Nginx 提供了几种分配方式(策略):
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动剔除。
2、weight
weight 代表权,重默认为1,权重越高被分配的客户端越多。指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。例如:
upstream myserver{ server 139.196.16.241 weight=10; server 139.196.16.241 weight=5; }
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。例如:
upstream myserver{ ip_hash; server 139.196.16.241; server 139.196.16.241; }
4、fair
按后端服务器的响应时间来分配请求,响应时间短的服务器优先分配。
upstream myserver{ server 139.196.16.241; server 139.196.16.241; fair; }
动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx 来分开。
第一种,也是最常用的动静分离过程如下图所示:
准备工作:
配置nginx.conf:
测试:
高可用
在之前的负载均衡实例中,只有一个Nginx服务器,如果某台tomcat服务器宕机了,Nginx就不会继续给它分发请求,但是如果Nginx宕机了,整个系统就挂了。
因此,可以用多台Nginx服务器来保证系统稳定运行,这就是高可用!分为主从模式和双主模式。这里只介绍主从模式。
准备工作:
准备两台虚拟机:
ip地址分别为:139.196.16.241、192.168.72.100
两台虚拟机装上nginx
第一台之前用的已经装好
第二台重新装:
两台虚拟机装上keepalived
yum install keepalived –y
rpm -q -a keepalived
在etc目录下:
启动主机和备份机的nginx、keepalived
systemctl start keepalived.service
service keepalived start
修改router_id
主机修改:
/etc/keepalived/keepalivec.conf 配置文件
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 139.196.16.241 smtp_connect_timeout 30 router_id LVS_DEVEL}vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 #(检测脚本执行的间隔) weight 2}vrrp_instance VI_1 { state MASTER # 备份服务器上将 MASTER 改为 BACKUP interface eth0 //网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.72.50 // VRRP H 虚拟地址 } }
备份机修改:
/etc/keepalived/keepalivec.conf 配置文件
global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.72.100 smtp_connect_timeout 30 router_id LVS_DEVELBACK}vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 #(检测脚本执行的间隔) weight 2}vrrp_instance VI_1 { state BACKUP # 备份服务器上将 MASTER 改为 BACKUP interface eth0 //网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.17.50 // VRRP H 虚拟地址 } }
在/usr/local/src 添加检测脚本
#!/bin/bashA=`ps -C nginx –no-header |wc -l`if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fifi
重新启动两台服务器的nginx和keepalived
测试:
ip a
输入http://192.168.72.50/
关闭主机的keepslived和nginx,再次测试依然可以访问,实现了高可用。
最后,介绍一下Nginx的基本原理。
Nginx中有master和多个worker:
worker之间采用争抢机制完成请求任务:
一个 master 和多个 woker 好处:
可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作。
每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断。
worker 数和服务器的 cpu 数相等是最为适宜的。
连接数 worker_connection
发送请求时,占用了 woker 的几个连接数?
当访问静态资源时是2个,访问动态资源或者数据库时是4 个。
nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
普通的静态访问最大并发数是:
worker_connections * worker_processes /2;
HTTP 作为反向代理来说,最大并发数量应该是:
worker_connections * worker_processes/4。
至此,关于Nginx的基本使用介绍完了。