1 挂载iso镜像文件作为本地yum源
- 挂载ISO文件到/mnt/CentOS6:mount -o loop /home/CentOS-6.7-x86_64-DVD.iso /mnt/CentOS6
- 创建repo文件
cd /etc/yum.repos.d
mkdir bak
mv *.repo /etc/yum.repos.d/bak
vi CentOS6.7-localsource.repo
[CentOS7-Localsource]
name=CentOS6
baseurl=file:///mnt/CentOS6
enabled=1
gpgcheck=0
yum clean all(清除缓存)
yum makecache(建立新缓存)
LVS提供虚拟服务,采用直接路由模式DR;nginx作为反向代理服务器来实现负载均衡;keepalived实现主从热备,检查RealServer的健康状态以及主机与备机之间失效转移。本文选用Tenengine作为反向代理和负载均衡服务,Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性;Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。
直接路由模式DR (Direct Routing)
- 相关术语
- 1.DS:Director Server。指的是前端负载均衡器节点
- 2.RS:Real Server。后端真实的工作服务器
- 3.VIP:向外部直接面向用户请求,作为用户请求的目标的ip地址
- 4.DIP:Director Server IP,主要用于和内部主机通讯的IP地址
- 5.RIP:Real Server IP,后端服务器的IP地址
- 6.CIP:Client IP,访问客户端的IP地址
- 原理:负载均衡器和RS都使用同一个IP对外服务。但只有DR对ARP请求进行响应,所有RS对本身这个IP的ARP请求保持静默。也就是说,网关会把对这个服务IP的请求全部定向给DR,而DR收到数据包后根据调度算法,找出对应的RS,把目的MAC地址改为RS的MAC(因为IP一致)并将请求分发给这台RS。这时RS收到这个数据包,处理完成之后,由于IP一致,可以直接将数据返给客户,则等于直接从客户端收到这个数据包无异,处理后直接返回给客户端。由于负载均衡器要对二层包头进行改换,所以负载均衡器和RS之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
优点:负载均衡器只是分发请求,应答包通过单独的路由方法返回给客户端。
缺点:要求负载均衡器的网卡必须与物理网卡在一个物理段上。
本次安装环境及软件版本:
- CentOS6.7
- Tengine-2.2.0
- keepalived-2.0.13
2 nginx安装
-
解压
tar -zxvf Tengine-2.2.0.tar.gz -C /opt/ -
安装
进入解压后的目录 ./configure --prefix=/opt/tengine异常1: [root@bogon tengine]# ./configure checking for OS + Linux 3.10.0-327.el7.x86_64 x86_64 checking for C compiler ... not found ./configure: error: C compiler cc is not found 也就是c编译器 gcc找不到 安装gcc yum -y install gcc 继续检查 异常2: checking for PCRE library ... not found checking for PCRE library in /usr/local/ ... not found checking for PCRE library in /usr/include/pcre/ ... not found checking for PCRE library in /usr/pkg/ ... not found checking for PCRE library in /opt/local/ ... not found ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module 缺少pcre和pcre-devel 安装 yum -y install pcre pcre-devel 这里安装好后 可以通过。 异常3: checking for OpenSSL library ... not found 缺少openssl和openssl-devel 安装 yum -y install openssl openssl-devel
make && make install
安装完成,安装目录为configure时指定的/opt/tengine,如未指定默认安装目录为/usr/local/nginx -
安装完成之后,检查nginx的配置文件是否正确
cd /opt/tengine/sbin/ ./nginx -t
检查通过,说明nginx安装成功。
-
nginx启动
配置环境变量 vi /etc/profile 加入 export NGINX_HOME=/opt/tengine export PATH=$PATH:$NGINX_HOME/sbin 保存 输入nginx启动。
-
nginx常用命令
- nginx -m 显示所有加载的模块
- nginx -l 显示所有可以使用的指令
- nginx -t 检查nginx的配置文件是否正确
- nginx -s 启动nginx
- nginx -s reload 重新加载配置文件
- nginx -s stop 停止nginx
-
配置nginx
vi /home/java/tengine/conf/nginx.conf
# user root; #运行用户
worker_processes 1; #启动进程,通常设置成和cpu的数量相等
#全局错误日志及PID文件
error_log /home/java/nginx/logs/error.log;
error_log /home/java/nginx/logs/error.log notice;
error_log /home/java/nginx/logs/error.log info;
pid /home/java/nginx/logs/nginx.pid;
# 工作模式及连接数上线
events {
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024; #单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
include mime.types; #文件扩展名与类型映射表
default_type application/octet-stream; #默认文件类型
#设置日志模式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
#设定请求缓冲
server_names_hash_bucket_size 128;
client_header_buffer_size 32K;
large_client_header_buffers 4 32k;
# client_max_body_size 8m;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
#开启gzip压缩,降低传输流量
gzip on;
#设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示不管页面多大都进行压缩。建议设置成大于1K。如果小于1K可能会越压越大。
gzip_min_length 1k;
#压缩缓冲区大小。表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_buffers 4 16k;
#压缩版本(默认1.1)用于设置识别HTTP协议版本,目前大部分浏览器已经支持GZIP解压,使用默认即可。
gzip_http_version 1.1;
#压缩比率。用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源。
gzip_comp_level 2;
#用来指定压缩的类型,“text/html”类型总是会被压缩
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#反向代理负载均衡设定部分
#upstream表示负载服务器池,切记,这个名称不能使用下划线,否则无法识别导致负载不过去
upstream serverpool {
#server tomcat地址:端口号 weight表示权值,权值越大,被分配的机率越大;
server 192.168.33.101:80 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.33.102:80 weight=4 max_fails=2 fail_timeout=30s;
}
server {
listen 8088; #监听端口
server_name www.test.com; #对外提供服务的网址(域名或者ip)
#默认请求设置
location / {
index index.jsp index.html index.htm; #设定访问的默认首页
#root /usr/local/apache7/webapps; #站点根目录,此目录下存放我们的web项目
proxy_pass http://serverpool;
}
#charset koi8-r;
#access_log logs/host.access.log main;
#所有的jsp页面均由tomcat处理
location ~ \.(jsp|jspx|dp)?$
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://serverpool; #转向tomcat处理
}
#所有的静态文件直接读取不经过tomcat,nginx自己处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
#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 /usr/local/nginx/logs/ubitechtest.log access;#设定访问日志的存放路径
# redirect server error pages to the static page /50x.html
#
#定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
其他节点上配置文件可完全一样。至此nginx已搭建完成,浏览器输入http://192.168.33.101:8088即可访问。
3 keepalived实现nginx高可用(HA)
- 安装
编译安装方式与nginx类似。
先解压
tar -zxvf /home/soft/keepalived-2.0.13.tar.gz
cd /home/soft/keepalived-2.0.13/
./configure --prefix=/opt/keepalived-2.0.13
make && make install
- 建立服务启动脚本,以便使用service命令控制,将解压后路径/home/soft/keepalived-2.0.13/keepalived/etc/init.d的文件keepalived拷贝到/etc/init.d下
cp /home/soft/keepalived-2.0.13/keepalived/etc/init.d/keepalived /etc/init.d/
- 由于安装使用非默认路径(本教程中使用的/opt/keepalived-2.0.13)故需修改相关路径,保证keepalived能正常启动
vi /etc/init.d/keepalived
大约15行
将. /etc/sysconfig/keepalived 修改为
. /opt/keepalived-2.0.13/etc/sysconfig/keepalived
- 设置正确启动参数命令,并将修改好的keepalived拷贝到/etc/sysconfig 目录下
vi /opt/keepalived-2.0.13/etc/sysconfig/keepalived
修改的路径为安装路径下的配置文件,如果不修改,则默认会去找/etc/keepalived/keepalived.conf文件。
KEEPALIVED_OPTIONS="-D -f /opt/keepalived-2.0.13/etc/keepalived/keepalived.conf"
将修改好的keepalived拷贝到/etc/etc/sysconfig 目录下
cp /opt/keepalived-2.0.13/etc/sysconfig/keepalived /etc/sysconfig/
- 配置keepalived
vi /opt/keepalived-2.0.13/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER # 设置lvs的id,在一个网络应该是唯一的
}
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,备用服务器上为 BACKUP
interface ens33 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡),根据自己的服务器来设置
virtual_router_id 66 # 虚拟路由编号,主从要一直
priority 100 # 优先级,数值越大,获取处理请求的优先级越高,备用服务器上数值要小点
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.33.200 # 定义虚拟ip(VIP),可多设,每行一个
}
}
# 定义对外提供的LVS的VIP以及port
virtual_server 192.168.33.200 80 {
delay_loop 6 # 设置健康检查时间,每隔6秒查询realserver状态
lb_algo rr # lvs 算法
lb_kind DR # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
persistence_timeout 0 # 同一IP的连接60秒内被分配到同一台realserver
protocol TCP
#真实服务器(nginx)
real_server 192.168.33.101 8088 {
weight 3 # 配置节点权值,数值越大权重越高
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 8088
}
}
real_server 192.168.33.102 8088 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 8088
}
}
}
- 这里在keepalived的配置文件中定义的LVS模式为DR模式,还需要在两台rs上执行lvs_dr_rs.sh脚本
vi /opt/keepalived-2.0.13/lvs_dr_rs.sh
#/bin/bash
vip=192.168.33.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
- 执行:sh /opt/keepalived-2.0.13/lvs_dr_rs.sh
- 在两台真实服务器上面执行完毕之后,执行ip addr就能看到两台服务器的lo都绑定好了虚拟ip.
- 服务器重启之后绑定的这个虚拟ip就没有了,需要再执行一下脚本,所以可以把对这个脚本的执行放到开机自启中。
执行命令:vi /etc/rc.d/rc.local
将以下内容添加至该文件中:sh /opt/keepalived-2.0.13/lvs_dr_rs.sh
保存退出,然后添加执行权限:chmod +x rc.local
- 启动keepalived服务: service keepalived start
- 在keepalived端执行命令ipvsadm -ln查看连接数,如果报错,先安装ipvsadm,yum install -y ipvsadm
[root@chenhao keepalived-2.0.13]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.33.200:80 rr
-> 192.168.33.101:80 Route 3 0 1
-> 192.168.33.102:80 Route 3 0 2
- 出现的问题
1、启动过程中提示keepalived command not found
启动方式为:/etc/init.d/keepalived start
原因:keepalived命令没有在/usr/sbin目录下
解决方法:cp /opt/keepalived-2.0.13/sbin/keepalived /usr/sbin