IT技术互动交流平台

Nginx反向代理 负载均衡 redis session共享 keepalived高可用

作者:MrLinFeng  来源:IT165收集  发布日期:2016-12-12 20:35:56

相关知识自行搜索,直接上干货。。。

使用的资源:

nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换。

tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群。

redis服务器一台,用于session的分离共享。

nginx主服务器:192.168.50.133

nginx备服务器:192.168.50.135

tomcat项目服务器1:192.168.50.137

tomcat项目服务器2:192.168.50.139

redis服务器:192.168.50.140

注意访问时需要配置防火墙规则,或者关闭防火墙

首先进行的通用安装:

总的需要模拟五台服务器,使用vmware,全部使用centos6.5 64位,五台服务器全部安装jdk,我使用的是jdk1.8.

1.安装VMware虚拟机,安装linux系统,此处使用centOS6.5 64位,安装linux命令行工具,上传文件工具,此处使用SecureCRT,SecureFX 。安装教程不再赘述,百度一大堆..........

这步有问题请使劲点:www.baidu.com

2.在linux上安装jdk:

安装jdk:卸载openjdk版本,上传解压jdk,配置环境变量----参考:http://jingyan.baidu.com/article/ab0b56308966acc15afa7d18.html

一、Nginx反向代理与负载均衡:

架构图:

此时需要用到三台服务器,一台nginx服务器,两台正式部署项目的服务器:选择的是192.168.50.133主nginx和192.168.50.137,192.168.50.139两台tomcat服务器

首先在两台服务器上安装tomcat:这个也是简单,不多说

安装tomcat:上传解压即可使用,bin目录下 startup.sh启动,shutdown.sh关闭

配置防火墙端口:vim /etc/sysconfig/iptables 编辑,开放8080端口,80端口等一些常用端口,当然后边有用到一些端口都是需要配置开放的,不建议关闭防火墙

编辑好后 service iptables restart 重新加载防火墙配置

如果是自己测试嫌配置麻烦,关闭防火墙: service iptables stop 重启后防火墙打开,即在此次开机状态下有效,完全关闭再使用 chkconfig iptables off ,即会在重启后也关闭防火墙,注意有时候服务都起了但访问出错,可能就是防火墙问题哦

启动tomcat访问:192.168.50.137:8080,192.168.50.139:8080,打开tomcat首页即成功。

然后编写测试项目,部署到两台tomcat上,eclipse新建web项目,项目名为testproject,在webapp下新建一个jsp页面为index.jsp,添加如下内容

将项目中web.xml中的访问顺序<welcome-file>index.jsp</welcome-file>上移到第一个访问

然后右键导出为war包,testproject.war,将该war包上传到两台服务器的tomcat的webapps中

 然后修改tomcat的server.xml文件,在tomcat conf目录中:可以使用notepad++的插件NppFTP直接连上linux,然后使用notepad++修改文件哦,保存记得使用UTF-8无BOM格式,具体去百度吧,哈哈

修改Engine标签中,添加jvmRoute,用于标识nginx访问的是哪个服务器tomcat,137服务器标识为137Server1,139服务器标识为139Server2

在两台tomcat的server.xml文件,Host标签中添加:<Context path='' docBase='testproject'/>,path标识访问路径,docBase为项目名,表示访问项目

此时,重新启动tomcat,访问192.168.50.137:8080,192.168.50.139:8080,显示index.jsp内容:两台服务器访问显示如下

 

至此,两台tomcat服务器搭建完成。

在nginx主机192.168.50.133上安装nginx:

 先使用yum命令安装gcc,安装pcre,zlib,openssl:

yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel

 在/usr/local/目录下新建nginx-src目录,将nginx-1.8.0.tar.gz放到此处,解压 

tar -zxvf nginx-1.8.0.tar.gz

进入解压后目录

依次执行命令:

./configure

make

mkae install

 此时nginx安装完毕,安装目录是/usr/local/nginx,nginx默认占用80端口

其中,sbin目录为nginx执行命令,conf目录下的nginx.conf为默认加载的配置文件

启动nginx:

./sbin/nginx 

关闭nginx:

./sbin/nginx -s stop

 启动nginx后访问192.168.50.133:80即可访问nginx:显示nginx欢迎页

 至此,nginx安装完毕。

3.反向代理与负载均衡配置

现有两台服务器,一台为192.168.50.137,一台为192.168.50.139,服务器上各有一台tomcat,端口均为8080,在192.168.50.133上有nginx,经过配置nginx,当访问192.168.50.133:80时,即可访问192.168.50.137:8080,192.168.50.139:8080中随机一台,此时192.168.50.133:80被nginx监听,当有请求时,代理到192.168.50.137:8080,192.168.50.139:8080随机一台即可,即为nginx反向代理功能,同时此时可以通过nginx将请求进行转发,保证了一个入口,将所有请求转发到两台服务器上也减轻了任何一台的负载压力,当有大量请求时,可以搭建大量服务器,在入口代理服务器上使用nginx进行转发,即是负载均衡功能。

 

 配置即是配置nginx安装目录中conf目录下的nginx.conf文件即可:具体配置如下,重点是红色部分

#Nginx所用用户和组
#user  niumd niumd;

#工作的子进程数量(通常等于CPU数量或者2倍于CPU)
worker_processes  2;

#错误日志存放路径
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#指定pid存放文件
pid        logs/nginx.pid;

events {
    #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue
    #use epoll;
    
    #允许最大连接数
    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  off;
    access_log  logs/access.log;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;
 
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #fastcgi_intercept_errors on; 
   
    error_page 404  /404.html;

    #keepalive_timeout  75 20;

    gzip                 on;
    gzip_min_length      1000;
    gzip_types           text/plain text/css application/x-javascript;

    #配置被代理的服务器
    upstream blank {
        #ip_hash;
        server 192.168.50.137:8080;
        server 192.168.50.139:8080;
    }

    server {
            #nginx监听80端口,请求该端口时转发到真实目标
            listen       80;
            #配置访问域名
            server_name  192.168.11.133;                  
        
            location / {
                #这里配置代理是指上面定义的两个被代理目标,blank名字必须一致
                proxy_pass http://blank;
                
                #proxy_redirect          off;
                #非80端口使用,目的是将代理服务器收到的用户的信息传到真实服务器上,我也不是很理解
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
                client_max_body_size    10m;
                client_body_buffer_size 128k;
                proxy_connect_timeout   300;
                proxy_send_timeout      300;
                proxy_read_timeout      300;
                proxy_buffer_size       4k;
                proxy_buffers           4 32k;
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;
                add_header Access-Control-Allow-Origin *;
            }
            
            #此处定义500 502 503 504的错误页面
            error_page   500 502 503 504  /50x.html;
            #错误页面位置
            location = /50x.html {
            #root表示路径 html为nginx安装目录中的html文件夹
            #位于/usr/local/nginx/html/下
               root   html;
            }        
    }
}

启动两台tomcat,重新启动nginx:

访问192.168.50.133:80将会随机访问192.168.50.137:8080和192.168.50.139:8080其中一台。(问题:每次刷新nginx服务器地址sessionid会变,session不能共享。)

nginx轮询策略:

nginx负载均衡到多台服务器上时,默认采用轮询策略:

常见策略:

1、轮询

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况,数字越大命中率越高。
例如:轮询几率是2:1
upstream bakend {
server 192.168.0.14 weight=2;
server 192.168.0.15 weight=1;
}

2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}

其他策略可以自行查询学习,nginx还有很多其他可配置项,静态资源缓存,重定向等,想深入的童鞋请自行学习

nginx配置详解:http://blog.csdn.net/tjcyjd/article/details/50695922

实际问题:虽然解决了,但是不是很理解,记录一下

其中192.168.50.133:80是有外网映射的,外网55.125.55.55:5555映射到192.168.50.133:80上,此时使用55.125.55.55:5555访问,会映射到192.168.50.133:80上,然后会被转发到192.168.50.137:8080或192.168.50.139:8080,但是此时却出现图片,js,css等静态文件无法访问的情况,通过两种方法解决。

<1>.映射非80端口

让55.125.55.55:5555映射192.168.50.133的非80端口,例如55.125.55.55:5555映射192.168.50.133:5555,然后再在nginx配置文件中配置如下,注意红色加大部分:这地方不理解

........ 
upstream blank {
		#ip_hash;
		server 192.168.50.137:8080;
		server 192.168.50.139:8080;
    }

    server {
	    #nginx监听5555端口,请求该端口时转发到真实目标
            listen       5555;
	    #配置访问域名
            server_name  192.168.11.133;           	   
		
            location / {
		#这里配置代理是指上面定义的两个被代理目标,blank名字必须一致
                proxy_pass http://blank;
				
		#proxy_redirect          off;
		#非80端口使用,目的是将代理服务器收到的用户的信息传到真实服务器上
		proxy_set_header        Host $host:5555;
		proxy_set_header        X-Real-IP $remote_addr;
	     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
		client_max_body_size    10m;
		client_body_buffer_size 128k;
		proxy_connect_timeout   300;
		proxy_send_timeout      300;
		proxy_read_timeout      300;
		proxy_buffer_size       4k;
		proxy_buffers           4 32k;
		proxy_busy_buffers_size 64k;
		proxy_temp_file_write_size 64k;
		add_header Access-Control-Allow-Origin *;
            }

........

 此时访问55.125.55.55:5555,映射到192.168.50.133:5555上,然后转发到192.168.50.137:8080或192.168.50.139:8080上,此时静态文件均能访问。

 <2>.使用域名在外网服务器上使用nginx进行转发

将55.125.55.55绑定域名为test.baidubaidu.com,此时在55.125.55.55服务器上使用nginx,

........
location / {
		#加入判断,如果域名为test.baidubaidu.com,转发到192.168.50.133:80,然后再进行转发,注意,此处未进行测试,貌似是这么写的,$hostname为nginx变量,可以获取域名		
		if($hostname = 'test.baidubaidu.com' ){
		  proxy_pass http://192.168.50.133:80;
		}
				
		#proxy_redirect          off;
		#非80端口使用,目的是将代理服务器收到的用户的信息传到真实服务器上,我也不是很理解
		proxy_set_header        Host $host;
		proxy_set_header        X-Real-IP $remote_addr;
		proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
		client_max_body_size    10m;
		client_body_buffer_size 128k;
		proxy_connect_timeout   300;
		proxy_send_timeout      300;
		proxy_read_timeout      300;
		proxy_buffer_size       4k;
		proxy_buffers           4 32k;
		proxy_busy_buffers_size 64k;
		proxy_temp_file_write_size 64k;
		add_header Access-Control-Allow-Origin *;
            }

........

 以上即nginx反向代理与负载均衡介绍,经过此次学习,发现nginx确实是博大精深,一个配置文件搞得我不要不要的。。。

二、session共享问题:

由于nginx是随机分配请求,假设一个用户登录时访问网站登录时被分配到192.168.50.137:8080上,然后进行了登录操作,此时该服务器上就会有该用户登录的session信息,然后登陆后重定向到网站首页或个人中心时,此时如果被分配到192.168.50.139:8080上,那么这台服务器上没有该用户session信息,于是又会变成未登录状态,所以由于nginx的负载均衡会导致session共享的问题。

解决方法:

1.nginx提供了ip_hash策略,可以保持用户ip进行hash值计算固定分配到某台服务器上,然后只要是该ip则会保持分配到该服务器上,保证用户访问的是同一台服务器,那么session问题就不存在了。这也是解决session共享的一种方式,也称为黏性session。但是假设一台tomcat服务器挂了的话,那么session也会丢失。所以比较好的方案是抽取session。

2.session存在memcache或者redis中,以这种方式来同步session,把session抽取出来,放到内存级数据库里面,解决了session共享问题,同时读取速度也是非常之快。

本例中:

Redis解决session共享:

在redis服务器192.168.50.140上搭建redis,redis默认端口为6379

Redis搭建:

redis依赖gcc,先安装:

yum install -y gcc-c++

下载redis,我使用的是redis-3.2.1.tar.gz,上传至linux /usr/local/redis-src/中,解压

进入解压后目录redis-3.2.1,执行make命令进行编译

安装到目录/usr/local/redis

执行:

make PREFIX=/usr/local/redis install

安装完成之后将redis配置文件拷贝到安装目录下,redis.conf是redis的配置文件,redis.conf在redis源码目录,port默认6379。

执行命令:

cp /usr/local/redis-src/redis-3.2.1/redis.conf /usr/local/redis/

在redis安装目录启动和关闭redis:

启动:

./bin/redis-server ./redis.conf 

这种启动方式叫做前端启动,必须保持在当前窗口,如果ctrl + c 退出,那么redis也就退出了,不建议使用

那么后端启动:

首先修改redis.conf中daemonize的值,打开可以看到默认是no,修改为daemonize yes,启动即可。也可以在该配置文件中修改redis默认端口6379为其他值。

关闭redis:

 ./bin/redis-cli shutdown 

 至此,redis服务器搭建完成。

 tomcat与redis集成实现session共享:

环境为tomcat7 + jdk1.6的话:

在所有需要共享session的服务器的tomcat中目录下:

lib目录中添加以下三个jar包,注意版本最好一致,不然极容易出现错误,下边的测试是可用的:

conf目录中content.xml中加入:配置redis服务

<Valve className='com.radiadesign.catalina.session.RedisSessionHandlerValve'/>  
<Manager className='com.radiadesign.catalina.session.RedisSessionManager'
host='192.168.50.140'
port='6379'
database='0'   
maxInactiveInterval='60' />

环境为tomcat7 + jdk1.7或1.8的话:

在所有需要共享session的服务器的tomcat中目录下:

lib目录中添加以下三个jar包,测试通过:

conf目录中content.xml中加入:配置redis服务

<Valve className='com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve' />        
<Manager className='com.orangefunction.tomcat.redissessions.RedisSessionManager' 
host='192.168.50.140'   
port='6379'   
database='0'               
maxInactiveInterval='60'/>

根据我这测试,是jkd1.8+tomcat7,在137和139两台tomcat中加入jar包且进行如上配置:

上传jar包

 修改content.xml

启动redis服务,重新启动所有tomcat,启动nginx,刷新nginx页面,两台tomcat页面可以看到sessionid值不变,关闭某台tomcat,nginx中sessionid不变,说明session是共享的。

问题:

有可能此时访问会报错,redis无法访问,这是由于redis的安全机制,默认只有127.0.0.1才能访问,在redis.conf中可以找到bind 127.0.0.1,你可以将此ip改为访问者ip,

如果有多个访问者,也可以把bind 127.0.0.1注释掉,然后在配置文件中找到protected-mode,修改protected-mode yes改为protected-mode no 关闭redis保护模式即可

详细可以参考这:http://www.cnblogs.com/liusxg/p/5712493.html

三、keepalived高可用:

架构图:

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5ELTf+2v/o16h/GvR/odkP8AdJ/4o/lI6miiirOMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigCrf2EWowJDMzqqSxygoQDlGDDr2yKjv9N+3nDXt1DEy7ZYoWULKvoSQSO4ypU89eBi9RSaTLjVnG1nsZM+hK+o/bra/urOXyFg2wLEVCKSQAHRsde3oPSraWTLcW8z3lzI0MbRkMwCyZx8zKAAWGOMY6mrdFCikU605JJvy6f5FW1sIrSe7mjZy11L5rhiMA7VXj2woqnB4etYZoWaaeWCAsbe2kKmOEkEHGBk8EgbicAnFa1FLlQKtUV7Pf8A4b8tDJtvD8FtPbMbq6mhtMm1t5GXy4eNoxhQxwpIG4nANSnS5RB5cWrX8R8x3MgZHY7jnb86EYHQccCtGijlQ3XqN3b/AC/y8/8AO5ltoNp/ZtvZQvNALaQSwzI+ZEfJJbLAgk7mzkHO40630aO2EWy6ut6ztcSvvANw5BB8zAAIxjgAAbR6VpUU+VXuL29RqzZVewik1OG/LP5sUTxKARtIYqTn3+UVWfRkmu0mnvbuaGOXzo7aRl8tXzkHIXccE5ALEDjjgY06KLISqzWz8v6+9medKV75bma7uZkjcyRW8jL5cb/3hgbjjJwGJAzwBgYZNokc0kkpvLsTGfz4ZN4Jt227SEBBAUjOQQRya06KXKhqvUWqf5f5f8P1uZQ0C1bT7q1llnme6fzZbh4AkZxja2QAAV2rjAx8o460g8P27Q3Czz3FxPOyO1zIVEilOUK7VAG08jjuc5ya1qKOVdh/WKv839f0l5eRmQ6Hbqt39qmmvZLuMQzSXG3JjAICAIFAHzN0GefpS6fo0djP573VzdzLEIUe4KkogOdo2qOpAyTknA5rSop8q3E69Rppvf8Ar+rWCiiimZBRRRQAVFc20F5bSW1zEssMi7XRxkEVLRQNNp3R5Jql7P8AD28urLTL6K60+6Rwts0o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CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArlvG3/ADLv/Ybtv/Zq6muW8bf8y7/2G7b/ANmqKnwP+uqOzAf7zH5/+kyOpoooqzjCiiigAooooAKKKKACiiigAooooAK5b4c/8iFpv/bX/wBGvXU1y3w5/wCRC03/ALa/+jXqH8a9H+h4Q/3Sf+KP5SOpoooqzjCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAjnmEEDylJHCjO2NSzH2AFZEfiIPoZ1E2ciSG4a2jty43M/mGNQSOBk9cZxz177dczaWCv4YuYL63uVH2ueUeUh81P37MrqMZJHDDAOfQ5wYk3fTt+p1UI03G811X3O//ANCDVbuRry1exjGoW4RvJSfKOr52tvKg44bPy5GOAeMy6dqU11d3dnd2yQXVtsZhHKZEZXB2kMVU/wsMEdqwYzfWEeqazbx313LMsMEP2qFvMbDMDIY0UEKN/3QoJCk98m/pM1vY2F5cIup3t0F864kls5I5J2A6IrKo7YCr0/UypPqb1aEFFuKvslbvpfroumvV76Mu3esfZdWsrAWkz/aZChmPyonyM3GeWPy9uB3PYvvL+4jvEs7G1S4uCnmP5kvlpGmcDLBWOSc4AHY9MVX1SOWfUdCljhkKpdM7/KfkBhcfN6ckD6ms/V9PtP7cuLrUtOlvrWe1SONUt2mxIpf+EA4JDcMcY55GaJOST9f0Ip06UuW66P5u9u66a2uti/f6xd210bS2sI5547b7TMGuNiqucbVO07iSD1AHHUVieMr+OXSfDeooreU+qWs6qwwcFWbB9DUcmmzBIF8QJqMwXTVgjNl5rsXOfNDmPkk4T73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5LubNFFFanAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//Z" />

上图画的不对称好难看,将就下吧

根据上边一路走来,已经是搭好了从nginx主到服务器的这条线的,那么同理,使用nginx备机192.168.50.135上再搭建nginx,也是代理192.168.137和139两台服务器。搞了一次之后也就简单了

在192.168.50.135上安装nginx,配置nginx配置即可,不再赘述,nginx备机配置如下:

配置和上边的是一样的,只不过监听的地方的ip了而已

........
upstream blank {
        #ip_hash;
        server 192.168.50.137:8080;
        server 192.168.50.139:8080;
}
	
    server {
        listen       80;
        server_name  192.168.50.135;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
		    proxy_pass http://blank;
            root   html;
            index  index.html index.htm;
        }

........

那么现在就是相当于有两套nginx了,代理的服务器是一样的,为什么要搞两套?

假设只有一台nginx的话,这个nginx服务器挂了。那怎么办?

所以需要一台备份nginx。

正常情况下,主nginx作为反向代理服务器即可,假设nginx服务器挂了的话,能够立即切换到备份机上,保证用户可以访问,然后运维人员把主nginx服务器故障修好之后,又能够自动切换到主nginx提供服务。通过keepalived来监测两台服务器,正常情况时,将nginx主服务器ip(192.168.50.133)绑定到keepalived定义的一个虚拟ip(我设置为192.168.50.88)上,通过这个虚拟IP可以访问nginx,然后备机(192.168.50.135)啥事不干,就是每隔一小段时间(设置为1秒)keepalived会告诉备机,你不用管,我还活着呢,如果突然主机死了,那么就会超过一秒备机没有收到主机或者的消息,那么备机马上接管主机,keeplived将虚拟ip绑定到备机身上,网站继续提供服务。

突然主机又复活了(运维人员排除故障了),那么备机又将收到主机的活着的消息,于是将管理权交回给主机,虚拟ip又绑到主机上,大概就是这么个过程,个人理解。

 先在两台nginx服务器(主备)上都装上keepalived:

 下载:这里使用rpm安装,是区分32,64位的,不要搞错了哦

keepalived-1.2.7-3.el6.x86_64.rpm

openssl-1.0.1e-30.el6_6.4.x86_64.rpm

要求必须是openssl-1.0.1e或以上才行、如果版本已经符合(因为安装nginx时已经安装openssl,使用yum安装应该是符合的)、不用再安装openssl,使用 rpm -q openssl 查看当前openssl版本,我这已经是1.0.1e 48的,所以就不安装了

将两个rpm安装包上传到两台nginx服务器,进入上传到的目录,运行以下命令安装:--nodeps是忽略依赖包,当然最好是把依赖包装上,去掉--nodeps可以看到错误,需要哪些依赖包

如果需要安装openssl

 rpm –Uvh --nodeps ./openssl-1.0.1e-30.el6_6.4.x86_64.rpm

 安装keepalived:

 rpm -Uvh --nodeps ./keepalived-1.2.7-3.el6.x86_64.rpm

安装完毕后再/etc/keepalived/目录下有个文件 keepalived.conf即是本台服务器keepalived的核心配置文件了:

重点:keepalived配置,配置文件上边部分按照下面的配置就行了,配置文件后面的内容可以不用管,还没有去研究其他部分

先配置主机192.168.50.133的keepalived,按下边进行配置

! Configuration File for keepalived

#这是全局配置
global_defs {
   #指定keepalived在发生切换时需要发送email到的对象,一行一个
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   #指定发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   #指定smtp服务器地址
   #smtp_server 192.168.200.1
   #指定smtp连接超时时间
   #smtp_connect_timeout 30
   #运行keepalived机器的一个标识
   router_id LVS_DEVEL
}

#主备配置
vrrp_instance VI_1 {
	#标示状态为MASTER 备份机为BACKUP
    state MASTER
	#设置keepalived实例绑定的服务器网卡,一般为eth0,linux使用ifconfig命令可查看当前服务器网卡标识名
    interface eth0
	#同一实例下(即同一组主备机下)virtual_router_id必须相同
    virtual_router_id 51
	#MASTER权重要高于BACKUP,MASTER为100则BACKUP最大为99
    priority 100
	#MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为1秒
    advert_int 1
	#设置认证
    authentication {
		#主从服务器验证方式,PASS为明文密码验证
        auth_type PASS
		#密码
        auth_pass 1111
    }
	#设置虚拟IP,与我们的主备机在同一网段下,最后一位随便给就是拉,可以设置多个,换行即可
    virtual_ipaddress {
        192.168.50.88
    }
}

备机192.168.50.135的keepalived配置:

备机配置注意的地方:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致

! Configuration File for keepalived

#这是全局配置
global_defs {
   #指定keepalived在发生切换时需要发送email到的对象,一行一个
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   #指定发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   #指定smtp服务器地址
   #smtp_server 192.168.200.1
   #指定smtp连接超时时间
   #smtp_connect_timeout 30
   #运行keepalived机器的一个标识
   router_id LVS_DEVEL
}

#主备配置
vrrp_instance VI_1 {
    #备机为BACKUP
    state BACKUP
    #备机网卡标识,一般都是eth0,先查询一下
    interface eth0
    #virtual_router_id必须与主机相同
    virtual_router_id 51
    #权重,备机必须比主机小
    priority 99
    #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为1秒
    advert_int 1
    #认证,与主机一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP,绑定的虚拟ip与主机一致
    virtual_ipaddress {
        192.168.50.135
    }
}

酱紫,keepalived就配置完成了。

keeplived启动关闭命令:

service keepalived start
service keepalived stop

启动两台nginx,启动主机keepalived,启动备机keepalived服务。

这时,nginx主机在提供服务,备机是闲着的,虚拟ip是192.168.50.88,在主机和备机上使用命令

ip addr

 可以发现:

主机:可以看到,192.168.50.133 带有虚拟ip192.168.50.88,在浏览器中输入192.168.50.88,即可访问到主nginx192.168.50.133.然后转发到tomcat服务器上

浏览器访问虚拟ip:192.168.50.88,效果如下

 

 备机:ip addr命令执行:可以看到,备机nginx没有绑定虚拟ip

 以上是初始状态下的情况,也是正常服务的情况。

现在测试高可用,假设主机nginx服务器挂了,模拟为关闭nginx主机或者将keepalived服务停止,那么主机上keepalived死了就没办法告诉备机自己活着,而备机超过1秒没有接收到主机给自己的消息,马上接管虚拟ip,同时在配置文件中配置切换主备机时发送邮件,此时开发团队收到邮件即知道主机挂了,马上去排除主机的故障。

将主机上的keepalived服务停止,service keepalived stop ,然后查看虚拟ip绑定情况,

主机挂了:可以看到虚拟ip就没有绑在主机上

备机情况:虚拟ip已经绑定到备机,此时主机虽然挂了,但是切换到备机上了(发现故障和切换的时间差最大也就是1秒),虚拟ip也绑到备机上了,访问虚拟ip,就会请求备机nginx然后转发到web服务器实现高可用。

 

 运维人员收到邮件后就去排除主机故障了,搞定之后(模拟为keepalived服务启动),这时主机告诉备机,我又活了,于是备机将管理权又交给主机(切换为主机nginx提供服务):

主机keepalived服务启动后,即吧主机维护好之后:可以看到,虚拟ip又自动绑到了主机上

 

 备机情况,主机活了之后,备机转交管理权,虚拟ip切换到主机上,备机不绑定虚拟ip,貌似启动keepalived服务之后并不能马上切回,应该是起服务需要点时间吧,但是不影响,这段时间还是备机绑定虚拟IP的

 这就是keepalived高可用的模拟。

注意问题:

主机挂了之后,主机nginx恢复时,一定要将nginx也启动,否则即使虚拟ip切换到了主机上,但是主机nginx没起那也是没法转发的。所以要把nginx启动要加在开机启动中。

四、Nginx服务开机自启动:

在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令:(vim命令不会的自己去学吧哈哈)

vi /etc/init.d/nginx

将如下内容搞到该文件中:注意红色部分修改成你的路径即可,nginxd值是启动nginx的nginx路径,nginx_config值是nginx配置文件nginx.conf路径,nginx_pid值是nginx.pid所在路径,如果按照我方法安装的话,是在nginx安装目录的logs里边的

#!/bin/bash
# nginx Startup script for the Nginx HTTP Server
# it is v.0.0.2 version.
# chkconfig: - 85 15
# description: Nginx is a high-performance web and proxy server.
#              It has a lot of features, but it's not for everyone.
# processname: nginx
# pidfile: /usr/local/nginx/logs/nginx.pid
# config: /usr/local/nginx/conf/nginx.conf
nginxd=/usr/local/nginx/sbin/nginx
nginx_config=/usr/local/nginx/conf/nginx.conf
nginx_pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0
prog='nginx'
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = 'no' ] && exit 0
[ -x $nginxd ] || exit 0
# Start nginx daemons functions.
start() {
if [ -e $nginx_pid ];then
   echo 'nginx already running....'
   exit 1
fi
   echo -n $'Starting $prog: '
   daemon $nginxd -c ${nginx_config}
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx
   return $RETVAL
}
# Stop nginx daemons functions.
stop() {
        echo -n $'Stopping $prog: '
        killproc $nginxd
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid
}
# reload nginx service functions.
reload() {
    echo -n $'Reloading $prog: '
    #kill -HUP `cat ${nginx_pid}`
    killproc $nginxd -HUP
    RETVAL=$?
    echo
}
# See how we were called.
case '$1' in
start)
        start
        ;;
stop)
        stop
        ;;
reload)
        reload
        ;;
restart)
        stop
        start
        ;;
status)
        status $prog
        RETVAL=$?
        ;;
*)
        echo $'Usage: $prog {start|stop|restart|reload|status|help}'
        exit 1
esac
exit $RETVAL

然后设置该文件的访问权限:执行以下命令,意为所有用户可访问

chmod a+x /etc/init.d/nginx

 最后将ngix加入到rc.local文件中,这样开机的时候nginx就默认启动了

 

vi /etc/rc.local

 

添加

 

/etc/init.d/nginx start 

 

 

保存并退出,下次重启就会生效,nginx的开机自启动。测试无误的。

 

 

四、解决nginx进程和keepalived不同时存在问题:

 

keepalived是通过检测keepalived进程是否存在判断服务器是否宕机,如果keepalived进程在,但是nginx进程不在了,那么keepalived是不会做主备切换。因为是nginx挂了,然后无法做代理,keepalived还在不会切换到备机。

所以一直检测nginx是否还在,如果不在,那么让keepalived也停止,同生共死。

注:只需要在主机上搞就行了,备机没必要检测nginx,因为基本是主机在服务。

解决:写个脚本来监控nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉。

注:keepalived不需要开机启动,假如开机自启的话,如果keepalived比nginx 更快启动的话,脚本检测会把keepalived停掉的,所以没必要,只需要nginx开机启动,启动主机后自行手动的把keepalived服务启动即可。

在主nginx上编写nginx进程检测脚本(check_nginx_dead.sh),在keepalived配置文件目录下创建脚本:

vi /etc/keepalived/check_nginx_dead.sh 

把下边这些内容搞到脚本文件中,内容如下:

#!/bin/bash
# 如果进程中没有nginx则将keepalived进程kill掉
A=`ps -C nginx --no-header |wc -l`      ## 查看是否有 nginx进程 把值赋给变量A 
if [ $A -eq 0 ];then                    ## 如果没有进程值得为 零
       service keepalived stop          ## 则结束 keepalived 进程
fi

给访问权限:不然不行哦,这里卡了我半小时

chmod a+x /etc/keepalived/check_nginx_dead.sh 

先测试一下脚本:

把nginx停了,此时keepalived还在运行,所以不会切换,虚拟ip无法访问到web服务器

然后执行脚本:

主机脚本检测nginx不在了,把keepalived停掉,从输出可以看到确实停止了,主机虚拟没有绑定虚拟ip

备机:成功绑定虚拟ip

 

所以,只需要让该脚本一直执行,即一直检测nginx进程是否在,如果没得了,那么直接停止主机keepalived,切换备机,保证能够访问web服务器。

按如下修改keepalived配置文件keepalived.conf,添加脚本定义检测:

只需要在正确的位置添加红色部分即可:那么脚本则是两秒执行一次,一旦发现主机nginx不在了,keepalived停止,切换备机

! Configuration File for keepalived

#这是全局配置
global_defs {
   #指定keepalived在发生切换时需要发送email到的对象,一行一个
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   #指定发件人
   notification_email_from Alexandre.Cassen@firewall.loc
   #指定smtp服务器地址
   #smtp_server 192.168.200.1
   #指定smtp连接超时时间
   #smtp_connect_timeout 30
   #运行keepalived机器的一个标识
   router_id LVS_DEVEL
}

vrrp_script check_nginx_dead {
    ##监控脚本路径
    script '/etc/keepalived/check_nginx_dead.sh'
    ##时间间隔,2秒
    interval 2
    ##权重
    weight 2                                        	 
}

#主备配置
vrrp_instance VI_1 {
    #标示状态为MASTER 备份机为BACKUP
    state MASTER
    #设置keepalived实例绑定的服务器网卡,一般为eth0,linux使用ifconfig命令可查看当前服务器网卡标识名
    interface eth0
    #同一实例下(即同一组主备机下)virtual_router_id必须相同
    virtual_router_id 51
    #MASTER权重要高于BACKUP,MASTER为100则BACKUP最大为99
    priority 100
    #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为1秒
    advert_int 1
    #设置认证
    authentication {
	#主从服务器验证方式,PASS为明文密码验证
        auth_type PASS
	#密码
        auth_pass 1111
    }
	
    track_script {
	#监控脚本
        check_nginx_dead      
    }
	
	#设置虚拟IP,与我们的主备机在同一网段下,最后一位随便给就是拉,可以设置多个,换行即可
    virtual_ipaddress {
        192.168.50.88
    }
}

保存后,重新启动主机keepalived服务即可。

测试:

回到负载均衡高可用的初始状态,保证主、备上的keepalived、nginx全部启动。

停止主nginx服务:

主机查看keepalived进程,发现没有,说明已经停止了,虚拟ip也没有绑在主机上

 备机:绑定虚拟ip,切换成功。

 

 测试通过,如果主机nginx挂了之后,keepalived也会随着挂掉,然后切换备机。

以上所有过程均是经过测试的,所以除去一些其他因素,例如人品,应该都是可以成功的。

好久没写博客了,这篇也是从头到尾搞了十个小时,累死宝宝了。收获也是很多的,只是停留在使用的层面上,没有深入。

Tag标签: Nginx反向代理   负载均衡   redis   session共享   keepalive  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规