Nginx+Keepalived双主轮询负载均衡

...

在和局地有相恋的人沟通Nginx+Keepalived技巧时,作者纵然已成功数次实Nginx+Keepaived项目方案,但那么些都以用的单主Nginx在职业,从Nginx长期只是处在备份状态,所以大家想将二台Nginx负载均衡器都地处专业情景,其实用Nginx+Keepalived也很轻易完毕。此方法适用场景:适合中型Mini型网址采取场景。
诚如为了维护方便,集团网址的服务器都在本人的中间机房里,只开花了Keepalived的VIP地址的七个端口80、443,通过Juniper SSG550防火墙映射出去,外网DNS对应映射后的公网IP。此架构的防火墙及网络安全认证如下:
此系统框架结构仅映射内网VIP的80及443端口于外网的Juniper SSG550防火墙下,别的端口均关门,内网全数机器均关门iptables防火墙;外网DNS指向即通过Juniper SSG550映射出来的外网地址。
Nginx负载均衡作服务器境遇的故障一般有:1.服务器网线松动等互连网故障;2.服务器硬件故障爆发损坏现象而crash;3.Nginx服务进度死掉(这种境况理论上会境遇,但实在生产条件下的Linux服务器并未有出现过这种状态,足以表达了Nginx作为负载均衡器/反向代理服务器的安宁,大家得以经过手艺手段来消除这一标题)。
测量检验实验情况:
主Nginx之一:192.168.1.5
主Nginx之二:192.168.1.6
Web服务器一:192.168.1.17
Web服务器二:192.168.1.18
VIP地址一:192.168.1.8
VIP地址二:192.168.1.9
一、Nginx和Keepalived的安装比较轻易,笔者这里就不重复了,大家能够参照他事他说加以考察小编的专项论题种类的稿子,如下地址
    user www www;
    worker_processes 8;
    pid /usr/local/nginx/logs/nginx.pid;
    worker_rlimit_nofile 51200;
    events
    {
    use epoll;
    worker_connections 51200;
    }
    http{
    include       mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;
    sendfile on;
    tcp_nopush     on;
    keepalive_timeout 60;
    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    
    upstream backend
    {
    ip_hash;
server 192.168.1.17:80;
    server 192.168.1.18:80;
    }
    server {
    listen 80;
    server_name www.1paituan.com;
    location / {
    root /var/www/html ;
    index index.php index.htm index.html;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass ;
    }
    
    location /nginx {
    access_log off;
    auth_basic "NginxStatus";
    #auth_basic_user_file /usr/local/nginx/htpasswd;
    }
    
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    access_log /data/logs/access.log access;
    }
 
二、配置Keepalived文件,作者那边大约说下原理,其实也等于透过Keepalived生成贰个实例,二台Nginx互为备份,即首先台是第二台机器的备机,而第二台机器也是首先台的备机,而转变的二个VIP地址分别对应大家网址
主Nginx机器之一的Keepalived.conf配置文件如下:
! Configuration File for keepalived
global_defs {
   notification_email {
   [email protected]
        }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan.com
    }
    virtual_ipaddress {
        192.168.1.8
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan.com
    }
    virtual_ipaddress {
        192.168.1.9
    }
}
 
主Nginx之二的keepalivd.conf配置文件如下:
! Configuration File for keepalived
global_defs {
   notification_email {
   [email protected]
        }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan
    }
    virtual_ipaddress {
        192.168.1.8                  
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan
    }
    virtual_ipaddress {
        192.168.1.9                  
    }
}
 
二台机器的监督Nginx的进程脚本,脚本内容如下:
#!/bin/bash
while  :
do
 nginxpid=`ps -C nginx --no-header | wc -l`
 if [ $nginxpid -eq 0 ];then
  /usr/local/nginx/sbin/nginx
  sleep 5
  nginxpid=`ps -C nginx --no-header | wc -l`
  echo $nginxpid
    if [ $nginxpid -eq 0 ];then
 /etc/init.d/keepalived stop
   fi
 fi
 sleep 5
done
 
我们分别在二台主Nginx上实施,命令如下所示:
nohup sh /root/nginxpid.sh & 
 
此脚本本人是直接从生产服务器上下载的,大家不要疑神疑鬼它会挑起死循环和有效的难题,作者稍为解释一下,那是叁个特别循环的台本,放在主Nginx机器上(因为近日任重(Ren Zhong)而道远是由它提供服务),每隔5秒推行三遍,用ps -C 命令来搜聚nginx的PID值到底是还是不是为0,假设是0的话(即Nginx进度死掉了),尝试运维nginx进度;倘若持续为0,即nginx运营失改, 则关闭本机的Keeplaived进度,VIP地址则会由备机接管,当然了,整个网址就能够由备机的Nginx来提供服务了,这样保险Nginx进程的高可用。
四、寻常运维二台主Nginx的Nginx和Keealived程序后,二台机器的平常IP彰显相应如下所示:
那台是IP为192.168.1.5的机器的ip addr命令展现结果:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:99:fb:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0
  inet 192.168.1.8/32 scope global eth0
 
这台是IP为192.168.1.6的机器的ip addr命令展现结果:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:7d:58:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.6/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.9/32 scope global eth0
inet6 fe80::20c:29ff:fe7d:585e/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop
  link/sit 0.0.0.0 brd 0.0.0.0
 
五、测验进程如下:
一、大家要分头在二台主Nginx上用killall杀掉Nginx进度,然后在顾客端独家访谈192.168.1.8和192.168.1.9那贰个IP(模拟DNS轮询)看好不佳符合规律访谈Web服务器。
二、尝试重启192.168.1.5的主Nginx负载均衡器,测量试验进度如上;
三、尝试重启192.168.1.6的主Nginx负载均衡器,测验进程如下;
四、尝试分别关闭192.168.1.5和192.168.1.6的机器,测量试验进程如上,看影响网站的不奇怪化访谈不?
六、近些日子投产要缓和的难点:
一、Cacti和Nagios等监控服务要重新陈设,因为未来客商机是分别访谈二台载荷均衡器;
二、日志搜集要重新铺排,以往做客日志是布满在二台负载均衡器上;
三、要考虑google收录的难点;
四、证书的标题,二台机械都亟待;
五、别的难题暂风尚未想到,待补充。
作者“抚琴煮酒”

   notification_email {

图片 1

图片 2

    virtual_ipaddress {

小编 “抚琴煮酒”

...

Extra Lib                : -lssl -lcrypto -lcrypt

在和局地爱人沟通Nginx+Keepalived本领时,作者就算已成功数十四回实Nginx+Keepaived项目方案,但这么些都是用的单主Nginx在干活,从Nginx长时间只是处在备份状态,所以我们想将二台Nginx负载均衡器都地处专门的工作状态,其实用Nginx+Keepalived也很轻便达成。此格局适用场景:适合中型Mini型网址使用场景。
一般为了保险方便,公司网址的服务器都在团结的内部机房里,只怒放了Keepalived的VIP地址的八个端口80、443,通过Juniper SSG550防火墙映射出去,外网DNS对应映射后的公网IP。此架构的防火墙及网络安全注明如下:
此系统架构仅映射内网VIP的80及443端口于外网的Juniper SSG550防火墙下,其余端口均关门,内网全部机器均关门iptables防火墙;外网DNS指向即透过Juniper SSG550映射出来的外网地址。
Nginx负载均衡作服务器遇到的故障一般有:1.服务器网线松动等互联网故障;2.服务器硬件故障发生损坏现象而crash;3.Nginx服务进程死掉(这种情状理论上会境遇,但其实生产条件下的Linux服务器并未有出现过这种境况,足以验证了Nginx作为负载均衡器/反向代理服务器的平静,我们得以由此技巧花招来减轻这一主题材料)。
测验实验景况:
主Nginx之一:192.168.1.5
主Nginx之二:192.168.1.6
Web服务器一:192.168.1.17
Web服务器二:192.168.1.18
VIP地址一:192.168.1.8
VIP地址二:192.168.1.9
一、Nginx和Keepalived的设置比较简单,小编那边就不另行了,我这里附上Nginx.conf配置文件,如下所示:
  user www www;
    worker_processes 8;
    pid /usr/local/nginx/logs/nginx.pid;
    worker_rlimit_nofile 51200;
    events
    {
    use epoll;
    worker_connections 51200;
    }
    http{
    include       mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;
    sendfile on;
    tcp_nopush     on;
    keepalive_timeout 60;
    tcp_nodelay on;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    
    upstream backend
    {
    ip_hash;
    server 192.168.1.17:80;
    server 192.168.1.18:80;
    }
    server {
    listen 80;
    server_name www.1paituan.com;
    location / {
    root /var/www/html ;
    index index.php index.htm index.html;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass ;
    }
    
    location /nginx {
    access_log off;
    auth_basic "NginxStatus";
    #auth_basic_user_file /usr/local/nginx/htpasswd;
    }
    
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';
    access_log /data/logs/access.log access;
    }
二、配置Keepalived文件,小编这里大致说下原理,其实也正是因而Keepalived生成一个实例,二台Nginx互为备份,即首先台是第二台机器的备机,而第二台机械也是首先台的备机,而改动的一个VIP地址分别对应咱们网址
主Nginx机器之一的Keepalived.conf配置文件如下:
 
! Configuration File for keepalived
global_defs {
   notification_email {
   [email protected]
        }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan.com
    }
    virtual_ipaddress {
        192.168.1.8
    }
}
vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan.com
    }
    virtual_ipaddress {
        192.168.1.9
    }
}
主Nginx之二的keepalivd.conf配置文件如下:
 
! Configuration File for keepalived
global_defs {
   notification_email {
   [email protected]
        }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan
    }
    virtual_ipaddress {
        192.168.1.8                  
    }
}
vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1paituan
    }
    virtual_ipaddress {
        192.168.1.9                  
    }
}
咱俩独家在二台主Nginx上试行,命令如下所示:
 
nohup sh /root/nginxpid.sh & 
此脚本本身是直接从生育服务器上下载的,大家不要疑神疑鬼它会唤起死循环和有效的主题素材,我稍为解释一下,那是一个极端循环的本子,放在主Nginx机器上(因为眼前最主借使由它提供劳务),每隔5秒实施二次,用ps -C 命令来搜集nginx的PID值到底是否为0,假若是0的话(即Nginx进度死掉了),尝试运行nginx进度;要是后续为0,即nginx运行失改, 则关闭本机的Keeplaived进度,VIP地址则会由备机接管,当然了,整个网址就能够由备机的Nginx来提供劳务了,那样保障Nginx进度的高可用。
四、平常运转二台主Nginx的Nginx和Keealived程序后,二台机器的例行IP展现相应如下所示:
这台是IP为192.168.1.5的机械的ip addr命令呈现结果:
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:99:fb:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0
  inet 192.168.1.8/32 scope global eth0
那台是IP为192.168.1.6的机器的ip addr命令显示结果:
 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:7d:58:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.6/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.9/32 scope global eth0
inet6 fe80::20c:29ff:fe7d:585e/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc noop
  link/sit 0.0.0.0 brd 0.0.0.0
五、测量试验进度如下:
一、大家要分别在二台主Nginx上用killall杀掉Nginx进度,然后在顾客端独家拜见192.168.1.8和192.168.1.9那叁个IP(模拟DNS轮询)看能还是无法健康访谈Web服务器。
二、尝试重启192.168.1.5的主Nginx负载均衡器,测试进程如上;
三、尝试重启192.168.1.6的主Nginx负载均衡器,测验进程如下;
四、尝试分别关闭192.168.1.5和192.168.1.6的机械,测验进度如上,看影响网址的寻常化访谈不?
六、这段时间投产要缓慢解决的难点:
一、Cacti和Nagios等监察和控制服务要重新布署,因为今后顾客机是分别访问二台载荷均衡器;
二、日志搜聚要重新安排,今后做客日志是分布在二台负载均衡器上;
三、要牵记google收音和录音的难点;
四、证书的标题,二台机器都亟待;
五、另外难题暂风尚未想到,待补充。

 

 

    10.10.10.21/24 broadcast 10.10.10.255 dev eth1 label eth1:1

    link/ether 00:50:56:22:04:b1 brd ff:ff:ff:ff:ff:ff

       chk_http_port            #(调用检验脚本)

if [ $A -eq 0 ];then                            

   }

    advert_int 1

cd /lib

    inet6 ::1/128 scope host

 

        server_name  10.10.10.21;  #Nginx2改为10.10.10.22

   smtp_server 127.0.0.1

    priority 100

        proxy_store on;

本子加上可进行权限

    fastcgi_buffer_size 64k;

 

   smtp_connect_timeout 30

        location /nginx_status {

            auth_basic "NginxStatus";

make && make install

IPVS use libnl           : No

}

 

两台Nginx,两台Web,前端DNS由运行商提供。

    }

 

    upstream backend

wget

    sendfile        on;

        auth_pass 1111

           proxy_pass  ;

tar -zxvf zlib-1.2.8.tar.gz

 

track_script {

3: pan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN

[root@hd2 keepalived-1.2.15]# ip addr

            proxy_set_header X-Real-IP $remote_addr;

Compiler flags           : -g -O2

            #后端的Web服务器能够由此X-Forwarded-For获取客户实际IP

interval 2                           #(检测脚本试行的间距)

user  nobody;

安装Nginx:

    }

}

[root@hd1 lib]# ls

wget

    interface eth1

    advert_int 1

service keepalived start

    authentication {

 

        }

}

[root@hd1 sbin]# ./nginx

    virtual_ipaddress {

cd nginx-1.6.3/

测验web主节点服务down掉之后,备用节点服务是还是不是能符合规律运营,kill -9 xxxxx,web如故能够采访

    virtual_ipaddress {

            root   html;

    access_log  logs/access.log  main;

    virtual_ipaddress {

设置GCC编写翻译器等工具:

    server_tokens off;

 

}

}

 

vrrp_script chk_http_port {

./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

    chk_http_port            #(调用检验脚本)

    10.10.10.22/24 broadcast 10.10.10.255 dev eth1 label eth1:2

    interface eth1

[root@hd2 keepalived-1.2.15]#

Nginx2:10.10.10.12

        }

Nginx.conf配置文件,贰个nginx负载均衡器的文本一律

    inet 127.0.0.1/8 scope host lo

}

   smtp_connect_timeout 30

#!/bin/bash

track_script {

双主情势接纳四个VIP,前段有2台服务器,互为核心,两台服务器同偶尔间工作,不设有财富浪费意况。同偶尔间在前端的DNS服务器对网址做多条A记录,完成了Nginx的载重均衡,当一台服务器故障时候,财富会退换到另一台服务器,继续提供服务,在大型的网址中山大学部都利用此种框架结构。在此采纳主主格局配置Nginx+keepalived的高可用性。

 

http {

    worker_connections  51200;

vrrp_instance VI_1 {

       valid_lft forever preferred_lft forever

    inet6 fe80::250:56ff:fe22:4b1/64 scope link

 

Use VRRP Framework       : Yes

   router_id NGINX_VIP1

            root   html;

}

    {

IPVS sync daemon support : Yes

script "/usr/local/src/check_nginx_pid.sh"

            proxy_pass ;

 

 

      /usr/local/nginx/sbin/nginx       

    10.10.10.22/24 broadcast 10.10.10.255 dev eth1 label eth1:2

Stopping keepalived: [  OK  ]

    advert_int 1

   notification_email {