Nginx实现IIS负载均衡

时间:2022-09-03 19:37:29

又是一年评教时

    今年我负责一所大学的评教任务,所使用的系统是一款三层开发的ASP.Net系统。前几年这所大学都是使用这款软件来支持评教工作的,以前的网站部署是这个样子的:使用一台性能比较好的服务器来发布网站和提供数据库服务。

Nginx实现IIS负载均衡

    很容易看出来,这不符合单一原则。最好是一台服务器只负责提供一个服务,这样子比较专业。前几年这种部署方式下系统偶尔也会出现卡的情况 。那么如何解决大数据量和高并发的情况呢?为什么一个人的活不能分给别人干呢?道理是一样的,我们用N多台普通服务器去支持软件的运行不就可以了。经过我查阅资料,初步发现了微软的Web Farm和俄罗斯的Nginx。不过了解到百度、腾讯等IT巨头们都在使用Nginx,我就选择使用 Nginx了。下面就开始Nginx之旅吧!


实战应用

    首先在A服务器上的IIS发布评教系统,发布地址为:192.168.21.104:8055。在B服务器上的IIS上发布同样的评教系统,发布地址为 :192.168.21.125:8056。然后在另外一台电脑上配置好Nginx后,运行Nginx,监听地址:192.168.21.88:8090。本次测试在Nginx中配置均衡规则为1:1

Nginx实现IIS负载均衡


    实际运行过程中,真是出乎意料。首先出错:IIS验证视图状态MAC失败,好吧,有问题及时解决,经查是由于Asp.Net自身安全上的设计,这个功能集成到IIS中了。好吧,查了半天没有看懂。。。不过其中一个现象很诡异:有时候不报出这个错误,有时候报这个错。差不多这样的比例也是1:1。后来通宵加班也没有解决这个问题,就在选择放弃的时候,无意间看了一眼IIS,头脑中闪现出一个解决方案。

Nginx实现IIS负载均衡

进入之后是这个样子的:

Nginx实现IIS负载均衡

    这里注意:每个IIS服务器的密钥必须是一样的,而且不能自动变化。我是这样操作的,先由一台IIS服务器生成固定的密钥,然后拷贝到其他IIS服务器上。

     好了,MAC的问题解决了,然后又开始出问题了,每次输入验证码时,明明我输入的是对的,就告诉我"验证码错误,请重新输入!"不行我抓狂了,你妹啊!然后诡异的事情继续发生着,一般的机会能正常进入,一般的机会不能进入。

    这说明首次相应给客户端浏览器登录界面的IIS服务器,下次登录请求如果Nginx还分配到这个IIS服务器,那么就能正常登录,否则,不能正常登录。

Nginx实现IIS负载均衡

      又经我查阅资料和源代码,发现其实是如果做成了服务器集群,那么session共享就是一个问题。而我遇到的这个问题正是典型的Session不能共享的问题。那么如何实现Session共享呢?其实实现Session共享有很多方法,因为我使用的是Sqlserver数据库,微软已经在Sqlserver为我们想到了Session共享的需求了。

    先执行微软已经为你写好的一个SQL脚本,创建存储Session的数据库。

Nginx实现IIS负载均衡

 修改刚才生成的数据库的一个存储过程,因为我只运行一个网站,所以需要这样修改。

Nginx实现IIS负载均衡

Nginx实现IIS负载均衡

开启ASP.Net Service,该服务默认为手动启动,所以最好改为自动启动。

Nginx实现IIS负载均衡

最后需要配置一下我们的网站,告诉我们的网站把Session存储在数据库的特定表中。在配置文件相应位置插入下面这句话:

Nginx实现IIS负载均衡

好了,这样我们伟大的负载均衡的实现就搞定了!一路走来都感觉累了,看看整体上系统是 如何运行的吧。

Nginx实现IIS负载均衡


收获总结


感恩每一个跟你合作的人,这次技术研究多亏了张晗同学的鼎力相助!

在任何场合都能发现让你学习提高的机会,做一个善于发现机会并且善于把握机会的人。