拓扑环境javascript
如下表格是此次測试需要的拓扑环境,几台server。每台server上安装什么,都有介绍。css
server名称 | 系统版本号 | 预装软件 | IP地址/VIP |
---|---|---|---|
Nginx主server | CentOS 7 最小安装 | Nginx +Keepalived | 192.168.22.227/192.168.22.231 |
Nginx从server | CentOS 7 最小安装 | Nginx +Keepalived | 192.168.22.228/192.168.22.231 |
WebserverA | CentOS 7 最小安装 | tomcat+jdk | 192.168.22.229 |
WebserverB | CentOS 7 最小安装 | tomcat+jdk | 192.168.22.230 |
前置条件html
这是一个系列博客,假设有困难可以查看以前的博客。
server配置VIP:http://blog.csdn.net/u010028869/article/details/50574907
Keepalived安装见:http://blog.csdn.net/u010028869/article/details/50527817
Keepalived原理解析:http://blog.csdn.net/u010028869/article/details/50596805
Nginx动静分离、负载均衡:http://blog.csdn.net/u010028869/article/details/50522033前端
原理图java
開始搭建node
1、配置VIPnginx
关于VIP(即虚拟IP)的做用,上篇博客《Keepalived原理篇》已经介绍过了。web
227和228server需要配置一样的VIP。虚拟IP在某时刻仅仅能属于某一个节点。还有一个节点做为备用节点存在。当主节点不可用时。备用节点接管虚拟IP。成为主节点(即虚拟IP漂移至从节点),提供正常服务。shell
这个VIP就像个墙头草,两头跑,谁是主他就为谁服务。浏览器
配置VIP的博客。上面也有连接哦。
2、安装软件
依照上面的表格,在对应server上安装软件。安装过程再也不多说了,有问题可以点击上面的博客连接哦。
3、配置Nginx
server上的Nginx配置:
1 user nobody; 2 3 worker_processes 2; 4 5 events{ 6 worker_connections 1024; 7 } 8 9 http{ 10 #设置默认类型为二进制流 11 default_type application/octet-stream; 12 13 server_names_hash_bucket_size 128; 14 #指定来自client请求头的headerbuffer大小,设置为32KB 15 client_header_buffer_size 32k; 16 #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB 17 large_client_header_buffers 4 32k; 18 #上传文件大小 19 client_max_body_size 356m; 20 #nginx的HttpLog模块指定。指定nginx日志的输出格式,输出格式为access 21 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' 22 '$status $body_bytes_sent "$http_referer" ' 23 '"$http_user_agent" "$http_x_forwarded_for"'; 24 #access日志存在未知 25 access_log /usr/local/nginx/logs/access.log access; 26 #开启高效模式文件传输模式。将tcp_nopush和tcp_nodelay两个指另设置为on。用于防止网络堵塞。 27 sendfile on; 28 tcp_nopush on; 29 tcp_nodelay on; 30 #设置client链接保持活动的超时时间 31 keepalive_timeout 65; 32 server_tokens off; 33 #client请求主体读取缓存 34 client_body_buffer_size 512k; 35 proxy_connect_timeout 5; 36 proxy_send_timeout 60; 37 proxy_read_timeout 5; 38 proxy_buffer_size 16k; 39 proxy_buffers 4 64k; 40 proxy_busy_buffers_size 128k; 41 proxy_temp_file_write_size 128k; 42 43 #fastcgi_connect_timeout 300; 44 #fastcgi_send_timeout 300; 45 #fastcgi_read_timeout 300; 46 #fastcgi_buffer_timeout 300; 47 #fastcgi_buffers 4 64k; 48 #fastcgi_busy_buffers_size 128k; 49 #fastcgi_temp_file_write_size 128k; 50 51 #开启gzip 52 gzip on; 53 #赞成压缩的最小字节数 54 gzip_min_length 1k; 55 #4个单位为16k的内存做为压缩结果流缓存 56 gzip_buffers 4 16k; 57 #设置识别HTTP协议版本号。默认是1.1 58 gzip_http_version 1.1; 59 #gzip压缩比,可在1~9中设置。1压缩比最小。速度最快。9压缩比最大,速度最慢,消耗CPU 60 gzip_comp_level 2; 61 #压缩的类型 62 gzip_types text/plain application/x-javascript text/css application/xml; 63 #让前端的缓存server混村通过的gzip压缩的页面 64 gzip_vary on; 65 66 upstream mycluster{ 67 server 192.168.22.229:8080 weight=1; 68 server 192.168.22.230:8080 weight=1; 69 } 70 71 server{ 72 listen 8088; 73 server_name 192.168.22.228; 74 charset utf-8; #设置编码为utf-8 75 #root html; 76 77 #location / { 78 # root html; 79 # index index.html index.htm; 80 #} 81 82 #location ~ .*\.(jsp|do|action)$ 83 location / { 84 proxy_next_upstream http_502 http_504 error timeout invalid_header; 85 proxy_pass http://mycluster; 86 # 真实的clientIP 87 proxy_set_header X-Real-IP $remote_addr; 88 # 请求头中Host信息 89 proxy_set_header Host $host; 90 # 代理路由信息,此处取IP有安全隐患 91 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 92 # 真实的用户訪问协议 93 proxy_set_header X-Forwarded-Proto $scheme; 94 } 95 #静态文件交给nginx处理 96 location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ 97 { 98 root /usr/local/webapps; 99 expires 30d; 100 } 101 #静态文件交给nginx处理 102 location ~ .*\.(js|css)? 103 104 105 106 107 108 109 $ { root /usr/local/webapps; expires 1h; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
另外还需要在227,228server上新建一个文件夹/usr/local/webapps/drp/img,在img文件夹中存放图片girl.jpg。
假设Nginxserver较多的话。可以使用Rsync作服务端本身主动同步或者使用NFS、MFS分布式共享存储,避免一个个复制文件。
还有。这块Nginx配置是作过一些优化的,比方开启gzip压缩,开启高效文件传输模式。设置缓存,动静分离,负载均衡等,可以直接拿到项目中使用。
4、配置Keepalived
server上的Keepalived配置:
! Configuration File for keepalived #配置邮件相关信息 global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } #配置Nginx健康监測脚本 vrrp_script check_nginx { script "</dev/tcp/127.0.0.1/8088" interval 3 weight -2 } vrrp_instance VI_1 { state MASTER #网卡名称 interface eno16777736 virtual_router_id 151 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx } virtual_ipaddress { 192.168.22.231 } }
228server上的Keepalived配置:
! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_script check_nginx { #script "/opt/chknginx.sh" script "</dev/tcp/127.0.0.1/8088" interval 3 weight -2 } vrrp_instance VI_1 { state MASTER interface eno16777736 virtual_router_id 151 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx } virtual_ipaddress { 192.168.22.231 } }
特别注意,Nginx健康监測脚本。
在本地写一个shell脚本,Keepalived监測不到。不知道为何,网上的博客都是这么写的。但是在我这里就不行。最后直接在Keepalived配置文件的script标签中写了这段监測的脚本。才得以成功。
vrrp_script chk_http_port { script "</dev/tcp/192.168.22.227/80" interval 1 weight -10 }
另外,假设你不明确某些配置的意思。可以查看上篇博客,里面针对每条配置文件都作了具体解析。
5、Tomcat配置
server,加入默认页
在Tomcat的webapps文件夹下新建文件夹drp,并且建立index.jsp页面
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <HTML> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Nginx+Keepalived高可用,负载均衡。动静分离測试</title> </head> <body> <h1>您正在訪问server:192.168.22.229</h1> <img src="/drp/img/girl.jpg" alt="女孩" /> </body> </html>
230server同上
6、启动服务并測试
分别启动各个server上的Nginx、Keepalived、Tomcat,并測试是否能正常訪问。
①启动測试Tomcat
可以看到229和230server上的Tomcat已经可以正常訪问。图片没有载入出来,是因为图片没有在Tomcatserver上存储,而放在了Nginx上。
②启动測试Nginx
可以看到227和228上的Nginx启动成功。并且实现了负载均衡和动静分离的效果,图片被成功的载入了出来。
③ 保证所有服务都可正常訪问后,启动Keepalived測试。
启动227。228server上的Keepalived。在浏览器中输入地址:http://192.168.22.231:8088/drp/index.jsp
192.168.22.231是我们设置的虚拟ip,在訪问站点的时候不在经过Nginx的ip了。而要经过这个vip进行訪问。
Keepalived启动后我们可以经过查看/var/log 下的messages文件(日志文件),查看主从状态。
查看227server/var/log/messages:
可以看到227为Masterserver。那么我们现在经过192.168.22.231訪问的就是227上的Nginx。
Nginx高可用測试
现在我们经过两个方面来測试高可用:
① server层的双机热备。模拟方式为关闭server。或者关闭Keepalived。
a. 关闭227Keepalived进程
现在提供服务的是227server,使用命令service keepalived stop将227上的Keepalived进程关闭掉以后。
查看227servermessas日志:
将192.168.22.231这个虚拟ip移除,关闭Keepalived。
查看228servermessages日志:
228原来为从server。当227server宕机后,228server由从server升级为主server,并且绑定上192.168.22.231这个虚拟IP,以继续提供服务。站点可以继续訪问。
b. 启动227Keepalived
查看227servermessas日志:
Keepalived成功启动后。227server继续接管192.168.22.231,成为MASTERserver,继续提供服务。
查看228servermessages日志:
对应的228server。转变为BACKUPserver,并且移除VIP。
② 应用层的双机热备。模拟方式为Kill掉Nginx进程
a. 关闭227Nginx
查看227servermessages日志:
VRRP_Script(check_nginx) failed ,意思是健康监測脚本运行失败,代表Nginx服务坏掉,或者没有启动。而后Keepalived会使227server转变为BACKUP状态,移除VIP。
查看228servermessages日志:
固然不出所料,228server已经变为MASTER状态。从而继续提供服务。
b. 又一次启动227Nginx
查看227servermessages日志:
VRRP_Script(check_nginx) succeeded 。意思是健康监測脚本运行成功。Nginx正常运行。
而后227server就会转变为MASTER状态。并提供服务。
查看228servermessages日志:
228server已经变为BUCKUP状态。
小结
至此,高可用的一系列測试就已经完毕了。在整个測试过程当中,不论是关闭某台server的Nginx。Keepalived仍是整个server宕机。站点一直没有中断提供服务,这已经达到了主要的高可用;但是还有个缺陷就是假设Nginx主server不出问题的话,那么备用server将长期处于备份状态。这种巨大资源浪费是不能容忍的。
固然这也有对应的方案来解决:Nginx双主集群+DNS轮询。敬请期待。。
。
这就是一个架构不断演变。进化的过程。