使用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" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#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; # allow SOME.IP.ADD.RESS; # 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两项即可
写的有点着急了,不好的地方欢迎大家留言指正,谢谢!!