当前位置: 首页 > news >正文

使用Nginx负载均衡搭建高性能.NETweb应用程序(转)

一、遇到的问题

       当我们用IIS服务器部署了一个web应用以后,当很多用户高并发访问的时候,客户端响应就会很慢,客户的体验就会很差,由于IIS接受到客户端请求的时候,就会创建一个线程,当线程达到几千个时候,这些线程就会占用较大内存,同时由于这些线程要进行切换,所以CPU占用也会比较高,这样IIS性能就很难提高了。那么如何解决这个问题呢?

 

二、如何解决高并发问题

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

 

三、Ngnix是什么?

        Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器,那么什么是反向代理服务器呢?在服务器段接受客户端的请求,然后把请求分发给具体的服务器处理,然后再将其服务器的响应反馈结果发给客户端,例如当用户在地址栏输入:www.baidu.com,这时候浏览器会构建一个请求报文请求发送给Nginx服务器,然后Nginx把所有的请求发送给我们的IIS服务器,IIS服务器处理后把结果发送给Nginx,Nginx服务器将最后的结果发送给客户端浏览器。代理服务器相当于网络的中间实体,代理服务器既是web服务器,又是web客户端。因此引出一个名词:正向代理服务器,正向代理服务器是为了从原始服务器获取内容,客户端向代理服务器发送一个请求,并指定原始服务器的IP和端口,然后代理服务器向原始服务器专家请求并获取内容,并将结果反馈给客户端,因此客户端需要进行设置才能使用正向代理。下图所示。

四、Nginx 优点:
        跨平台:Linux,Unix,也有windows的移植版本,当然在Linux上部署肯定是最好的,但是我们可以在windows上使用其移植版本。
        配置异常简单
   非阻塞,高并发连接,官方测试能够支持5万并发,
  事件驱动:通信机制采用epoll,当事件没有转备好时,就放入队列中,准备好了才去处理。
       master/worker结构:一个master进程来管理多个worker进程,和Arcig的SOM,SOC结构类似,当Ngnix启动,就会根据我们配置的信息,一般我设置与机器cpu核一致,启动其woker进程,每个worker之间是对等关系,即他们都能够处理客户端来发的请求,所以这就涉及到一个锁问题,同时我们可以用不用暂停系统,直接修改了配置文件后,可以重启Nginx,原因是由于master接受到命令 reload之后,就会重新加载配置文件,然后启动新的进程,并告诉所有的老的worker,处理完所有的请求后就退出。此外,我们可以体会下这种模型的有点,就是当一个woker出现问题退出了,不会造成系统无法使用,其他的还是可以正常使用。
        内存消耗少:处理大并发请求内存消耗少,在3wan并发连接下,10个进程才消耗150M内存。
       内置监控检查功能:当后台某个web服务器宕机(挂了)时候,不影响前端访问。它是通过后台服务器反馈的状态码(500,404之类的来判断的)
       节省带宽:支持GZIP压缩。

       稳定性高

 

五、Ngnix如何处理一个请求?
      当Nginx启动时,先会解析我们配置的文件,得到监听的端口和Ip地址,master进程就会初始化这个建库的socket通信,然后再fork,master调用fork函数创建一个新的进程,由fork创建的新进程被称为子进程,然后这些worker会竞争去接受的新的连接,此时客户端就可以向Nginx发起连接了,当客户端与Nginx进行三次握手,与Nginx建立了一个连接后,此时一个子进程worker会连接成功,然后得到这个建立好的连接socket,然后Nginx对连接的封装,读写处理,最后,Nginx主动关闭连接。
      Nginx在实现时,是通过一个连接池来管理的,每个worker进程都有一个独立的连接池,连接池的大小是worker_connections。这里的连接池里面保存的其实不是真实的连接,它只是一个worker_connections大小的一个ngx_connection_t结构的数组。并且,nginx会通过一个链表free_connections来保存所有的空闲ngx_connection_t,每次获取一个连接时,就从空闲连接链表中获取一个,用完后,再放回空闲连接链表里面。 这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。由于反向服务器要占用2个连接,最大并发数量应该是worker_connections * worker_processes/2。

使用Nginx负载均衡搭建高性能.NETweb应用程序二

标签: 负载均衡Nginx集群部署ASP.NET
 分类:
ASP.NET(19)   软件部署维护(3) 

在文章《使用Nginx负载均衡搭建高性能.NETweb应用程序一》中,让我们对Nginx有了一个初步认识,下面我们将在windows平台下面使用Nginx演示集群部署我们的web应用。

 

一、下载Nginx部署包

到Nginx官网去下载一个windows平台下面的Nginx部署包,目前我下载的是一个nginx-1.6.2版本的。

 

二、命令启动服务
启动:start nginx.exe
停止:nginx -s stop

重新加载: nginx -s reload

 

三、实例搭建
首选:我们要在我们的iis上面把我们做好的web应用部署上去,部署到不同的机器上面,设置好对应的ip和端口号,因为我在本机模拟出效果,所以我就在本机的iis上面部署了2个web应用,第一个web应用部署在localhost:8011端口,第二个应用部署为localhost:8012端口,同时为了看到演示效果,我们把里面的WebForm1.aspx页面做了一个标记,里面标记为:第几个web应用程序的页面,实际我们部署系统,不需要这样做,就是把我们的一个web应用部署到不同机器上面的服务器上,下面所示。

web应用1地址:http://localhost:8011/WebForm1.aspx
web应用2地址:http://localhost:8012/WebForm1.aspx

(1)启动Nginx服务

(2)修改Nginx配置项,具体配置说明,我们在参数设置部门说明,然后验证服务是否正常启动。

(3)访问地址http://localhost:8010/WebForm1.aspx观察结果

 

(4)这样我们就可以模拟出负载均衡效果了,ok

 

四、其他说明

(1)配置域名访问:首先我们要在Nginx中添加域名设置,其次我们要在本机设置127.0.0.1映射为域名

这样我们就可以这样访问了:http://huangxiang:8010/WebForm1.aspx

(2)配置Ngnix启动的进程数量,我们可以在进程中关注其进程数量变化

 

五、参数设置

[javascript]  view plain  copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. #定义Nginx运行的用户和用户组  
  2. #user  nobody;  
  3. #Nginx进程数,建议和cpu总内核一致  
  4. worker_processes  2;  
  5.  
  6. #error_log  logs/error.log;  
  7. #error_log  logs/error.log  notice;  
  8. #error_log  logs/error.log  info;  
  9.  
  10. #pid        logs/nginx.pid;  
  11.   
  12.   
  13. events {  
  14. #定义单个进程的最大连接数(实际最大连接数要除以2)  
  15.     worker_connections  1024;  
  16. }  
  17.  
  18. #定义http服务器  
  19. http {  
  20.     include       mime.types;#定义文件扩展名和文件类型映射表  
  21.     default_type  application/octet-stream;  
  22.  
  23.     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
  24.     #                  '$status $body_bytes_sent "$http_referer" '  
  25.     #                  '"$http_user_agent" "$http_x_forwarded_for"';  
  26.  
  27.     #access_log  logs/access.log  main;  
  28.   
  29.     sendfile        on;  
  30.     #tcp_nopush     on;  
  31.  
  32.     #keepalive_timeout  0;  
  33.     keepalive_timeout  65;  
  34.  
  35.     #gzip  on;  
  36.  
  37.  
  38.    #服务器的集群  
  39.     upstream  huangxiang.com {  #服务器集群名字  
  40.         #server   172.16.21.13:8081 weight=1;#服务器配置   weight是权重的意思,权重越大,分配的概率越大。  
  41.         #server   192.168.1.186:8081 weight=1;  
  42.         #server   172.16.1.14:8081 weight=2;  
  43.         #server   172.16.1.15:8081 weight=1;  
  44.         #server   172.16.1.15:80 weight=1;        
  45.         server    127.0.0.1:8011 weight=1;  
  46.         server    127.0.0.1:8012 weight=2;  
  47.     }     
  48. #虚拟机主机配置  
  49.     server {  
  50.         listen       8010;#端口号  
  51.         server_name  localhost huangxiang.com;#域名可以有多个,多个用空格分开  
  52.  
  53.         #charset koi8-r;  
  54.  
  55.         #access_log  logs/host.access.log  main;  
  56.  
  57.         #location / {  
  58.         #    root   html;  
  59.         #    index  index.html index.htm;  
  60.         #}  
  61.     location / {  
  62.             proxy_pass http://huangxiang.com;  
  63.             proxy_redirect default;  
  64.         }  
  65.  
  66.  
  67.         #error_page  404              /404.html;  
  68.  
  69.         # redirect server error pages to the static page /50x.html  
  70.         #  
  71.         error_page   500 502 503 504  /50x.html;  
  72.         location = /50x.html {  
  73.             root   html;  
  74.         }  
  75.  
  76.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  77.         #  
  78.         #location ~ \.php$ {  
  79.         #    proxy_pass   http://127.0.0.1;  
  80.         #}  
  81.  
  82.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  83.         #  
  84.         #location ~ \.php$ {  
  85.         #    root           html;  
  86.         #    fastcgi_pass   127.0.0.1:9000;  
  87.         #    fastcgi_index  index.php;  
  88.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  89.         #    include        fastcgi_params;  
  90.         #}  
  91.  
  92.         # deny access to .htaccess files, if Apache's document root  
  93.         # concurs with nginx's one  
  94.         #  
  95.         #location ~ /\.ht {  
  96.         #    deny  all;  
  97.         #}  
  98.     }  
  99.  
  100.  
  101.     # another virtual host using mix of IP-, name-, and port-based configuration  
  102.     #  
  103.     #server {  
  104.     #    listen       8000;  
  105.     #    listen       somename:8080;  
  106.     #    server_name  somename  alias  another.alias;  
  107.  
  108.     #    location / {  
  109.     #        root   html;  
  110.     #        index  index.html index.htm;  
  111.     #    }  
  112.     #}  
  113.  
  114.  
  115.     # HTTPS server  
  116.     #  
  117.     #server {  
  118.     #    listen       443 ssl;  
  119.     #    server_name  localhost;  
  120.  
  121.     #    ssl_certificate      cert.pem;  
  122.     #    ssl_certificate_key  cert.key;  
  123.  
  124.     #    ssl_session_cache    shared:SSL:1m;  
  125.     #    ssl_session_timeout  5m;  
  126.  
  127.     #    ssl_ciphers  HIGH:!aNULL:!MD5;  
  128.     #    ssl_prefer_server_ciphers  on;  
  129.  
  130.     #    location / {  
  131.     #        root   html;  
  132.     #        index  index.html index.htm;  
  133.     #    }  
  134.     #}  
  135.   
  136. }  


 

相关文章:

  • MySQL索引的使用方式和缺点
  • PHP在Windows IIS上传的图片无法访问的解决方法
  • LINUX系统安装MYSQL命令
  • Jmeter简单应用7
  • 【转】UNREFERENCED_PARAMETER的作用
  • Bootstrap框架下实现图片切换
  • SpringBoot学习之路:02.第一个程序Hello World及项目结构介绍
  • samba部署和优化
  • OSChina 周日乱弹 ——花季少女突然离开,昨夜他们做了什么?
  • VC++开发(一)——VC++自定义注释
  • 一个典型核心网络故障分析
  • 网站优化简单探讨
  • Maven 编译时复制 resources下的文件到主输出目录
  • 面试STAR法则
  • Comparable和Comparator接口
  • Android框架之Volley
  • Angular数据绑定机制
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java面向对象及其三大特征
  • JS字符串转数字方法总结
  • MySQL-事务管理(基础)
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • scala基础语法(二)
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • windows下使用nginx调试简介
  • Yeoman_Bower_Grunt
  • 初识 beanstalkd
  • 检测对象或数组
  • 力扣(LeetCode)357
  • 浏览器缓存机制分析
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 阿里云服务器如何修改远程端口?
  • 阿里云重庆大学大数据训练营落地分享
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​ArcGIS Pro 如何批量删除字段
  • ​queue --- 一个同步的队列类​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C语言)逆序输出字符串
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三十五)大数据实战——Superset可视化平台搭建
  • .NET 8.0 中有哪些新的变化?
  • .Net Web窗口页属性
  • [20160902]rm -rf的惨案.txt
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍