使用Nginx+Keepalived+iis+Memcached搭建高可用的集群服务
大致架构如上图所示
1、设置Windows服务端
公司使用好多IIS作为web服务,其中在session共享哪里浪费了好长时间。
刚开始打算使用Sqlserver数据库共享,后来发现IIS自带session共享。
如上图所示 在会话状态中 连接字符串使用另外一台服务器IIS服务的session即可,当然3台4台服务器也照样可以设置,个人理解为只要能围成一个圆它们就会互相共享,互相汇聚。设置方法,运行regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)
亲测有效
还有一个就是设置站点的时候,因为我们是一个iis上面有多个站点,平时使用就是下图这样的
新建一个站点,使用的是80端口,然后站点下面有好多的虚拟目录或者是应用程序(在此必须设置为应用程序),因为我们是在磁盘中新建一个目录然后在目录下面放了好多的站点,因为程序写的时候必须要在一级目录,所以只能转化为程序才能正常访问。
回到正题题,因为现在用nginx做负载均衡,所以就涉及到Nginx的后端检测模块,在此建议一个站点就是一个网站,站点多了可以使用不同的端口,且不可像以上那样,具体原因后面有详细介绍。
以上就是windows系统设置的过程。
2、开始搭建Linux服务
首先是设置Nginx 这里用到了Nginx的反向代理模块和后端server的健康状态检查模块
1)、搭建nginx,关闭防火墙,关闭selinux重启服务器
2)、因为需要用到后端检测模块是第三方模块,所以需要编译安装Nginx
使用的Nginx版本为nginx-1.14.0.tar.gz,第三方模块为nginx_upstream_check_module-master.zip
为什么使用nginx-1.14.0.tar.gz,因为第三方模块里面check_1.14.0+.patch只看到了1.14的(最高的),如果使用新版本的话 怕是不支持
3)、先给Nginx打补丁
因为我的已经打过了。所有会这样提示,而正常的提示是下图:
出现如图所示则表示打补丁成功
4)、编译Nginx
首先直接安装开发工具包组,后期编译的时候出错少
yum groupinstall Development-tools -y 这个等待时间较长
另外安装:yum -y install perl-devel perl-ExtUtils-Embed 这个包平时没用过,但是如果不安装的话 编译第三方模块的时候会报错,直接安装了吧
Nginx编译参数:
./configure --prefix=/usr/local/nginx1.14 --conf-path=/usr/local/nginx1.14/nginx.conf --error-log-path=/usr/local/nginx1.14/logs/error.log --http-log-path=/usr/local/nginx1.14/logs/access.log --with-http_stub_status_module --add-module=/home/nginx_upstream_check_module-master --with-http_gunzip_module --with-http_gzip_static_module --with-http_ssl_module --with-http_v2_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_auth_request_module --with-http_sub_module --with-http_perl_module --with-perl_modules_path=/usr/local/nginx1.14/modules/
以上是nginx编译参数,按照上面编译够了,具体不知道编译安装流程的可以百度或google下这里不再赘述
如果顺利通过的话 则会在/usr/local/下面看到ngnx1.14的文件夹了
如图所示
下面开始配置nginx,配置文件nginx.conf 建议先行备份nginx.conf.back
5)、配置nginx.conf
user www; 启动nginx的时候用的用户
worker_processes auto; 限制可支持auto,不用再写cpu个数了
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; 设置超时时间
gzip on;
upstream ERP { 这里定义了后端服务器 一共两台,但是这都是使用的80端口(默认),后面需要修改
ip_hash;
server 192.168.3.100;
server 192.168.0.229;
check interval=3000 rise=2 fall=5 timeout=1000 type=http; 这里就使用到了刚打的补丁了,后端健康状态检查,在此建议设置为
一秒一次成功一次则成功,失败一次则失败,对于要求比较高的,建议可以再缩小都行,这里是可一个坑,如果设置的时间过长的话,刷新的时候会刷出错误页面出来。因为本来已经停止的IIS在Nginx中还没有给剔除掉,所以Nginx还会在这个时间段内,把请求调度给后端已经停止的Server
”简单介绍下后端健康检查这个模块。这个模块nginx_upstream_check_module-master.zip应该是淘宝做的,淘宝的tengine默认就支持此模块,在其官网中有说明
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。“
参数的含义是:
interval:检查请求的间隔时间。
fall(fall_count):在fall_count失败检查后,服务器被标记为关闭。
rise(rise_count):在rise_count成功检查后,服务器被标记。
timeout:检查请求的超时。
default_down:指定后端服务器的初始状态,默认为关闭。
type:检查协议类型:
tcp:一个简单的TCP套接字连接并查看一个字节。
ssl_hello:发送客户端SSL hello数据包并接收服务器SSL hello数据包。
http:发送http请求数据包,接收并解析http响应,以诊断上游服务器是否处于活动状态。
mysql:连接到mysql服务器,接收问候响应以诊断上游服务器是否处于活动状态。
ajp:发送AJP Cping数据包,接收并解析AJP Cpong响应,以诊断上游服务器是否处于活动状态。
port:在后端服务器中指定检查端口。它可以与原始服务器端口不同。默认端口为0,表示与原始后端服务器相同。在tengine-1.4.0之后添加此选项。
check_http_send "GET / HTTP/1.0\r\n\r\n";
而我没有使用tengine,因为我弄了半个多小时就配置一个模块命令,总是报错,所以不得已只有开头那里给nginx打补丁了....
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
location /nginxcon {
stub_status;
}
#access_log logs/host.access.log main;
location ^~ /XQZC {
proxy_pass http://ERP/XQZC;
}
location ^~ /BJ_CS {
proxy_pass http://ERP/BJ_CS;
}
location /status {
check_status;
access_log off;
# deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
还有两项值得说明的
如下图所示:
当然它会一直在检查的
所以上面设置的 check interval=1000 rise=1 fall=1 timeout=1000 type=http; 时间间隔完全没有问题呢
在此以上就是Nginx的完整配置,但是其中有一个非常大的问题,就是在检查后端服务器的时候,因为这里只设置了80端口的http的健康检查,而我们在一个网站里面又添加了好多的应用程序
那么问题来了:如果我们修改其中一个应用程序的时候(一下简称小网站),例如更新,势必要停止此iis才能替换其中的一个小网站,如果停止了IIS则所有的session都会转发到另外一台服务器,而我们只是维护其中的一个小网站,加入说有10个小网站,那么剩下的9个是完全没有问题的
这样就造成了资源浪费
所有要修改为,一个小网站建立一个站点,使用不同的款口号
那么这样的话 在维护一个小网站的时候只需要停止其中一个而不影响其他的,在定义Upstream的时候必须要按照端口号分开定义即可,那就变成下面这个样子的
如图所示,这样就好多了,它也只检测一个就好,这样就成了下图所示的
那个不能用 咱就停止那个................... 如此最好啊 呵呵...............
最后配置keepalived
这个就比较简单了,直接yum安装keepalived
layer 3层检测:进行ICMP ping包检测,确认主机是否存活,如果异常,则会该主机从服务器集群中剔除;
layer 4层检测:进行端口检测,例如80、3306等,端口不通时,将服务器从集群中剔除;
layer 7层检测:这个就是基于应用的了,如http返回码是否为200,确认主机是否正常。
在此我们使用第三个..
先说一下遇到的坑吧
1)、
此处刚开始一直直接使用的命令,网上所有的教程都让直接使用命令,
但是新版本的在此配置段好像不支持直接使用命令检查了,也不知道是我设置的不对 还是真的不能了,所以在此使用脚本检查,脚本内容还待优化,暂且内容如下:
keepalived健康检查降权规则,默认检查结果失败,失败就会降权,当然我们也可以修改配置文件为成功则降权的,暂且使用默认。如下图:
如果两个服务器都有vip的话 请继续清空防火墙关闭selinux 就是他们引起的
备用keepalived直接复制过去主配置文件,修改 state和prioriy两项即可
写的有点着急了,不好的地方欢迎大家留言指正,谢谢!!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。