您的位置:首页 > 运维架构 > Nginx

keepalived+nginx实现nginx的高可用

2014-03-05 16:28 441 查看
参考:/article/4468467.html nginx安装可以参考:/article/4340860.htmlnginx的高可用实现后端realserver的负载均衡实验环境:OS:Centos 6.4(redhat 6.4)yum源:
1234567891011
[centos]
name=sohu-centos
baseurl=http:
//mirrors
.sohu.com
/centos/
$releasever
/os/
$basearch
gpgcheck=1
enable
=0
gpgkey=http:
//mirrors
.sohu.com
/centos/RPM-GPG-KEY-CentOS-6
[epel]
name=sohu-epel
baseurl=http:
//mirrors
.sohu.com
/fedora-epel/
$releasever/$basearch/
enable
=1
gpgcheck=0
拓扑图:


拓扑图的规划:
IP地址软件
Master172.16.22.1(VIP:172.16.22.100)keepalived+nginx
Backup172.16.22.2(VIP:172.16.22.100)keepalived+nginx
apache1172.16.22.3httpd
apache2172.16.22.4httpd
此架构需考虑的问题1)、Master没挂,则Master占有vip且nginx运行在Master上2)、Master挂了,则backup抢占vip且在backup上运行nginx服务3)、如果master服务器上的nginx服务挂了,则vip资源转移到backup服务器上4)、检测后端服务器的健康状态Master和Backup两边都开启nginx服务,无论Master还是Backup,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上,如果要想使nginx服务挂了,vip也漂移到另一个节点,则必须用脚本或者在配置文件里面用shell命令来控制。首先必须明确后端服务器的健康状态检测keepalived在这种架构上是无法检测的,后端服务器的健康状态检测是有nginx来判断的,但是nginx的检测机制有一定的缺陷,后端服务器某一个宕机之后,nginx还是会分发请求给它,在一定的时间内后端服务响应不了,nginx则会发给另外一个服务器,然后当客户的请求来了,nginx会一段时间内不会把请求分发给已经宕机的服务器,但是过一段时间后,nginx还是会把分发请求发给宕机的服务器上。一、安装keepalived+nginxMaster:1、安装keepalived和编译安装nginx
[root@jie1 ~]# yum -y install keepalived
[root@jie1 ~]#tar xf nginx-1.4.2.tar.gz
[root@jie1 ~]#yum -y groupinstall "Development tools" "Server  Platform Development"
[root@jie1 ~]#yum -y install pcre-devel
[root@jie1 ~]# cd nginx-1.4.2
[root@jie1 nginx-1.4.2]# groupadd nginx
[root@jie1 nginx-1.4.2]# useradd -r -g nginx nginx
[root@jie1 nginx-1.4.2]#./configure \
--prefix=/usr\
--sbin-path=/usr/sbin/nginx\
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid  \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/\
--http-proxy-temp-path=/var/tmp/nginx/proxy/\
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/\
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi\
--http-scgi-temp-path=/var/tmp/nginx/scgi\
--with-pcre
[root@jie1 nginx-1.4.2]# make && make install
2、提供nginx的system V服务脚本文件
[root@jie1 nginx-1.4.2]# vim /etc/rc.d/init.d/nginx#!/bin/sh## nginx - this script starts and stops the nginx daemon## chkconfig:   - 85 15# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \#               proxy and IMAP/POP3 proxy server# processname: nginx# config:      /etc/nginx/nginx.conf# config:      /etc/sysconfig/nginx# pidfile:     /var/run/nginx.pid# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network# Check that networking is up.[ "$NETWORKING"= "no"] && exit0nginx="/usr/sbin/nginx"prog=$(basename$nginx)NGINX_CONF_FILE="/etc/nginx/nginx.conf"[ -f /etc/sysconfig/nginx] && . /etc/sysconfig/nginxlockfile=/var/lock/subsys/nginxmake_dirs() {# make required directoriesuser=`nginx -V 2>&1 | grep"configure arguments:"| sed's/[^*]*--user=\([^ ]*\).*/\1/g'-`options=`$nginx -V 2>&1 | grep'configure arguments:'`foropt in$options; doif[ `echo$opt | grep'.*-temp-path'` ]; thenvalue=`echo$opt | cut-d "="-f 2`if[ ! -d "$value"]; then# echo "creating" $valuemkdir-p $value && chown-R $user$valuefifidone}start() {[ -x $nginx ] || exit5[ -f $NGINX_CONF_FILE ] || exit6make_dirsecho-n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq0 ] && touch$lockfilereturn$retval
}
stop() {
echo-n $"Stopping $prog: "killproc $prog -QUITretval=$?echo[ $retval -eq0 ] && rm-f $lockfilereturn$retval}restart() {configtest || return$?stopsleep1start}reload() {configtest || return$?echo-n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null2>&1
}
case"$1"in
start)
rh_status_q && exit0$1
;;
stop)
rh_status_q ||exit0$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q ||exit0
;;
*)
echo$"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"exit2esac[root@jie1 nginx-1.4.2]# chmod +x /etc/rc.d/init.d/nginx[root@jie1 nginx-1.4.2]# service nginx startStarting nginx:                                            [  OK  ][root@jie1 nginx-1.4.2]# scp -p /etc/rc.d/init.d/nginx  172.16.22.2:/etc/rc.d/init.d    #把nginx的服务脚本复制到backup上,-p是保持原有的权限
3、修改配置文件
[root@jie1 ~]# cd /etc/keepalived/
[root@jie1 keepalived]# vim keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from admin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LTT
}
vrrp_script chk_nginx {  #检测nginx服务是否在运行有很多方式,比如进程,用脚本检测等等
script "killall -0 nginx"#用shell命令检查nginx服务是否存在
interval 1#时间间隔为1秒检测一次
weight -2#当nginx的服务不存在了,就把当前的权重-2
fall 2#测试失败的次数
rise 1#测试成功的次数
}
vrrp_instance IN_1 {state MASTER
interface eth0virtual_router_id 22priority 100advert_int 1authentication {
auth_type PASS
auth_pass aaaa
}
virtual_ipaddress {172.16.22.100}
track_script {
chk_nginx   #引用上面的vrrp_script定义的脚本名称
}
}
[root@jie1 keepalived]#scp keepalived.conf 172.16.22.2:/etc/keepalived #把配置文件copy到Backup服务器上,copy之前要保证Backup服务器上面已经安装了keepalived
4、开启keepalived和nginx的服务
[root@jie1 keepalived]# service keepalived startStartingkeepalived:                                       [  OK  ]
[root@jie1 keepalived]# chkconfig --add keepalived
[root@jie1 keepalived]# chkconfig keepalived on
[root@jie1 ~]# service nginx startStartingnginx:                                            [  OK  ]
[root@jie1 ~]# chkconfig --add nginx
[root@jie1 ~]# chkconfig  nginx on
Backup:1、安装keepalived和编译安装nginx
[root@jie2 ~]# yum -y install keepalived
[root@jie2 ~]#tar xf nginx-1.4.2.tar.gz
[root@jie2 ~]#yum -y groupinstall "Development tools" "Server  Platform Development"
[root@jie2 ~]#yum -y install pcre-devel
[root@jie2 ~]# cd nginx-1.4.2
[root@jie2 nginx-1.4.2]# groupadd nginx
[root@jie2 nginx-1.4.2]# useradd -r -g nginx nginx
[root@jie2 nginx-1.4.2]#./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid  \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
[root@jie2 nginx-1.4.2]# make && make install
2、之前 已经从Master复制了nginx的system V服务脚本文件,启动nginx 服务
[root@jie2 ~]# service nginx startStartingnginx:                                            [  OK  ]
[root@jie2 ~]# chkconfig --add nginx
[root@jie2 ~]# chkconfig  nginx on
3、修改配置文件
@jie2# cd /etc/keepalived/
[root@jie2 keepalived]# vim keepalived.conf #此配置文件是从Master服务器上copy过来,只需小小改动state BACKUP #把这里原先的MASTER改成BACKUPpriority 99#把这里原先的100改成99auth_pass aaaa 验证密码需要一样
4、开启服务
[root@jie2 keepalived]# service keepalived startStartingkeepalived:                                       [  OK  ]
[root@jie2 keepalived]# chkconfig --add keepalived
[root@jie2 keepalived]# chkconfig keepalived on
apache1:1、安装(博主这里用rpm包安装,各位朋友可以用源码编译安装)
[root@jie3 ~]# yum -y install httpd
2、建立测试网页文件
[root@jie3 ~]# cd /var/www/html/
[root@jie3 html]# cat index.html #建一个测试网页
<h1>this is apache1</h1>
3、开启服务
[root@jie3 html]# service httpd startStartinghttpd:                 [  OK  ]
[root@jie3 html]# chkconfig --add httpd
[root@jie3 html]# chkconfig  httpd on
apache2:1、安装(博主这里用rpm包安装,各位朋友可以用源码编译安装)
[root@jie4 ~]# yum -y install httpd
2、建立测试网页文件
[root@jie4 ~]# cd /var/www/html/
[root@jie4 html]# cat index.html #建一个测试网页
<h1>this is apache2</h1>
3、开启服务
[root@jie4 html]# service httpd startStartinghttpd:                 [  OK  ]
[root@jie4 html]# chkconfig --add httpd
[root@jie4 html]# chkconfig  httpd on
此致所有安装已经完成。二、nginx实现后端realserver的负载均衡,由于两边的配置文件必须保持一致,所以在Master配置完后直接copy到Backup上Master:
[root@jie1 ~]# cd /etc/nginx/
[root@jie1 nginx]# grep -v "#" nginx.conf | grep -v "^$"
worker_processes  1;
events {
worker_connections  1024;
}
http {
include       mime.types;
default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;
upstream apacheweb {  #定义负载均衡的模块server 172.16.22.3:80 max_fails=3 fail_timeout=2s;
server 172.16.22.4:80 max_fails=3 fail_timeout=2s;
}
server {listen80;
server_name  localhost;
location / {
root   html;indexindex.html index.htm;
}
error_page   500502503504  /50x.html;
location = /50x.html {            root   html;        }        location ~ \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {            root        /var/www/html;  #此处定义后端服务器网页存放路径proxy_pass   http://apacheweb; }
}
}
[root@jie1 nginx]# scp nginx.conf 172.16.22.2:/etc/nginx
两边分别重启服务
[root@jie2 nginx]# service nginx restart
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
[root@jie2 nginx]# service nginx restart
可以通过ip add show 查看VIP漂移情况tail -f /var/log/message跟踪vip日志变化验证负载均衡:




本博客只是简单的用nginx做了方向代理和静态页面的负载均衡。本文出自 “从心开始” 博客,请务必保留此出处http://hao360.blog.51cto.com/5820068/1368728
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: