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

来源:互联网 发布:篡改监测数据案例 编辑:程序博客网 时间:2024/05/17 06:28


实验环境:

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就可
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lol登游戏闪退怎么办 lol读取界面很慢怎么办 玩lol卡死黑屏怎么办 lol黑屏退不出来怎么办 电脑分辨率调高了黑屏怎么办 电脑设置分辨率黑屏了怎么办 分辨率调高了黑屏怎么办 电脑调分辨率黑屏了怎么办 科沃斯cr120遥控器丢了怎么办 买了kl色的钻戒怎么办 qq旋风没有蓝钻怎么办 手机桌面短信图标不见了怎么办 手机桌面qq音乐图标不见了怎么办 电脑显示器图标变大了怎么办 手机卡信号好但是网络不好怎么办 陌陌功能被限制怎么办 陌陌设备封了怎么办 荣耀v8手机开机键不灵怎么办 联通积分换的腾讯会员怎么办 小米6手机变卡了怎么办 微信绑定银行卡次数太多怎么办 银行卡绑定太多微信了怎么办 怎样给qq设密码怎么办 吃了心悦胶囊上火怎么办 qq暂时被冻结了怎么办 部落群审核未通过怎么办 qq被限制解封该怎么办 微信提现成功但没到账怎么办 拍拍贷登录不上怎么办 京东店铺出租保证金怎么办 所选地区无货怎么办 闲鱼七天没发货怎么办 续贷密码忘了怎么办 微店商家不发货怎么办 微店商家不退钱怎么办 维修车辆被拍违章停车怎么办 网贷申请平台太多怎么办 所在城市没有网店怎么办信用卡 拍拍贷不放款了怎么办 拍拍贷账号注销了怎么办 我在拍拍贷注销了怎么办