ngnix+keepalivd 实现N主高可用负载均衡web群集

时间:2020-12-29 03:15:53


实验环境:
ngnix+keepalivd 实现N主高可用负载均衡web群集
Server 1
Eth0: 192.168.1.1/24
Server 2
Eth0:192.168.1.2/24
Server 3
Eth0: 192.168.1.10/24
Server 4
Eth0: 192.168.1.11/24

软件:
Nginx 1.22
Keepalived v1.1.19

安装过程:
网上大把。

需要配置的文件:
/etc/keepalived/keepalived.conf
/usr/local/nginx/conf/nginx.conf


设置好一台服务器的配置文件,可以使用scp 命令复制到其他服务器里:
scp /usr/local/nginx/conf/nginx.conf 192.168.1.2:/usr/local/nginx/conf/
scp /etc/keepalived/keepalived.conf 192.168.1.2:/etc/keepalived/
.....

开始配置nginx
Server 1 的/usr/local/nginx/conf/nginx.conf文件如下:
  1. #运行用户
  2.         user  www www;
  3. #启动进程,通常设置成和cpu的数量相等
  4.         worker_processes  1;  
  5. #最好与ulimit -n的值保持一致
  6.         worker_rlimit_nofile 65535;

  7. #全局错误日志及PID文件
  8.         #error_log  logs/error.log;
  9.         #error_log  logs/error.log  notice;
  10.         #error_log  logs/error.log  info;
  11.         #pid        logs/nginx.pid;

  12. #google加速
  13. google_perftools_profiles /tmp/tcmalloc;

  14. #工作模式及连接数上限
  15.   events {
  16.         worker_connections  65535;
  17. #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
  18.         use epoll;
  19.    }

  20. #设定http服务器,利用它的方向代理功能提供负载均衡
  21.   http {
  22. #设定mime类型,类型由mime.type文件定义
  23.         include       mime.types;
  24.         default_type  application/octet-stream;
  25. #隐藏nginx版本
  26. server_tokens off;

  27. # 设定日志格式
  28.         log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  29.                       '$status $body_bytes_sent "$http_referer" '
  30.                      '"$http_user_agent" "$http_x_forwarded_for"';
  31. #使用日志格式
  32.         access_log  logs/access.log  main;

  33. #允许客户端请求的最大单文件字节数
  34.         client_max_body_size 10m;
  35. ##缓冲区代理缓冲用户端请求的最大字节数,
  36.         client_body_buffer_size 128k;

  37. #防止网络阻塞
  38.         #tcp_nopush     on;
  39. #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
  40. #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
  41.         sendfile on;
  42. #连接超时时间
  43.         keepalive_timeout  65;
  44. #允许客户端请求的最大单文件字节数
  45. ##缓冲区代理缓冲用户端请求的最大字节数,
  46. #开启gzip压缩
  47.         gzip  on;
  48. #设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。>建议设置大于1k的字节数,小于1k可能会越压越大。
  49.         gzip_min_length 1k;
  50. #设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
  51.         gzip_buffers 16 64k;
  52. #识别http的协议版本(1.0/1.1)
  53.         gzip_http_version 1.1;
  54. #gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
  55.         gzip_comp_level 6;
  56. #匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
  57.         gzip_types text/plain application/x-javascript text/css application/xml;
  58. #和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
  59.         gzip_vary on;

  60. #指定连接到后端FastCGI的超时时间。
  61. fastcgi_connect_timeout 300;
  62. #向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
  63. fastcgi_send_timeout 300;
  64. #接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。
  65. fastcgi_read_timeout 300;
  66. #定读取FastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。
  67. fastcgi_buffer_size 64k;
  68. #指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答。
  69. fastcgi_buffers 4 64k;
  70. #只知道默认值是fastcgi_buffers的两倍。
  71. fastcgi_busy_buffers_size 128k;
  72. #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。
  73. fastcgi_temp_file_write_size 128k;
  74. #这个指令为Nginx配置FastCGI缓存指定一个路径,目录结构等级,关键字区域存储时间和非活动删除时间。
  75. fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
  76. #指定读取FastCGI应答第一部分需要用多大的缓冲区,一般第一部分应答不会超过1k,由于页面大小为4k,所以这里设置为4k。
  77. fastcgi_cache TEST;
  78. #为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。
  79. #fastcgi_cache_valid 200 302 1h;
  80. #fastcgi_cache_valid 301 1d;
  81. #fastcgi_cache_valid any 1m;


  82. #添加一组真实的服务器地址池mysrv 端口为81
  83.   upstream mysrv {
  84. #后台如果有动态应用的时候,ip_hash指令可以通过hash算法将客户端请求定位到同一台后端服务器上,解决session共享,
  85. # 但建议用动态应用做session共享
  86.         #ip_hash;
  87. #server用于指定一个后端服务器的名称和参数
  88. #weight代表权,重默认为1,权重越高被分配的客户端越多
  89. #max_fails 指定时间内对后端请求失败的次数
  90. #fail_timeout 达到max_fails指定的失败次数后暂停的时间
  91. #down参数用来标记为离线,不参与负载均衡.在ip_hash下使用
  92. #backup仅仅在非backup服务器宕机或繁忙的时候使用
  93.         server  192.168.1.10:81 ;
  94.         server  192.168.1.11:81 ;
  95.         server  192.168.1.2:81 ;
  96. #自己为备用服务器,当其他服务器都故障了才使用本机的web服务
  97.         server  192.168.1.1:81 backup;
  98.           }

  99. server {
  100. #设置80端口负责负载均衡
  101.         listen       80;
  102.         server_name  www.xzr.com;
  103. location / {
  104.         root /var/www/html;
  105. #将根负载调度到后端web服务器的81端口
  106.         proxy_pass http://mysrv;
  107.         proxy_redirect off;
  108. #如果后端的服务器返回502,504,执行超时错误等信息,自动将请求转发到upstream负载均衡池中
  109.         proxy_next_upstream http_404 http_502 http_504 error timeout invalid_header;
  110. # #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
  111.         proxy_set_header Host $host;
  112.         proxy_set_header X-Real-IP $remote_addr;
  113.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  114. #nginx跟后端服务器连接超时时间(代理连接超时)
  115.         proxy_connect_timeout 90;
  116. #后端服务器数据回传时间(代理发送超时)
  117.         proxy_send_timeout 90;
  118. #连接成功后,后端服务器响应时间(代理接收超时)
  119.         proxy_read_timeout 90;
  120. #设置代理服务器(nginx)保存用户头信息的缓冲区大小
  121.         proxy_buffer_size 4k;
  122. #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
  123.         proxy_buffers 4 32k;
  124. ##高负荷下缓冲大小(proxy_buffers*2)
  125.         proxy_busy_buffers_size 64k;
  126. #设定缓存文件夹大小,大于这个值,将从upstream服务器传
  127.         proxy_temp_file_write_size 64k;

  128. }
  129.           error_page   500 502 503 504  /50x.html;
  130.         location = /50x.html {
  131.         root   html;
  132.         }
  133. }
  134. #定义本机81端口提供web服务
  135. server {
  136.         listen       81;
  137.         server_name  www.xzr.com;
  138.         root /var/www/html;
  139.         index  index.php index.html index.htm index.jsp;
  140. ##设定查看Nginx状态的地址
  141.         location /status {
  142.         stub_status on;
  143.         access_log off;
  144.         auth_basic  "NginxStatus";
  145. #认证登录使用htpasswd命令 -c 指定文件 用户
  146. #0.6.7版本以后这里指定的文件是nginx.conf所在目录的相对路径,而不是--prefix指定的路径。
  147.         auth_basic_user_file htpasswd;
  148.         }
  149. #静态文件直接读取
  150.         location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
  151.         expires 1d;
  152.         }
  153. #所有php后缀的,都通过fastcgi发送到9000端口上
  154.   location ~ \.php$ {
  155.         fastcgi_pass   127.0.0.1:9000;
  156.         fastcgi_index  index.php;
  157.         include        fastcgi.conf;
  158.           }
  159. }
  160. }
复制代码
Server 2的/usr/local/nginx/conf/nginx.conf需要修改的地方
  1. #去掉服务器1的backup,设置自己为backup        
  2. server  192.168.1.2:81 backup;
复制代码
Server 3的/usr/local/nginx/conf/nginx.conf需要修改的地方
  1. #去掉服务器1的backup,设置自己为backup        
  2. server  192.168.1.10:81 backup;
复制代码
Server 4的/usr/local/nginx/conf/nginx.conf需要修改的地方
  1. #去掉服务器1的backup,设置自己为backup        
  2. server  192.168.1.11:81 backup;
复制代码
开始配置:keepalived
Server 1的/etc/keepalived/keepalived.conf文件如下:
  1. ! Configuration File for keepalived
  2. global_defs {
  3.      notification_email { #发生事件切换的时候,发送的邮箱,可以有多个,每行一个
  4.      xzrgg@21cn.com
  5.      }
  6.      notification_email_from xzrgg@21cn.com         #指定发件人
  7.      smtp_server 127.0.0.1         #指定smtp服务器地址
  8.      smtp_connect_timeout 30         #指定smtp连接超时时间
  9.      router_id nginx_1        #运行keepalived机器的一个标识主备不能相同
  10.      }

  11. #vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更
  12. vrrp_script check_nginx {
  13. #定义监控nginx的命令,命令的$?返回1就改变优先级。
  14.         script "ps -C nginx --no-header"
  15.         interval 5     #脚本执行间隔
  16.         weight -10   #脚本结果1导致的优先级变更:10表示优先级+10;-10则表示优先级-10
  17.         fall   2     # 检测几次返回1为失败
  18.         rise   1     # 检测几次返回0成功为ok
  19.         }

  20. #VIP
  21. vrrp_instance VI_1 {        #监控多个网段的实例
  22.      state BACKUP     #全部服务器都设为BACKUP,让优先级高的自动为master
  23. #    dont track primary     #忽略VRRP的interface错误
  24.      track_interface {
  25.      eth0                 #跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态
  26.      #eth1
  27.      }
  28.      interface eth0         #实例绑定的网卡
  29.      virtual_router_id 51   #这里非常重要,相同的VRID为一个组
  30.      priority 100           #优先级,
  31.      advert_int 1           #检查间隔,默认1s
  32. #     nopreempt            #设置抢占,优先级高就做master
  33.      authentication {       #认证
  34.      auth_type PASS         #认证的方式,支持PASS和AH
  35.      auth_pass 123         #认证的密码
  36.      }
  37.      virtual_ipaddress {     #指定漂移地址(VIP)
  38.      192.168.1.100         #如果有多个VIP,继续换行填写
  39.      }
  40.         track_script {     #执行定义的命令
  41.         check_nginx
  42.         }
  43. }
复制代码
Server 2的/etc/keepalived/keepalived.conf 需要修改的地方
  1. router_id nginx_2     #运行keepalived机器的一个标识主备不能相同
  2. priority 99           #优先级
复制代码
Server 3的/etc/keepalived/keepalived.conf 需要修改的地方
  1. router_id nginx_3     #运行keepalived机器的一个标识主备不能相同
  2. priority 98           #优先级
复制代码
Server 4的/etc/keepalived/keepalived.conf 需要修改的地方
  1. router_id nginx_4     #运行keepalived机器的一个标识主备不能相同
  2. priority 97           #优先级
复制代码
启动nginx和keepalived服务:
  1. nginx
  2. service keepalived start
复制代码

补充内容 (2012-9-4 12:51):
思路:
总结一下最近学习的nginx+keepalived 的负载均衡架构,发现网上大多的群集系统都是负载均衡层加服务器群组层,实现负载均衡高可用的话就需要

补充内容 (2012-9-4 12:51):
一主一备,备的那台机就空闲了,为了合理使用资源,网上也有实现双主的配置,不过需要多申请一个ip。
Nginx 做负载均衡的新方法,配合keepalived就可