阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx+IIS实现负载均衡

145次阅读
没有评论

共计 5399 个字符,预计需要花费 14 分钟才能阅读完成。

最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存 Redis 等。本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为 Load Balance,其意思就是分摊到多个操作单元上进行执行,例如 Web 服务器、FTP 服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

我的解释:一项任务交由一个开发人员处理总会有上限处理能力,这时可以考虑增加开发人员来共同处理这项任务,多人处理同一项任务时就会涉及到调度问题,即任务分配,这和多线程理念是一致的。nginx 在这里的角色相当于任务分配者。

1、为什么 Niginx 在 Windows 下性能不好
因为 Nginx 的高性能是依赖 Linux 的 Epoll,而 windows 没有 Epoll 而是使用了其他,因此 Nginx 在 windows 下性能不太好。

2、NLB 和 Nginx 的区别
NLB 和 LVS 是同一种级别的,工作在低层协议;Nginx 工作在高层协议;两者之间无论效率还是作用都不是同一种级别的。

3、NLB 与 IIS
NLB 是工作在低层协议,因此跟 IIS 没有太大关联。正确的应该说,NLB 可以给所有使用上层协议的软件负载均衡功能。而 IIS 本身自己页游负载均衡模块

阅读目录

  • Nginx 安装
  • 站点搭建及配置 
  • 问题分析
  • 总结

nginx 安装

    Nginx是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行。由俄罗斯的程序设计师 Igor Sysoev 所开发,供俄国大型的入口网站及搜索引擎 Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、新浪、网易、腾讯等。

最新版本的 nginx 版本为 1.9.3,我这下载的是 Windows 版本的,一般实际场景都是安装在 Linux 系统下的,由于 Linux 系统目前正在摸索中这里就不介绍。官方下载地址:nginx-1.9.3.zip 本地下载地址见文末。下载完成之后解压运行 nginx.exe 就启动了 nginx 了,启动后会在进程里面看到 nginx。

Nginx+IIS 实现负载均衡Nginx+IIS 实现负载均衡

  要实现负载均衡需要修改 conf/nginx.conf 的配置信息,修改配置信息之后重新启动 nginx 服务,可以通过 nginx -s reload 指令实现。这里我们使用 Ants 提供的一个批处理来操作。

Nginx+IIS 实现负载均衡

将 nginx.bat 文件放到 nginx.exe 相同文件夹下,直接运行就行了。文章结尾会提供本文用到的所有文件。

 Nginx+IIS 实现负载均衡

站点搭建及配置

1. 搭建两个 iis 站点

 站点下只有一个简单的 index 页面,用来输出当前服务器信息。由于我没有两台机器,所以将两个站点都部署到本机了,分别绑定了 8082 和 9000 两个端口。

protected void Page_Load(object sender, EventArgs e)
        {Label0.Text = "请求开始时间:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            Label1.Text = "服务器名称:" + Server.MachineName;//服务器名称  
            Label2.Text = "服务器 IP 地址:" + Request.ServerVariables["LOCAL_ADDR"];//服务器 IP 地址  
            Label3.Text = "HTTP 访问端口:" + Request.ServerVariables["SERVER_PORT"];//HTTP 访问端口 "
            Label4.Text = ".NET 解释引擎版本:" + ".NET CLR" + Environment.Version.Major + "." + Environment.Version.Minor + "." + Environment.Version.Build + "." + Environment.Version.Revision;//.NET 解释引擎版本  
            Label5.Text = "服务器操作系统版本:" + Environment.OSVersion.ToString();//服务器操作系统版本  
            Label6.Text = "服务器 IIS 版本:" + Request.ServerVariables["SERVER_SOFTWARE"];//服务器 IIS 版本  
            Label7.Text = "服务器域名:" + Request.ServerVariables["SERVER_NAME"];//服务器域名  
            Label8.Text = "虚拟目录的绝对路径:" + Request.ServerVariables["APPL_RHYSICAL_PATH"];//虚拟目录的绝对路径  
            Label9.Text = "执行文件的绝对路径:" + Request.ServerVariables["PATH_TRANSLATED"];//执行文件的绝对路径  
            Label10.Text = "虚拟目录 Session 总数:" + Session.Contents.Count.ToString();//虚拟目录 Session 总数  
            Label11.Text = "虚拟目录 Application 总数:" + Application.Contents.Count.ToString();//虚拟目录 Application 总数  
            Label12.Text = "域名主机:" + Request.ServerVariables["HTTP_HOST"];//域名主机  
            Label13.Text = "服务器区域语言:" + Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"];//服务器区域语言  
            Label14.Text = "用户信息:" + Request.ServerVariables["HTTP_USER_AGENT"];
            Label14.Text = "CPU 个数:" + Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS");//CPU 个数  
            Label15.Text = "CPU 类型:" + Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER");//CPU 类型  
            Label16.Text = "请求来源地址:" + Request.Headers["X-Real-IP"];
        }

2. 修改 nginx 配置信息

  修改 nginx 监听端口,修改 http server 下的 listen 节点值,由于本机 80 端口已经被占用,我改为监听 8083 端口。

  listen      8083;

  在 http 节点下添加 upstream(服务器集群),server 设置的是集群服务器的信息,我这里搭建了两个站点,配置了两条信息。

    #服务器集群名称为 Jq_one
    upstream Jq_one {
  server  127.0.0.1:9000; 
  server  127.0.0.1:8082;
    }

 在 http 节点下找到 location 节点修改

  location / {
            root  html;
            index  index.aspx index.html index.htm; #修改主页为 index.aspx
    #其中 jq_one 对应着 upstream 设置的集群名称
    proxy_pass        http://Jq_one; 
    #设置主机头和客户端真实地址,以便服务器获取客户端真实 IP
    proxy_set_header  Host            $host;
    proxy_set_header  X-Real-IP        $remote_addr;
    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
 }

修改完成配置文件以后记得重启 nginx 服务,最终完整配置文件信息如下

Nginx+IIS 实现负载均衡

3. 运行结果

  访问 http://127.0.0.1:8083/index.aspx,多访问几次,着重关注标红部分。

Nginx+IIS 实现负载均衡Nginx+IIS 实现负载均衡

可以看到,我们的请求被分发到了 8082 站点和 9000 站点,并且第一次是 8082 站点第二次 9000。出现这样的结果证明我们负载均衡搭建成功了。尝试关闭其中的 9000 站点,然后刷新页面发现输出的 http 端口一直是 8082,也就是说其中一个站点挂了,只要还有一个站点是好的,我们的还是可以服务。

问题分析

  虽然我们搭建好了负载均衡站点,但是还存在以下问题。

  1. 如果站点使用了 session,请求平均分配到两个站点,那么必然存在 session 共享问题,该如何解决?

  • 使用数据库保存 session 信息
  • 使用 nginx 将同一 ip 的请求分配到固定服务器,修改如下。ip_hash 会计算 ip 对应 hash 值,然后分配到固定服务器

upstream Jq_one{
  server 127.0.0.1:8082 ;
  server 127.0.0.1:9000 ;
  ip_hash;
}

  • 搭建一台 Redis 服务器,对 session 的读取都从该 Redis 服务器上读取。后面的文章将介绍分布式缓存 Redis 的使用

  2. 管理员更新站点文件,该怎么操作,现在还只有两台服务器,可以手工将文件更新到两台服务器,如果是 10 台呢,那么手工操作必然是不可行的

  • 多服务器站点更新可以使用 GoodSync 文件同步程序,会自动检测文件的修改新增,然后同步到其它服务器上。在 linux 下可以使用 rsync

  3. 站点中的文件上传功能会将文件分配到不同的服务器,文件共享问题如何解决。

  • 使用文件服务器将所有文件存储到该服务器上,文件操作读取写入都在该服务器上。这里同样会存在一个问题,文件服务器存在读写上限。

  4. 负载的服务器配置不一样,有的高有的低可不可以让配置高的服务器处理请求多一些

  • 这里讲一下,负载均衡有好几种算法  轮转法,散列法,最少连接法,最低缺失法,最快响应法,加权法。我们这里可以使用加权法来分配请求。

    upstream Jq_one{
  server 127.0.0.1:8082 weight=4;
  server 127.0.0.1:9000 weight=1;
}

     通过 weight 设置每台服务器分配请求站的权重,值越高分配的越多。

 5. 由于请求是经过 nginx 转发过来的,可以在代码里面获取到用户请求的实际 ip 地址吗?

  • 答案是肯定的,在 localtion 节点设置如下请求头信息

    #设置主机头和客户端真实地址,以便服务器获取客户端真实 IP
    proxy_set_header  Host            $host;
    proxy_set_header  X-Real-IP        $remote_addr;
    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

    代码里面通过 Request.Headers[X-Real-IP],就能获取到真实 ip

 6.nginx 实现静态文件 (image,js,css) 缓存

  • 在 server 节点下添加新的 localtion
  •  #静态资源缓存设置
     location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
            {
                expires 30d;
                root /nginx-1.9.3/html;#root:  #静态文件存在地址,这里设置在 /nginx-1.9.3/html 下
                break;
            }
     

   这是 index 页面的代码 <li><img src=”https://www.linuxidc.com/images/1.jpg”/></li>

Nginx+IIS 实现负载均衡Nginx+IIS 实现负载均衡

总结

通过 nginx 我们实现了一个简单的负载均衡,实际情况比这复杂很多。比如 nginx 服务器挂了,那我们的站点就直接挂了,正确的通过 keepalived 组件来搭建多台 nginx 服务提供服务。本篇只做为分布式系统的开篇,后续会陆续推出 Redis 缓存,数据库实现分布式架构的文章,敬请期待!希望能够得到博客园分布式大牛的指导。

      本篇文章用到的资源打包下载地址:nginx_iis 

百度网盘下载http://pan.baidu.com/s/1c0bLxN6

或者

—————————————— 分割线 ——————————————

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2015 年资料 / 8 月 /17 日 /Nginx+IIS 实现负载均衡 /

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

—————————————— 分割线 ——————————————

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-08/121790.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计5399字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中