.NET

使用Nginx搭建高性能网站

2017-07-01  本文已影响175人  凌雲木

        一般在访问量比较少的情况下,用IIS部署一个Web网站,什么问题也没有。当大量同时访问也就是用户高并发访问的时候,网站响应就会很慢,客户的体验就会很差。

如何解决高并发问题

为了解决这个高并发的问题,我们就需要进行负载均衡。我们可以在架构上通过硬件和软件来解决负载均衡,硬件层面可以使用负载均衡器,一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵,另一方面,我们要从软件层面进行负载均衡,常用LVS,Ngnix等负载均衡服务器。

  使用Nginx搭建负载均衡 

nginx负载均衡的几种方式:

Nginx是如何实现负载均衡的,Nginx的upstream目前支持以下几种方式的分配(下面以两个后台服务器A,B,为列) 

1、轮询(默认):ABABAB访问模式

每个请求按时间顺序逐一平均分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight:假如A权重为1,B权重为2,访问模式为ABBABBABB

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

2、ip_hash: 用户1访问到A,用户2访问到B模式

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

Nginx 配置(以轮询方式为例)

upstream asdf {

#两台web服务

`server 127.0.0.1:8011;#第一台`

````server 127.0.0.1:8012;#第一台```

}

error_page 404 https://www.baidu.com; #错误页

#gzip  on;

server {

listen      8010;#Nginx默认监听8010端口

server_name  127.0.0.1;

#charset koi8-r;

#access_log  logs/host.access.log  main;

location  ~*^.+$ {      #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。

#root path;  #根目录

#index vv.txt;  #设置默认页

proxy_pass  http://asdf;  #请求转向asdf定义的服务器列表

#设置主机头和客户端真实地址,以便服务器获取客户端真实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服务

使用IIS搭建两个web网站

实现的负载均衡效果如下图:

当用户第一次访问时,用户通过反向代理服务器,会访问到127.0.0.1:8011 Web服务器;

当用户第二次访问时,用户通过反向代理服务器,会访问到127.0.0.1:8012 Web服务器;

当用户第三次访问时,用户通过反向代理服务器,会访问到127.0.0.1:8011 Web服务器;以后以此类推(当然这两个服务器展示的内容都一样)

页面主要代码

protected void Page_Load(object sender, EventArgs e)   

     {        

    port = Request.Url.Port;          

  if (port == 8011)         

   {                Response.Write($"第一个页面,端口号:{port}");            }        

    else if (port == 8012)          

  {                Response.Write($"第二个页面,端口号:{port}");            }       

    else        

    {              

  Response.Write($"页面端口号:{port}");     

       }      

      Response.Write($"请求开始时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");            

Response.Write($"服务器名称:{Server.MachineName }");            

 Response.Write($"服务器IP地址{Request.ServerVariables["LOCAL_ADDR"] }");          

  Response.Write($"HTTP访问端口:{Request.ServerVariables["SERVER_PORT"]}");          

  Response.Write(".NET解释引擎版本:" + ".NET CLR" + Environment.Version.Major + "." + Environment.Version.Minor + "quot;." + Environment.Version.Build + "." + Environment.Version.Revision + ""); //.NET解释引擎版本           

   Response.Write("服务器操作系统版本:" + Environment.OSVersion.ToString() + "");        

    Response.Write("服务器IIS版本:" + Request.ServerVariables["SERVER_SOFTWARE"] + "");        

    Response.Write("服务器域名:" + Request.ServerVariables["SERVER_NAME"] + "");          

  Response.Write("虚拟目录的绝对路径:" + Request.ServerVariables["APPL_RHYSICAL_PATH"] + "");          

  Response.Write("执行文件的绝对路径:" + Request.ServerVariables["PATH_TRANSLATED"] + "");          

  Response.Write("虚拟目录Session总数:" + Session.Contents.Count.ToString() + "");           

 Response.Write("虚拟目录Application总数:" + Application.Contents.Count.ToString() + "");          

  Response.Write("域名主机:" + Request.ServerVariables["HTTP_HOST"] + "");          

  Response.Write("服务器区域语言:" + Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"] + "");          

  Response.Write("用户信息:" + Request.ServerVariables["HTTP_USER_AGENT"] + "");        

    Response.Write("CPU个数:" + Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS") + "");        

    Response.Write("CPU类型:" + Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER") + "");        

    Response.Write("请求来源地址:" + Request.Headers["X-Real-IP"] + "");        }

运行结果:

第一次用电脑访问Nginx服务器127.0.0.1:8010如下图

马上用手机访问Nginx服务器  手机不是本地访问了,需要把127.0.0.1:8010换成Nginx的IP地址如下图

可见第一次用电脑访问是通过Nginx服务器访问的是127.0.0.1:8011服务器。第二次用手机访问是通过Nginx服务器访问的是127.0.0.1:8012服务器,这样就实现了轮询方式的的负载均衡。

备注  到这里只显示Nginx服务技术的冰山一角,学无止境。

上一篇 下一篇

猜你喜欢

热点阅读