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

Nginx+IIS实现负载均衡

420次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7984780
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手!

还在找免费服务器?无广告免费主机,新手也能轻松上手! 前言 对于个人开发者、建站新手或是想搭建测试站点的从业者...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...