一 环境准备
服务器说明 |
外网IP(NAT) |
内网IP(NAT) |
主机名称规划 |
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可以正常打开博客。