一    环境准备

服务器说明

外网IPNAT

内网IPNAT

主机名称规划

A1-nginx负载服务器01

10.0.0.5/24

172.16.1.5/24

lb01

A2-nginx负载服务器02

10.0.0.6/24

172.16.1.6/24

lb02

安装反向代理,负载均衡就是安装nginx,安装nginx和之前安装web一样的。


nginx反向代理负载均衡安装(和安装nginx web服务器一样的)
1 安装依赖软件包命令集合
yum install openssl openssl-devel pcre pcre-devel -y
rpm -qa openssl openssl-devel pcre pcre-devel
2 安装nginx软件包命令集合
mkdir -p /home/oldboy/tools
cd /home/oldboy/tools
wget -q http://nginx.org/download/nginx-1.6.3.tar.gz
ls -l nginx-1.6.3.tar.gz
useradd nginx -s /sbin/nologin -M
tar xf nginx-1.6.3.tar.gz
cd nginx-1.6.3
./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3 --with-http_stub_status_module --with-http_ssl_module
make
make install
ln -s /application/nginx-1.6.3 /application/nginx

3.配置
[root@lb01 nginx-1.6.3]# ll /application/nginx/
总用量 16
drwxr-xr-x 2 root root 4096 8月  30 22:39 conf
drwxr-xr-x 2 root root 4096 8月  30 22:39 html
drwxr-xr-x 2 root root 4096 8月  30 22:39 logs
drwxr-xr-x 2 root root 4096 8月  30 22:39 sbin
[root@lb01 nginx-1.6.3]# cd /application/nginx/conf/
[root@lb01 conf]# ll
总用量 60
-rw-r--r-- 1 root root 1034 8月  30 22:39 fastcgi.conf
-rw-r--r-- 1 root root 1034 8月  30 22:39 fastcgi.conf.default
-rw-r--r-- 1 root root  964 8月  30 22:39 fastcgi_params
-rw-r--r-- 1 root root  964 8月  30 22:39 fastcgi_params.default
-rw-r--r-- 1 root root 2837 8月  30 22:39 koi-utf
-rw-r--r-- 1 root root 2223 8月  30 22:39 koi-win
-rw-r--r-- 1 root root 3957 8月  30 22:39 mime.types
-rw-r--r-- 1 root root 3957 8月  30 22:39 mime.types.default
-rw-r--r-- 1 root root 2656 8月  30 22:39 nginx.conf
-rw-r--r-- 1 root root 2656 8月  30 22:39 nginx.conf.default
-rw-r--r-- 1 root root  596 8月  30 22:39 scgi_params
-rw-r--r-- 1 root root  596 8月  30 22:39 scgi_params.default
-rw-r--r-- 1 root root  623 8月  30 22:39 uwsgi_params
-rw-r--r-- 1 root root  623 8月  30 22:39 uwsgi_params.default
-rw-r--r-- 1 root root 3610 8月  30 22:39 win-utf
[root@lb01 conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf
[root@lb01 conf]# vim nginx.conf
把17 18 19 20 行删除
 1 worker_processes  1;
  2 events {
  3     worker_connections  1024;
  4 }
  5 http {
  6     include       mime.types;
  7     default_type  application/octet-stream;
  8     sendfile        on;
  9     keepalive_timeout  65;
 10     server {
 11         listen       80;
 12         server_name  localhost;
 13         location / {
 14             root   html;
 15             index  index.html index.htm;
 16         }
 17         error_page   500 502 503 504  /50x.html;
 18         location = /50x.html {
 19             root   html;
 20         }
 21     }
 22 }
然后在server标签上面增加如下几行
    upstream www_server_pools { #<==这里是定义web服务器池,包含了7,8两个web节点
      server 10.0.0.7:80 weight=1;
      server 10.0.0.8:80 weight=1;
    }
然后在index这行的下面增加如下内容:
proxy_pass http://www_server_pools;
然后把代理的服务器localhost修改为代理的服务器,例如:www.etiantian.org
最后完成的nginx.conf配置如下
[root@lb01 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream www_server_pools {
        server 10.0.0.7:80   weight=1;
        server 10.0.0.8:80   weight=1;
    }
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://www_server_pools;
        }
    }
}
这样负载均衡就配置完成了。
接下来nginx语法检查,启动nginx服务。
[root@lb01 conf]# ../sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.6.3/conf/nginx.conf test is successful
[root@lb01 conf]# ../sbin/nginx
[root@lb01 conf]# ../sbin/nginx -s reload
[root@lb01 conf]# lsof -i :80
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   4285  root    6u  IPv4  17693      0t0  TCP *:http (LISTEN)
nginx   4288 nginx    6u  IPv4  17693      0t0  TCP *:http (LISTEN)

lb01作为客户端测试下:
[root@lb02 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01 www.etiantian.org etiantian.org blog.etiantian.org bbs.etiantian.org
172.16.1.6      lb02
172.16.1.7      web02
172.16.1.8      web01
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
[root@lb02 ~]# for n in `seq 100`;do curl www.etiantian.org;sleep 1;done
[root@lb02 ~]# for n in `seq 100`;do curl www.etiantian.org/index.html;sleep 1;done
nginx www
apache www
nginx www
apache www
[root@lb02 ~]# for n in `seq 100`;do curl www.etiantian.org;sleep 1;done          
nginx www
apache www
nginx www
apache www
nginx www
负载到两个web服务器上面来回切换。
proxy_pass http://www_server_pools;这行后面加一样添加请求头。
            proxy_set_header Host $host;  ##加请求头。
客户端请求www.etiantian.org给负载均衡nginx,默认nginx是不带请求头的,如果加了请求头就可以找到想要的虚拟主机了。
默认情况下web节点的access.log 日志里面IP不是用户的ip地址,而是代理的IP。
要想实现节点中记录用户的ip地址,需要在proxy_set_header Host $host;后面再加一行,如下:
proxy_set_header X-Forwarded-For $remote_addr;
[root@web01 logs]# pwd
/application/nginx/logs
[root@web01 logs]# cat access.log

同理,把lb02也配置和lb01一样的负载均衡。
lb02里面的nginx.conf配置要和lb01一样
先把lob01机器停掉。
[root@lb01 ~]# pkill nginx
然后在m01机器里面测试
for n in `seq 100`;do curl 172.16.1.6/index.html;sleep 1;done
可以看到lb02代理服务器一会代理web01一会代理web02
[root@m01 ~]# for n in `seq 100`;do curl 172.16.1.6/index.html;sleep 1;done
nginx www
apache www
如何实现lb高可用呢?
负载均衡器的VIP规划为10.0.0.3/24
在两台机器上面配置辅助IP
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
windows hosts文件增加解析:
10.0.0.3 www.etiantian.org bbs.etiantian.org blog.etiantian.org etiantian.org
然后lb01再配置反向代理
在ie中输入http://blog.etiantian.org/就可以访问blog了,可以看到博客文字和图片。
然后ie中ping blog.etiantian.org 就可以看到返回的lb01虚ip地址了10.0.0.3
C:\Users\Administrator>ping blog.etiantian.org
正在 Ping www.etiantian.org [10.0.0.3] 具有 32 字节的数据:
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64
来自 10.0.0.3 的回复: 字节=32 时间<1ms TTL=64

10.0.0.3 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
继续把lb02里面的nginx.conf配置和lb01一样的,然后配置和lb01一样的虚ip地址
[root@lb02 conf]# ip addr add 10.0.0.3/24 dev eth0 label eth0:0
这样lb01和lb01就实现了负载均衡反向代理。

下面用keepalived实现
lb01和lb01同时按照yum install keepalived -y
[root@lb01 ~]# yum install keepalived -y

编辑/etc/keepalived/keepalived.conf文件为如下内容:
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf   
! Configuration File for keepalived

global_defs {
   notification_email {
   [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    10.0.0.3/24 dev eth0 label eth0:1
    }
}
然后scp拷贝给lb02机器
[root@lb01 ~]# scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/
然后修改lb02的keepalived.conf配置文件,修改完成后一定要重启下nginx服务。
[root@lb02 conf]# vim /etc/keepalived/keepalived.conf
修改的内容为:
router_id LVS_DEVEL1
state BACKUP
priority 100

然后lb01和lb02都启动keepalived
[root@lb01 ~]# /etc/init.d/keepalived start
正在启动 keepalived:                                      [确定]
[root@lb02 conf]# /etc/init.d/keepalived start                                   
正在启动 keepalived:                                      [确定]
启动后主keepalivedlb01先获取到资源,只有当主的挂了从lb02才启动。
检查有没有启动:
[root@lb01 ~]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:0
[root@lb02 conf]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:0
先把手工配置的虚IPdown了,要不冲突了。
[root@lb01 ~]# ifconfig eth0:0 down
[root@lb01 ~]# ip addr|grep 10.0.0.3
[root@lb02 conf]# ifconfig eth0:0 down
[root@lb02 conf]# ip addr|grep 10.0.0.3

重启服务器后发现只有lb01主keepalived有虚ip,从lb01keepalived没有虚ip,这就说明成功了。
[root@lb01 ~]# /etc/init.d/keepalived restart
停止 keepalived:                                          [确定]
正在启动 keepalived:                                      [确定]
[root@lb01 ~]# ip addr|grep 10.0.0.3        
    inet 10.0.0.3/24 scope global secondary eth0:1

[root@lb02 conf]# /etc/init.d/keepalived restart
停止 keepalived:                                          [确定]
正在启动 keepalived:                                      [确定]
[root@lb02 conf]# ip addr|grep 10.0.0.3   

如果两个都有IP就说明会列脑了。出问题了

然后ie再访问http://blog.etiantian.org/
就可以看到图片和文字的博客了。

现在测试把lb01机器挂掉,然后查看lb01是否有虚ip地址:
[root@lb02 conf]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:1
然后在登录ie测试:可以正常登录blog.etiantian.org

然后测试:
把主lb01从挂载状态打开到正常开机状态,那么lb01就自动把虚ip从lb02抢过来了。
抢过来的证据如下所示:
[root@lb01 ~]# ip addr|grep 10.0.0.3
    inet 10.0.0.3/24 scope global secondary eth0:1
[root@lb01 ~]#

[root@lb02 conf]# ip addr|grep 10.0.0.3
[root@lb02 conf]#
再次用ie打开blog.etiantian.org可以正常打开博客。