nginx+iis实现简单的负载均衡_nginx

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

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

阅读目录

nginx安装
站点搭建及配置
问题分析
总结
一、nginx安装

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

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

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

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

 

二、站点搭建及配置

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服务,最终完整配置文件信息如下

3.运行结果

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

可以看到,我们的请求被分发到了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="/images/1.jpg"/></li>

总结

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索iis
, nginx
负载均衡
nginx iis 负载均衡、nginx负载均衡配置、nginx 负载均衡、nginx tomcat负载均衡、nginx tcp 负载均衡,以便于您获取更多的相关知识。

时间: 2024-09-30 11:52:38

nginx+iis实现简单的负载均衡_nginx的相关文章

Nginx geoip模块实现地区性负载均衡_nginx

相信做过awstats的都用过开源的geoip.dat  ip数据库,刚好nginx wiki上有geoip 模块,这样就可以实现地区性的负载均衡,但是maxmind 的ip数据库对中国的支持不算太好,不过现在也不错了~ 参考文章:http://wiki.nginx.org/NginxHttpGeoIPModule   说下我的环境,我有一台美国linux 服务器,一台美国的windows 2003 ,一台本的XP.机器,其他测试用户都是,QQ群里的朋友,好了开始测试 linux : 75.12

Docker和Nginx实现一个简单的负载均衡

当前使用centos7系统 1.安装nginx 参考http://blog.whsir.com/post-2078.html 2.docker拉取nginx镜像 docker pull nginx 3.创建两个目录 mkdir -p /data/demo1mkdir -p /data/demo2 分别在两个目录下创建两个index.html,demo1下index.html内容为this is demo1,demo2下index.html内容为this is demo24.通过docker运行两

Nginx+Keepalived实现Web服务器负载均衡

说明: 操作系统:CentOS 5.X 64位 Web服务器:192.168.21.127.192.168.21.128 站点:bbs.111cn.net和sns.111cn.net部署在两台Web服务器上 实现目的: 增加两台服务器(主主模式),通过Nginx+Keepalived实现Web服务器负载均衡 架构规划: Nginx服务器:192.168.21.129.192.168.21.130 虚拟服务器(VIP):192.168.21.252.192.168.21.253 部署完成之后: 1

Linux环境下Nginx 通过upstream如何配置负载均衡以及实现

一,服务器准备情况,四台: 1,前段服务器: 192.168.1.112  hosts定向测试域名nginx.21yunwei.com 192.168.1.113 备用前端服务器. 后端web服务器池web_pools: 192.168.1.102 192.168.1.103 2,环境:统一centos 6 前端服务器安装nginx.环境安装这里就不写了,可以参考文章<linux下如何安装nginx环境配置>部署nginx环境. 后端web服务器 池统一安装apache:yum install

使用Nginx反向代理实现简单的负载均衡

Nginx反向代理的原理优点: 反向代理可以简单的理解为:代理服务器来接收internet上的服务器请求,然后将请求转发给内部的服务器上,然后将结果返回给internet上请求的客户端,所以代理服务器对外表现出来的只是一台服务器.反向代理服务器也称为Web服务器加速,针对web服务器提供加速功能.他作为代理服务器,并不针对浏览器用户,而是针对一台或者多台特定的web服务器.可以缓存web的页面,降低web服务器的访问量,从而来降低web服务器的负载,实施反向代理,只要将反向代理设备放置在一台或多

Debian下搭建Nginx和Tomcat服务器实现负载均衡的方案_nginx

负载均衡的基本概念 负载平衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用.最大化吞吐率.最小化响应时间.同时避免过载的目的. 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性.负载平衡服务通常是由专用软体和硬件来完成. 负载平衡最重要的一个应用是利用多台服务器提供单一服务,这种方案有时也称之为服务器农场.通常,负载平衡主要应用于Web网站,大型的Internet

windows安装nginx部署步骤图解(反向代理与负载均衡)_nginx

一.下载安装Nginx(本文环境为windows xp 32bit环境) 解压nginx-1.0.11.zip,进入nginx-1.0.11,在命令行中执行命令让Nginx启动.具体操作如下图: 测试是否安装成功,输入地址:http://localhost:8090 浏览器显示结果如下图: OK,Nginx部署成功了. 二.关于Nginx的反向代理配置. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器

Nginx与Tomcat实现动静态分离和负载均衡_nginx

本文介绍了Nginx与Tomcat实现动静态分离和负载均衡,所谓动静分离就是通过nginx(或apache等)来处理用户端请求的图片.html等静态的文件,tomcat(或weblogic)处理jsp.do等动态文件,从而达到动静页面访问时通过不同的容器来处理. 一.Nginx简介: Nginx一个高性能的HTTP和反向代理服务器, 具有很高的稳定性和支持热部署.模块扩展也很容易.当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器,N

Nginx实现网站多机负载均衡配置方法

Nginx的高并发特性就不用多说了,单机静态并发能承受大压力测试,但并不代表在搭载后端的情况下依然保持高并发,因为后端动态处理才是并发瓶颈.nginx作者初衷是为邮件提供多机反向代理,而这特性也正好能用在其他网络服务上,因为这是nginx原生基础服务,比apache等其他服务器需提供外部插件的实现形式显得更快捷高效. 传统负载均衡的方法是在后端服务器前设置一台前端服务器负责总调度,这是最简单的方式,当前端搭载的是nginx负责单点均衡,后端服务可以是任意web服务,譬如apache,tomcat