使用Nginx搭建高性能网站
一般在访问量比较少的情况下,用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服务技术的冰山一角,学无止境。