搞了一天,发现自己走了好多弯路,对于像我这种小白来说,搭建服务器最需要的是搞懂原理,精确步骤,所以记录下过程。。。
自己简单画的架构:
实验环境:
redhat 6.5
主:172.25.67.2 nginx keepalived
副:172.25.67.3 nginx keepalived
vip:172.25.67.100
一:安装配置nginx
安装包:nginx-1.9.14.tar.gz
源码包安装 在安装过程中可能存在依赖性问题,解决办法:安装依赖包
[root@server2 /]# yum install -y gcc gcc-c++ zlib openssl
[root@server2 /]# tar zxf nginx-1.9.14.tar.gz
[root@server2 /]# cd nginx-1.9.14
[root@server2 nginx-1.9.14]# ./configure --prefix=/usr/local/nginx/ ##--prefix后面接的是安装路径
如果还存在依赖性问题,即出现报错,我们直接根据提示安装相应的依赖包
[root@server2 nginx-1.9.14]# make && make install
启动nginx
[root@server2 nginx-1.9.14]# /usr/local/nginx/sbin/nginx ##不报错则ok
浏览器访问 ip
此页面为nginx的默认发布页面,为了后面测试,我们可以更改发布页面:
[root@server2 /]# cd /usr/local/nginx/html/
[root@server2 html]# rm -fr *
[root@server2 html]# echo "172.25.67.2">>index.html
此时,我们更改了发布页面
编辑配置文件:
[root@server2 nginx]# vim /usr/local/nginx/conf/nginx.conf
[root@server2 nginx]# cat /usr/local/nginx/conf/nginx.conf
#user www www; ##可以暂时不更改定义,Nginx运行的用户和用户组
worker_processes 1;#nginx进程数,建议设置为等于CPU总核心数。
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
#pid logs/nginx.pid;#进程pid文件
events {
worker_connections 1024;
}
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;
sendfile on;
#tcp_nopush on; #此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
#keepalive_timeout 0;
keepalive_timeout 65; #长连接超时时间,单位是秒
######################################################
#gzip on;
upstream discuz { #负载均衡配置
server 172.25.67.2:80 weight=1 max_fails=2 fail_timeout=10s;
server 172.25.67.3:80 weight=1 max_fails=2 fail_timeout=10s;
}
server {
listen 80;
server_name localhost;
其他的都不用改,只需要加上负载均衡配置和 server_name localhost; 即
[root@server2 nginx]# /usr/local/nginx/sbin/nginx -t ##检查是否有语法错误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server2 nginx]# /usr/local/nginx/sbin/nginx #启动
好了:到此,我们已经配置好nginx并且加入了 server 172.25.67.2:80 weight=1 max_fails=2 fail_timeout=10s; 即当2或者3服务器如果最大错误连接为2时间超过十秒就报错
在此,主备两个nginx的设置相同,不同点在于在制作发布页面时,要和server2区分开,所以我直接写下server3的ip
[root@server3 /]# cd /usr/local/nginx/html/
[root@server3 html]# rm -fr *
[root@server3 html]# echo "172.25.67.3">>index.html
二:安装keepalived
安装包:keepalived-1.2.18.tar.gz
server2为主服务器,注意主备服务器的配置有所不同
解决依赖性:
[root@server2 /]# yum -y install gcc pcre-devel zlib-devel openssl-devel
[root@server2 keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived/ ##编译环境
[root@server2 keepalived-1.2.18]# make
[root@server2 keepalived-1.2.18]# make install
由于源文件安装的没有将文件放在指定位置,因此我们可以做个软链接,当然也可以cp,不过我觉得cp过去的如果修改文件可能会有些麻烦。。。
70 cd /usr/local/keepalived/
71 ln -s etc/keepalived/keepalived.conf /etc/keepalived/
72 ln -s etc/rc.d/init.d/keepalived /etc/init.d/
73 ln -s etc/sysconfig/keepalived /etc/sysconfig/
修改配置文件:
注:以下是主服务器即master的配置
[root@server2 keepalived-1.2.18]# cat /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
****************************************************
global_defs {
notification_email {#指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc#keepalived在发生诸如切换操作时需要发送email通知地址
smtp_server 127.0.0.1 #指定发送email的smtp服务器
smtp_connect_timeout 30#设置连接smtp server的超时时间
router_id LVS_DEVEL
}
****************************************************
#注:上述是邮件的发送设置,我们暂时不用去管
vrrp_script chk_nginx { #检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等
script"/data/sh/check_nginx.sh" #这里通过脚本监测,记住这个地址,里面写检测脚本
interval2 #脚本执行间隔,每2s检测一次
weight2 #脚本结果导致的优先级变更,检测失败(脚本返回非0)
}
vrrp_instance VI_1 {#keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管
state MASTER #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器
interface eth0 #指定HA监测网络的接口。实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的
virtual_router_id 51 #虚拟路由标识MASTER和BACKUP必须是一致的
priority 100 #定义优先级,数字越大,优先级越高,MASTER的优先级必须大于BACKUP的优先级
advert_int 1
authentication { #设置验证类型和密码。主从必须一样
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #VRRP HA 虚拟地址 如果有多个VIP,继续换行填写
172.25.67.100
}
track_script{ #执行监控的服务。注意这个设置不能紧挨着写在vrrp_script配置块的后面
chk_nginx #引用VRRP脚本,即在 vrrp_script 部分指定的名字
}
}
。。。。。后面是属于lvs的配置,我们暂时不需要,直接注释或者删除
总结上面配置文件需要更改注意的地方:
vrrp_script chk_nginx {
script”/data/sh/check_nginx.sh”
interval2
weight2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.67.100
}
track_script{
chk_nginx
}
}
黑体标记
加载vip模块
27 modprobe ip_vs
28 modprobe ip_vs_rr
29 modprobe ip_vs_wrr
制作检测脚本:
[root@server2 /]# mkdir -p /data/sh
[root@server2 /]# vim /data/sh/check_nginx.sh
[root@server2 /]# chmod +x /data/sh/check_nginx.sh
[root@server2 nginx-1.9.14]# cat /data/sh/check_nginx.sh
#!/bin/bash
#Target: If Nginx Down, Stop keepalive!
#
killall -0 nginx
if [[ ! $? -eq 0 ]];then
/etc/init.d/keepalived stop ##看到这里是在etc下启动,所以一定要有上面的ln -s
fi
server3
备服务器和主服务器唯一的不同在于配置文件中的设置
[root@server3 /]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script"/data/sh/check_nginx.sh" ##同样用脚本判定nginx
是否正常
interval2
weight2
}
vrrp_instance VI_1 {
state BACKUP ##BACKUP为备服务器
interface eth0
virtual_router_id 51
priority 80 ##优先级一定要低于主
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.25.67.100
}
track_script{
chk_nginx
}
}
对于备服务器server3的配置和server2相同,不同点只是上述文件内的内容。
配置好所有后,检查是否关闭了防火墙
好了现在我们到了最后一步,开启所有服务:
server2
[root@server2 /]# /usr/local/nginx/sbin/nginx
[root@server2 /]# /etc/init.d/keepalived start
正在启动 keepalived: [确定]
server3
[root@server3 /]# /usr/local/nginx/sbin/nginx
[root@server3 /]# /etc/init.d/keepalived start
正在启动 keepalived: [确定]
server2(主)查看ip 发现ip已经绑定在了eth0上
[root@server2 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
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 state UP qlen 1000
link/ether 52:54:00:55:3e:83 brd ff:ff:ff:ff:ff:ff
inet 172.25.67.2/24 brd 172.25.67.255 scope global eth0
inet 172.25.67.100/32 scope global eth0
inet6 fe80::5054:ff:fe55:3e83/64 scope link
valid_lft forever preferred_lft forever
[root@server2 /]#
测试:
访问vip:172.25.67.100
出现主设备nginx的发布页面
当停掉主keepalived时
[root@server2 /]# /etc/init.d/keepalived stop
停止 keepalived: [确定]
[root@server2 /]#
查看server3的ip
[root@server3 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
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 state UP qlen 1000
link/ether 52:54:00:18:70:9b brd ff:ff:ff:ff:ff:ff
inet 172.25.67.3/24 brd 172.25.67.255 scope global eth0
inet 172.25.67.100/32 scope global eth0
inet6 fe80::5054:ff:fe18:709b/64 scope link
valid_lft forever preferred_lft forever
[root@server3 /]#
我们会发现vip漂移到3上
访问vip:
当我们重新打开server2的keepalived:
[root@server2 /]# /etc/init.d/keepalived start
正在启动 keepalived: [确定]
[root@server2 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
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 state UP qlen 1000
link/ether 52:54:00:55:3e:83 brd ff:ff:ff:ff:ff:ff
inet 172.25.67.2/24 brd 172.25.67.255 scope global eth0
inet 172.25.67.100/32 scope global eth0
inet6 fe80::5054:ff:fe55:3e83/64 scope link
valid_lft forever preferred_lft forever
[root@server2 /]#
刷新访问界面: