借助Nginx一、反向代理:web服务器的“经纪人”1.1反向代理初印象然后将请求转发到内网服务器,从服务器获取结果返回给互联网上请求连接的客户端,此时代理服务器对外充当服务器。从上图可以看出,反向代理服务器位于网站机房,代理网站的web服务器接收Http请求并转发请求。1.2反向代理的作用①保护网站安全:来自互联网的任何请求都必须先经过代理服务器;②通过配置缓存功能加速Web请求:可以缓存真实Web服务器上的一些静态资源,以减轻真实Web服务器的负载压力;③实现负载均衡:作为负载均衡服务器,均衡分发请求,均衡集群内各服务器的负载压力;2.初识Nginx:简单却不凡2.1什么是Nginx?Nginx是一个轻量级的网页服务器、反向代理和电子邮件代理服务器。它在类似BSD的许可下发布其源代码,并以其稳定性、丰富的功能集、示例配置文件和低系统资源消耗而闻名。来源:Nginx(发音与enginex相同),由俄罗斯程序员IgorSysoev开发。它最初由俄罗斯大型门户网站和搜索引擎Rambler(俄语:Рамблер)使用。本软件基于BSD-like协议发布,可运行于UNIX、GNU/Linux、BSD、MacOSX、Solaris、MicrosoftWindows等操作系统。说到Web服务器,ApacheServer和IISServer是两大巨头;但一个更快、更灵活的对手:Nginx正在迎头赶上。2.2Nginx应用情况Nginx在俄罗斯最大的门户网站RamblerMedia(www.rambler.ru)上运行了3年。同时,俄罗斯超过20%的虚拟主机平台使用Nginx作为反向代理服务器。如果你想学Java工程,高性能和分布式,简单易懂。微服务、Spring、MyBatis、Netty源码分析的朋友可以加我Java进阶交流:854630135。群里有阿里大牛的现场讲解技术,还有Java大型互联网技术视频免费分享给大家。在中国,淘宝网、新浪博客、新浪播客、网易新闻、六间房、56.com、Discuz!、水木社区、豆瓣、优扑、海内、迅雷在线等许多网站都使用Nginx作为Web服务器或反向代理服务器。2.3Nginx的核心特性(1)跨平台:Nginx可以在大多数类Unix操作系统上编译运行,也有Windows的移植版本;(2)配置极其简单:非常容易使用。配置风格与程序开发相同,神级配置;(3)非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试可以支持5万并发,实际生产环境可以跑到2万到3万并发。(这是因为Nginx使用了最新的epoll模型);PS:对于一个web服务器,先看一个请求的基本过程:建立连接---接收数据---发送数据,再看系统底层来:以上过程(建立连接---接收数据---发送数据)是系统底层的读写事件。①如果采用阻塞调用的方式,当读写事件没有准备好时,读写事件肯定是执行不了的,所以我们要等待很长时间,而读写事件可以仅在事件准备就绪时执行,然后请求将被延迟。②既然不准备阻塞调用,那就使用非阻塞调用方式。非阻塞的意思是:事件马上返回,告诉你事件还没准备好,慌什么,等会再回来。好吧,过一会儿,再次检查事件,直到事件准备就绪。这期间可以先做其他事情,然后看看事件准备好没有。虽然没有被屏蔽,但是你得时不时的查看一下事件的状态。可以做更多的事情,但是开销不小。(4)事件驱动:通信机制采用epoll模型,支持更大的并发连接数。①非阻塞通过不断检查事件的状态来判断是否进行读写操作,带来了很大的开销,所以就有了异步非阻塞的事件处理机制。这种机制允许您同时监视多个事件。呼叫他们被阻止,但您可以设置超时期限。如果事件在超时期限内准备就绪,它将返回。这种机制解决了上面阻塞调用和非阻塞调用的两个问题。②以epoll模型为例:当事件没有就绪时,会被放入epoll(queue)。如果事件准备就绪,则处理它;如果事件返??回EAGAIN,则继续放入epoll。所以,只要一个事件准备好了,我们就去处理,只有所有事件都没有准备好,我们才在epoll中等待。这样我们就可以并发处理大量的并发。当然,这里的并发请求是指未处理的请求。只有一个线程,那么当然同一时间只能处理一个请求,但是请求是不断切换的。就这样,因为异步事件没有准备好,switch也主动放弃了。这里的转换是免费的。你可以理解为循环处理多个准备好的事件,实际就是这样。③与多线程方式相比,这种事件处理方式具有很大的优势。无需创建线程,每次请求占用内存极少。没有上下文切换,事件处理非常轻量级。再多也不会造成不必要的资源浪费(上下文切换)。对于IIS服务器,每个请求都会独占一个工作线程。当并发数达到几千时,就会有几千个线程同时处理请求。这对操作系统来说是一个不小的挑战:因为线程带来的内存占用非常大,线程的上下文切换带来的CPU开销非常大,自然性能无法提升,从而导致高并发场景下的性能。下降很严重。总结:Nginx通过异步非阻塞的事件处理机制,实现了进程循环处理多个准备好的事件,从而实现高并发和轻量级。(5)Master/Worker结构:一个master进程生成一个或多个worker进程。PS:Master-Worker设计模式的核心思想是将原本串行的逻辑并行化,将逻辑拆分成许多独立的模块并行执行。它主要包括两个主要组件,Master和Worker。Master主要是将逻辑拆分成独立的部分。同时维护Worker队列,将每个独立的部分发送给多个Worker并行执行。Worker主要进行Actual逻辑计算,并将结果返回给Master。Q:在nginx中使用这个进程模型有什么好处?答:使用独立进程可以防止相互影响。一个进程退出后,其他进程还在工作,服务不会中断。Master进程将快速重启。启动一个新的Worker进程。当然,如果worker进程异常退出,那肯定是程序有bug。异常退出会导致当前worker上所有请求失败,但不会影响所有请求,降低了风险。(6)内存消耗小:处理大并发请求的内存消耗很小。30000个并发连接下,只有10个Nginx进程启动消耗150M内存(15M*10=150M)。(7)内置健康检查功能:如果Nginx代理后端的某台web服务器宕机,不会影响前端访问。(8)节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header。(9)稳定性高:对于反向代理来说,宕机的概率很小。3、搭建实战:Nginx+IIS搭建Web服务器集群负载均衡。这里我们主要是将同一个网站部署到Windows环境下不同服务器的IIS中,然后通过统一的Nginx响应代理服务器对外提供统一的访问。访问以实施简化的反向代理和负载平衡服务。但受限于实验条件,我们主要在一台电脑上模拟反向代理和IIS集群。具体实验环境如下图所示:我们在一台电脑上部署nginx服务和网站。Nginx监听http80端口,网站部署在同一个IIS服务器上,端口号不同(这里是8050和8060)。当用户访问localhost时,nginx作为反向代理将请求均衡转发到两个IIS中的不同端口。端口web应用程序进行处理。虽然实验环境简单且受限,但本文可以实现并演示一个简单的负载均衡效果。3.1准备一个ASP.NET网站并部署到IIS服务器集群(1)在VS中新建一个ASP.NETweb应用,但是为了在电脑上显示效果,我们将这个web应用复制过来,修改两个Default一个Web程序的.aspx,让它的主页显示一些不同的信息。这里Web1显示“TheFirstWeb:”,Web2显示“TheSecondWeb”。(2)调试运行看两个网站的效果?①Web1的显示效果:②Web2的显示效果:③部署到IIS,分配不同的端口号:这里我选择Web1:8050,Web2:8060(3)总结:在真实环境下,搭建Web应用服务器集群的实现就是将同一个Web应用部署到Web服务器集群中的多台Web服务器上。3.2下载Nginx并将其作为Windows自启动服务部署到服务器上(1)从Nginx官网下载Windows版本的Nginx:http://nginx.org/en/download.html(这里我们使用nginx/Windows-1.4.7版本实验,文末有下载地址)(2)解压到磁盘任意目录,比如我这里解压到:D:Serversginx-1.4.7(3)启动、停止和重新加载服务:通过cmd作为守护进程启动nginx.exe:启动nginx.exe,停止服务:nginx-sstop,重新加载配置:nginx-sreload;(4)每次在cmd中启动Nginx服务不符合实际需求,于是想到将其注册为Windows服务,并设置为自启动模式。在这里,我们使用一个不错的小程序:“WindowsServiceWrapper”将nginx.exe注册为Windows服务。具体步骤如下:①下载最新版本的WindowsServiceWrapper程序。比如我下载的名字是“winsw-1.8-bin.exe”(下载地址在文末),然后取自己想要的名字(比如:“nginx-service.exe”,当然也可以不改名)②重命名后将nginx-service.exe复制到nginx安装目录下(比如这里是“D:Serversginx-1.4.7”)③创建WindowsServiceWrapperXML配置文件在同一个目录下,名字必须和**一样*第一次重命名时使用的名字是一样的(比如我是“nginx-service.xml”,如果没有重命名,应该是“winsw-1.8-bin.xml"),这个XML的内容如下:如果想学习Java工程,高性能和分布式,简单易懂。微服务、Spring、MyBatis、Netty源码分析的朋友可以加我Java进阶交流:854630135。群里有阿里大牛的现场讲解技术,还有Java大型互联网技术视频免费分享给大家。nginxNginxServiceHighPerformanceNginxServiceD:Serversginx-1.4.7ginx.exeD:Serversginx-1.4.7roll-pD:Serversginx-1.4.7-pD:Serversginx-1.4.7-sstop④在命令行执行如下命令注册为Windows服务:nginx-service.exeinstal⑤接下来在Windows服务列表中可以看到Nginx服务,这里我们可以将其设置为自动启动:(5)总结:在Windows环境下,要对外提供的Windows服务一般要be其启动类型设置为自动。3.3修改Nginx核心配置文件nginx.conf(1)进程数和每个进程的最大连接数:?nginx进程数,建议设置等于CPU核心总数?该单个进程的最大连接数,则服务器***连接数=连接数*进程数(2)Nginx的基本配置:?监听端口一般为http端口:80;?域名可以有多个,以空格分隔:例如server_namewww.ha97.comha97.com;(3)负载均衡列表的基本配置:?location/{}:对aspx后缀文件的负载均衡请求,如果我们要对所有aspx后缀的文件进行负载均衡,可以这样写:location~.*.aspx${}?proxy_pass:请求重定向到一个自定义的服务器列表,这里我们将请求重定向到标识为http://cuitccol.com的负载均衡服务器列表;?在负载均衡服务器列表的配置中,weight是Weight,可以根据机器配置来定义权重(如果某台服务器的硬件配置很好,可以处理更多的请求,那么可以给它设置一个比较高的权重;如果某台服务器的硬件配置服务器比较差,可以配置前一个的权重为weight=2,后一个的权重配置为weight=1)。weight参数表示权重值,权重值越高,被分配的概率越大;(4)总结:最基本的Nginx配置差不多就是上面的内容了,当然只是最基本的配置。(详细配置内容请下载底部nginx-1.4.7查看)3.4添加静态文件的Nginx缓存配置为了提高响应速度,减少真实服务器的负载,我们可以缓存静态资源在反向代理服务器中,这也是反向代理服务器的一个重要作用。(1)缓存静态资源的图片文件根目录/nginx-1.4.7/staticresources/image:配置中提到的jpg/png等文件,都设置在/nginx-1.4.7/staticresources/image文件夹下找到匹配项并返回文件;expires7d:过期时间7天,静态文件更新不多,过期时间可以设置高一点,如果经常更新可以设置小一点;TIPS:下面的样式和脚本缓存配置都是一样的,这里也是一样的,只是文件夹不一样,这里就不再赘述了。(2)缓存静态资源的样式文件(3)缓存静态资源的脚本文件(4)在nginx服务文件夹下创建一个静态资源文件夹,将需要缓存的静态文件拷贝过来:这里我主要是使用web程序得到的图片、css、js文件复制进去;(5)总结:通过配置静态文件的缓存设置,可以将对这些静态文件的请求直接从反向代理服务器返回,而不需要将请求这些静态资源转发给具体的web服务器进行处理,这样可以提高响应速度,减轻真实Web服务器的负载压力。3.5Nginx反向代理实现负载均衡效果的简单测试(1)第一次访问http://localhost/Default.aspx时,处理来自127.0.0.1:8050的响应并返回结果(2)访问http://localhost/Default.aspx第二次访问localhost/Default.aspx处理来自127.0.0.1:8060的响应并返回结果时(3)多次访问http://localhost/Default.aspx时的截图:
