额。博客名字有点长。。

前言

最终到这篇文章了,心情是有点激动的。

由于这篇文章会集中曾经博客讲到的全部Nginx功能点。包含主要的负载均衡,还有动静分离技术再加上这篇文章的重点。通过Keepalived实现的HA(High Available)。为什么要实现高可用呢?曾经在搭建的时候仅仅用了一台Nginxserver,这种话假设Nginxserver宕机了,那么整个站点就会挂掉。所以要实现Nginx的高可用,一台挂掉还会有还有一台顶上去。从而保证站点能够持续的提供服务。

关于负载均衡和动静分离在前面博客中都有相关的介绍,这篇博客就不在具体提了,仅仅会在配置文件里体现。不多说了,以下開始搭建。

拓扑环境

以下表格是这次測试须要的拓扑环境,几台server。每台server上安装什么,都有介绍。

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

前置条件

这是一个系列博客,假设有困难能够查看之前的博客。

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

原理图

開始搭建

一、配置VIP

关于VIP(即虚拟IP)的作用,上篇博客《Keepalived原理篇》已经介绍过了。

227和228server须要配置同样的VIP。虚拟IP在某时刻仅仅能属于某一个节点。还有一个节点作为备用节点存在。当主节点不可用时。备用节点接管虚拟IP。成为主节点(即虚拟IP漂移至从节点),提供正常服务。

这个VIP就像个墙头草,两头跑,谁是主他就为谁服务。

配置VIP的博客。上面也有链接哦。

二、安装软件

依照上面的表格,在对应server上安装软件。安装过程不再多说了,有问题能够点击上面的博客链接哦。

三、配置Nginx

227server上的Nginx配置:

  1. user nobody;
  2. worker_processes 2;
  3. events{
  4. worker_connections 1024;
  5. }
  6. http{
  7. #设置默认类型为二进制流
  8. default_type application/octet-stream;
  9. server_names_hash_bucket_size 128;
  10. #指定来自client请求头的headerbuffer大小。设置为32KB
  11. client_header_buffer_size 32k;
  12. #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
  13. large_client_header_buffers 4 32k;
  14. #上传文件大小
  15. client_max_body_size 356m;
  16. #nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
  17. log_format access '$remote_addr - $remote_user [$time_local] "$request" '
  18. '$status $body_bytes_sent "$http_referer" '
  19. '"$http_user_agent" "$http_x_forwarded_for"';
  20. #access日志存在未知
  21. access_log /usr/local/nginx/logs/access.log access;
  22. #开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络堵塞。
  23. sendfile on;
  24. tcp_nopush on;
  25. tcp_nodelay on;
  26. #设置client连接保持活动的超时时间
  27. keepalive_timeout 65;
  28. server_tokens off;
  29. #client请求主体读取缓存
  30. client_body_buffer_size 512k;
  31. proxy_connect_timeout 5;
  32. proxy_send_timeout 60;
  33. proxy_read_timeout 5;
  34. proxy_buffer_size 16k;
  35. proxy_buffers 4 64k;
  36. proxy_busy_buffers_size 128k;
  37. proxy_temp_file_write_size 128k;
  38. #fastcgi_connect_timeout 300;
  39. #fastcgi_send_timeout 300;
  40. #fastcgi_read_timeout 300;
  41. #fastcgi_buffer_timeout 300;
  42. #fastcgi_buffers 4 64k;
  43. #fastcgi_busy_buffers_size 128k;
  44. #fastcgi_temp_file_write_size 128k;
  45. #开启gzip
  46. gzip on;
  47. #同意压缩的最小字节数
  48. gzip_min_length 1k;
  49. #4个单位为16k的内存作为压缩结果流缓存
  50. gzip_buffers 4 16k;
  51. #设置识别HTTP协议版本号,默认是1.1
  52. gzip_http_version 1.1;
  53. #gzip压缩比,可在1~9中设置,1压缩比最小,速度最快。9压缩比最大。速度最慢,消耗CPU
  54. gzip_comp_level 2;
  55. #压缩的类型
  56. gzip_types text/plain application/x-javascript text/css application/xml;
  57. #让前端的缓存server混村经过的gzip压缩的页面
  58. gzip_vary on;
  59. upstream mycluster{
  60. server 192.168.22.229:8080 weight=1;
  61. server 192.168.22.230:8080 weight=1;
  62. }
  63. server{
  64. listen 8088;
  65. server_name 192.168.22.227;
  66. charset utf-8; #设置编码为utf-8
  67. #root html;
  68. #location / {
  69. # root html;
  70. # index index.html index.htm;
  71. #}
  72. #location ~ .*\.(jsp|do|action)$
  73. location / {
  74. proxy_next_upstream http_502 http_504 error timeout invalid_header;
  75. proxy_pass http://mycluster;
  76. # 真实的clientIP
  77. proxy_set_header X-Real-IP $remote_addr;
  78. # 请求头中Host信息
  79. proxy_set_header Host $host;
  80. # 代理路由信息。此处取IP有安全隐患
  81. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  82. # 真实的用户訪问协议
  83. proxy_set_header X-Forwarded-Proto $scheme;
  84. }
  85. #静态文件交给nginx处理
  86. location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
  87. {
  88. root /usr/local/webapps;
  89. expires 30d;
  90. }
  91. #静态文件交给nginx处理
  92. location ~ .*\.(js|css)?
  93. $
  94. {
  95. root /usr/local/webapps;
  96. expires 1h;
  97. }
  98. error_page 500 502 503 504 /50x.html;
  99. location = /50x.html {
  100. root html;
  101. }
  102. }
  103. }

228server上的Nginx配置:

  1. user nobody;
  2. worker_processes 2;
  3. events{
  4. worker_connections 1024;
  5. }
  6. http{
  7. #设置默认类型为二进制流
  8. default_type application/octet-stream;
  9. server_names_hash_bucket_size 128;
  10. #指定来自client请求头的headerbuffer大小,设置为32KB
  11. client_header_buffer_size 32k;
  12. #指定client请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
  13. large_client_header_buffers 4 32k;
  14. #上传文件大小
  15. client_max_body_size 356m;
  16. #nginx的HttpLog模块指定。指定nginx日志的输出格式,输出格式为access
  17. log_format access '$remote_addr - $remote_user [$time_local] "$request" '
  18. '$status $body_bytes_sent "$http_referer" '
  19. '"$http_user_agent" "$http_x_forwarded_for"';
  20. #access日志存在未知
  21. access_log /usr/local/nginx/logs/access.log access;
  22. #开启高效模式文件传输模式。将tcp_nopush和tcp_nodelay两个指另设置为on。用于防止网络堵塞。
  23. sendfile on;
  24. tcp_nopush on;
  25. tcp_nodelay on;
  26. #设置client连接保持活动的超时时间
  27. keepalive_timeout 65;
  28. server_tokens off;
  29. #client请求主体读取缓存
  30. client_body_buffer_size 512k;
  31. proxy_connect_timeout 5;
  32. proxy_send_timeout 60;
  33. proxy_read_timeout 5;
  34. proxy_buffer_size 16k;
  35. proxy_buffers 4 64k;
  36. proxy_busy_buffers_size 128k;
  37. proxy_temp_file_write_size 128k;
  38. #fastcgi_connect_timeout 300;
  39. #fastcgi_send_timeout 300;
  40. #fastcgi_read_timeout 300;
  41. #fastcgi_buffer_timeout 300;
  42. #fastcgi_buffers 4 64k;
  43. #fastcgi_busy_buffers_size 128k;
  44. #fastcgi_temp_file_write_size 128k;
  45. #开启gzip
  46. gzip on;
  47. #同意压缩的最小字节数
  48. gzip_min_length 1k;
  49. #4个单位为16k的内存作为压缩结果流缓存
  50. gzip_buffers 4 16k;
  51. #设置识别HTTP协议版本号。默认是1.1
  52. gzip_http_version 1.1;
  53. #gzip压缩比,可在1~9中设置。1压缩比最小。速度最快。9压缩比最大,速度最慢,消耗CPU
  54. gzip_comp_level 2;
  55. #压缩的类型
  56. gzip_types text/plain application/x-javascript text/css application/xml;
  57. #让前端的缓存server混村经过的gzip压缩的页面
  58. gzip_vary on;
  59. upstream mycluster{
  60. server 192.168.22.229:8080 weight=1;
  61. server 192.168.22.230:8080 weight=1;
  62. }
  63. server{
  64. listen 8088;
  65. server_name 192.168.22.228;
  66. charset utf-8; #设置编码为utf-8
  67. #root html;
  68. #location / {
  69. # root html;
  70. # index index.html index.htm;
  71. #}
  72. #location ~ .*\.(jsp|do|action)$
  73. location / {
  74. proxy_next_upstream http_502 http_504 error timeout invalid_header;
  75. proxy_pass http://mycluster;
  76. # 真实的clientIP
  77. proxy_set_header X-Real-IP $remote_addr;
  78. # 请求头中Host信息
  79. proxy_set_header Host $host;
  80. # 代理路由信息,此处取IP有安全隐患
  81. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  82. # 真实的用户訪问协议
  83. proxy_set_header X-Forwarded-Proto $scheme;
  84. }
  85. #静态文件交给nginx处理
  86. location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
  87. {
  88. root /usr/local/webapps;
  89. expires 30d;
  90. }
  91. #静态文件交给nginx处理
  92. location ~ .*\.(js|css)?
  93. $
  94. {
  95. root /usr/local/webapps;
  96. expires 1h;
  97. }
  98. error_page 500 502 503 504 /50x.html;
  99. location = /50x.html {
  100. root html;
  101. }
  102. }
  103. }

另外还须要在227,228server上新建一个文件夹/usr/local/webapps/drp/img,在img文件夹中存放图片girl.jpg。

假设Nginxserver较多的话。能够使用Rsync做服务端自己主动同步或者使用NFS、MFS分布式共享存储,避免一个个复制文件。

还有。这块Nginx配置是做过一些优化的,比方开启gzip压缩,开启高效文件传输模式。设置缓存,动静分离,负载均衡等,能够直接拿到项目中使用。

四、配置Keepalived

227server上的Keepalived配置:

  1. ! Configuration File for keepalived
  2. #配置邮件相关信息
  3. global_defs {
  4. notification_email {
  5. acassen@firewall.loc
  6. failover@firewall.loc
  7. sysadmin@firewall.loc
  8. }
  9. notification_email_from Alexandre.Cassen@firewall.loc
  10. smtp_server 192.168.200.1
  11. smtp_connect_timeout 30
  12. router_id LVS_DEVEL
  13. }
  14. #配置Nginx健康监測脚本
  15. vrrp_script check_nginx {
  16. script "</dev/tcp/127.0.0.1/8088"
  17. interval 3
  18. weight -2
  19. }
  20. vrrp_instance VI_1 {
  21. state MASTER
  22. #网卡名称
  23. interface eno16777736
  24. virtual_router_id 151
  25. priority 100
  26. advert_int 1
  27. authentication {
  28. auth_type PASS
  29. auth_pass 1111
  30. }
  31. track_script {
  32. check_nginx
  33. }
  34. virtual_ipaddress {
  35. 192.168.22.231
  36. }
  37. }

228server上的Keepalived配置:

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 192.168.200.1
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. }
  13. vrrp_script check_nginx {
  14. #script "/opt/chknginx.sh"
  15. script "</dev/tcp/127.0.0.1/8088"
  16. interval 3
  17. weight -2
  18. }
  19. vrrp_instance VI_1 {
  20. state MASTER
  21. interface eno16777736
  22. virtual_router_id 151
  23. priority 99
  24. advert_int 1
  25. authentication {
  26. auth_type PASS
  27. auth_pass 1111
  28. }
  29. track_script {
  30. check_nginx
  31. }
  32. virtual_ipaddress {
  33. 192.168.22.231
  34. }
  35. }

特别注意,Nginx健康监測脚本。

在本地写一个shell脚本,Keepalived监測不到。不知道为什么,网上的博客都是这么写的。可是在我这里就不行。最后直接在Keepalived配置文件的script标签中写了这段监測的脚本。才得以成功。

  1. vrrp_script chk_http_port {
  2. script "</dev/tcp/192.168.22.227/80"
  3. interval 1
  4. weight -10
  5. }

另外,假设你不明确某些配置的意思。能够查看上篇博客,里面针对每条配置文件都做了具体解析。

五、Tomcat配置

229server,加入默认页

在Tomcat的webapps文件夹下新建文件夹drp,而且创建index.jsp页面

  1. <%@ page language="java" contentType="text/html; charset=GB18030"
  2. pageEncoding="GB18030"%>
  3. <HTML>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=GB18030">
  6. <title>Nginx+Keepalived高可用,负载均衡。动静分离測试</title>
  7. </head>
  8. <body>
  9. <h1>您正在訪问server:192.168.22.229</h1>
  10. <img src="/drp/img/girl.jpg" alt="女孩" />
  11. </body>
  12. </html>

230server同上

六、启动服务并測试

分别启动各个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轮询。敬请期待。。

这就是一个架构不断演变。进化的过程。

【Linux运维-集群技术进阶】Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群的更多相关文章

  1. Nginx + Keepalived实现应用高可用负载均衡功能

    说明:此处仅介绍 Keepalived 实现nginx负载均衡器的高可用,关于nginx介绍和负载均衡实现可查看我的另两篇博文 Nginx负载均衡 和 Nginx配置了解 应用背景:实现高可用,避免单 ...

  2. nginx+keepalived双主高可用负载均衡

    实验环境及软件版本:CentOS版本: 6.6(2.6.32.-504.el6.x86_64)nginx版本: nginx-1.6.3keepalived版本:keepalived-1.2.7 主LB ...

  3. 搭建 Keepalived + Nginx + Tomcat 的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  4. 搭建Keepalived + Nginx + Tomcat的高可用负载均衡架构

    1 概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已无法承载现有的业务量 ...

  5. Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建

    Keepalived + Nginx + Tomcat 的高可用负载均衡架构搭建 Nginx 是一个高性能的 HTTP反向代理服务器 Keepalived 是一个基于VRRP协议来实现的LVS服务高可 ...

  6. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  7. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  8. Keepalived+LVS(dr)高可用负载均衡集群的实现

    一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+lvs双主高可用负载均衡集群及LAMP应用keepalived-1.2 ...

  9. HAProxy+Varnish+LNMP实现高可用负载均衡动静分离集群部署

    HAProxy高可用负载均衡集群部署 基本信息: 系统平台:VMware WorkStation 系统版本: CentOS Linux release 7.2.1511 (Core) 内核版本: 3. ...

随机推荐

  1. java 16进制与字符串直接相互转换

      java 16进制与字符串直接相互转换 CreationTime--2018年7月12日09点39分 Author:Marydon 1.16进制转换成字符串 /** * 16进制直接转换成为字符串 ...

  2. java 八种基本数据类型之初始值、取值范围、对应的封装类

      CreateTime--2017年12月6日10:03:53 Author:Marydon 一.java数据类型之基本数据类型 (二)八种基本数据类型的特征 import java.math.Bi ...

  3. 关于继承中的super()调用父类构造方法

    super super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类. 每当你new一个子类对象的时候,子类对象都隐式内置了一个父类对象.所以说,为了那个内置的父类 ...

  4. Leveldb 使用说明文档

    Leveldb 使用说明文档 原作者:Jeff Dean, Sanjay Ghemawat 翻译:乌合之众solym@sohu.com 英文原文地址https://rawgit.com/google/ ...

  5. EMS_PM_STORAGE

    /*Navicat MySQL Data Transfer Source Server : 10.62.102.118Source Server Version : 50712Source Host ...

  6. docker-compose 管理多个docker容器实例

    Compose 安装 运行此命令下载最新版本的Docker Compose $ curl -L https://github.com/docker/compose/releases/download/ ...

  7. (转载)JWebUnit做Web项目自动化测试

    原址:http://blog.csdn.net/plainfield/archive/2007/07/02/1675546.aspx JwebUnit加构在HttpUnit上,实际上也可以这么说是Ht ...

  8. 最新CoreData封装Demo

    1.创建CoreData文件 2. 3. 4. UploadCoreDataAPI.h // // UploadCoreDataAPI.h // dsafsda // // Created by 冯敏 ...

  9. memcached全面剖析--3.memcached的删除机制和发展方向

    下面是<memcached全面剖析>的第三部分. 发表日:2008/7/16 作者:前坂徹(Toru Maesaka) 原文链接:http://gihyo.jp/dev/feature/0 ...

  10. 通过管理员命令进入D盘

    第一步:Windows键+R打开运行 输入cmd敲回车,打开命令提示符程序.或者点击开始,再点击运行,即可打开命令提示符程序:或者在开始菜单的搜索框中输入CMD:点击运行. 第二步:输入CMD,回车. ...