2011年6月

又见Too many open files错误

应用刚上线了2台新服务器

这两天都报警了几次,上去看了服务器的情况,负载并不高

在日志里,看到了“Too many open files...”的错误

检查ulimit设置的open files数目,已经很大了

使用lsof查看后,发现总数确实已经超出了最大值

java      1529   app *431u     sock                0,5              6003257 can't identify protocol

里面有一堆的这个错误,初步判断是socket连接的问题

突然想起来,以前也曾碰到过这样的问题,是无法连接一台内部服务器的socket

找相关同学开通连接权限后,就没问题了

第二次碰到这样的问题,记录下来,备忘...

用proxy_redirect解决proxy后重定向url问题

今天配置Nginx时,遇到了“/”的问题

前端的Nginx负责把http://mtpc.sohu.com/yum/Server/开头的url反向代理到后端的http://192.168.1.1/Server/上

对于有完整的路径,如http://mtpc.sohu.com/yum/Server/的代理没有问题,Server对应后台服务器的一个目录

但当访问http://mtpc.sohu.com/yum/Server时,后端Nginx会发送一个301到/上,于是返回到前端后URL变成了

http://mtpc.sohu.com/Server/,这个url显然不是我们想要的

 

在Apache中有个ProxyPassReverse的参数,用来调整反向代理服务器发送的http应答头的url,可以解决这个问题

查了Nginx的手册后,终于发现了proxy_redirect这个参数,它实现的功能和ProxyPassReverse类似

增加如下配置:

 

location ^~ /yum

{

            proxy_pass http://192.168.1.1/;

            proxy_redirect http://mtpc.sohu.com/ /yum/;

}

这样,当访问http://mtpc.sohu.com/yum/Server后,就会301到http://mtpc.sohu.com/yum/Server/

使用Nginx+KeepAlived构建高可用的负载均衡系统

利用Nginx和KeepAlived做7层的负载均衡,并能实现HA,是硬件负载均衡F5的一个替代方案

另外,还可以使用LVS+KeepAlived做4层的转发,实现负载均衡

对于简单的7层转发,我们使用Nginx来处理基本也就够用了

Nginx和KeepAlived的安装就不说了,只说明一下大概的环境和配置

环境:

2台Server,分别有2个网卡,eth0连接内网,IP地址为10.x.x.x/31

eth1连接公网,但没有为其分配静态的公网IP,通过KeepAlived动态绑定公网VIP为x.x.x.x

DNS解析域名到VIP上

配置:

vi  /etc/keepalived/keepalived.conf

 

global_defs {

   notification_email {

        xxx@sohu.com

   }

   notification_email_from xxxx@sohu.com

   smtp_server 192.168.x.x

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}


vrrp_script check_nginx {

     script "/opt/scripts/keepalived/check_nginx.sh"

     interval 1

}


vrrp_instance TanChuang_1 {

    state BACKUP

    interface eth0

    virtual_router_id 77

    priority 80

    advert_int 1

    smtp_alert

    authentication {

        auth_type PASS

        auth_pass xxxx

    }

    track_script {

        check_nginx

    }

    virtual_ipaddress {

        x.x.x.x/24 dev eth1

    }

    virtual_routes {

        via x.x.x.x dev eth1 

    }

    notify /opt/scripts/keepalived/send_msg.sh

}

几个说明的地方:

1. state BACKUP只是初始的状态,最后2个Server谁能成为Master是由priority决定的

2. interface eth0是KeepAlived之间发送心跳包的网卡,该设备必须得有固定的IP地址,否则2个Server之间无法通信

由于我们的环境中,eth1是没有固定ip的,所以此处只能设置为eth0,否则会报错:

cant do IP_ADD_MEMBERSHIP errno=No such device

3. virtual_router_id为VRID标识,2个Server必须一致

4. track_script自定义测试服务状态的脚本,默认情况下只有Server宕了或者KeepAlived宕了,才会发生IP漂移

我们自定义一个脚本,检测nginx进程是否存活,如果没有了,则kill掉KeepAlived,使状态强制发生转换

5. virtual_routes设置状态切换时,增加和删除的路由。由于eth1上没有固定公网IP,所以,必须在状态切换时,动态增加到公网的默认路由

6. notify为发生切换时的发报警短信的脚本,可自动向脚本传递3个参数,$1(GROUP—INSTANCE),$2(group或instance名称),$3(MASTER—BACKUP—FAULT)

在我们的配置中,只使用了一个公网ip,用它来作为VIP,同时做DNS解析,对外提供服务

 

Nginx+KeepAlived实现高可用性,实际上可以有以下几种模式:

1. 2台Server做了双机热备,正常情况下,只有一台Server对外提供服务,当其中一台Server有问题时,另外一台自动接管服务。我们上面的配置就是这种模式

2. 2台Server互为主备,配置2个Instance,设置2个VIP,做DNS轮询。正常情况下,2台Server都可以对外提供服务,当其中一台Server有问题时,则另外一台会处理所有的请求。这种模式,在并发量很高时,其中一台挂了,所有请求都转发到另外一台上,很有可能造成另外的Server也崩溃

3. 3台Server,2台对外提供服务,同时分别和第3个Server实现备份,这样,当一台Server出现问题时,还能保证有2台Server对外提供服务,增加了系统的稳定性

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它