Nginx是什么?
Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。一直纳闷这个X是怎么来的在网上查了查原来X代表很牛逼的样子,Nginx就是代表一个非常牛逼的引擎服务器系统,在很多年以前记得都是用的apache来作为分流以及负载均衡的作用,在过了几年中一个俄罗斯人又开发了一个性能更高的服务器来处理客户端向浏览器发出的各种请求,它从技术角度解决了大数量高并发的用户量访问,官网上面写的并发数量可以达到5万,实际项目应用中可能也打不到这么多,如果可以达到2、3万并发访问量,也是一个用户非常多的网站了。
下面我们就结婚具体的例子以及特点原理啥的来应该这个技术到我们项目中来。
Nginx与Apache服务器对比
1.轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能 。nginx运行起来占用的资源CUP非常少,对于启动、重启都非常快速,在低配电脑上也可以快速的运行。
2.Nginx 配置简洁, Apache 复杂
对于这一点使用过nginx的用户来说就会深有体会,如果不是学习他的原理以及各种细节,几乎一会的时间就可以搭起来一个nginx集群服务器,搭建可以按着下面的步骤自己搭建。
3.最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程。
4.nginx的负载能力比apache高很多
如果你的网站有大量的高并发用户访问可以试着使用nginx来作为负载均行。
典型案例
中国大陆使用nginx网站用户有:新浪、网易、腾讯等。这么大的公司都在使用nginx作为网站的负载均衡可以说,它已经是一个比较成熟的框架,值得我们去学习和了解,通过学习和了解这个服务器也了解了一些多线程、阻塞、非阻塞的概念,多线程是一个很不错的提升性能的解决方案,但有时在多个线程之间切换以及创建关闭线程很消耗系统资源,接触的一些多线程模式可以解决多线程带来的并发访问问题,如果master/worker,fulture,生产者/消费者模式等等,在nginx里面就用到了一个多线程模式,master/worker模式,这个模式在nginx中起着重要的作用。
自己搭建集群架构:
从官网下载最新nginx-1.9.0.,下载地址为:http://nginx.org/en/download.html
1.下载完成,解压,到如下目录打开cmd,输入start nginx命令,即可启动nginx进程。
2.转到conf目录,如下
打开文件后,更改如下配置:
如上图所示,我配置了两台tomcat服务器,让nginx作为负载均衡代理的作用,经过测试配置好后既可以使用,它会随机的分发到两台不同的电脑上面去,配置非常简单,当然如果要深入了解nginx还是需要仔细分析分析它的运行流程的,简单的配置并不能够真正掌握它的作用,也不能够让它发挥更大的作用,例如还有一些静态资源的配置,访问等等,上面的jpj|png等都是对于静态资源的配置,它会将静态资源保存在本地的nginx服务器,减少服务器之间的带宽以及读写速度。
Nginx具有高性能原因
想要理解高性能还需要从最近本概念说起,要不是不好理解它为什么会性能高。一个线程通常具有五中状态,以及它们之间的转换关系如下,不可逆转。
1.新生--->就绪: 通过调用start()方法
2.就绪--->运行: 处于就绪状态的线程一旦得到CPU,就进入运行状态并自动调用自己的run()方法
3.运行--->阻塞: 处于运行状态的线程,执行sleep()方法,或等待I/O设备资源,让出CPU并暂时中止自己运行,进入阻塞状态
4.阻塞--->就绪: 睡眠时间已到,或等待的I/O设备空闲下来,线程便进入就绪状态,重新到就绪队列中等待CPU。当再次获得CPU时,便从原来中止位置开始继续运行。
5.运行--->死亡: (1)(正常情况下)线程任务完成
(2)(非正常状况)线程被强制性的中止,如通过执行stop()或destroy()方法来终止一个线程
线程
这里重点说一下阻塞状态,当web服务器如tomcat处理大量请求时,会频繁进行磁盘IO读写操作,CPU轮训时会使运行状态的请求进入“阻塞”状态,这就是阻塞产生的原因,接下来说一下非阻塞。
非阻塞
把整个过程切换成小的任务,通过任务间协作完成。 由一个专门的线程来处理所有的 IO 事件,并负责分发。
事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的进程切换。
Master/Worker并发工作模式
该模式来用来处理高并发的一种设计模式,多线程请求时,模式工作图如下
Master-Worker模式是常用的并行模式之一,它的核心思想是,系统有两个进程协作工作:Master进程,负责接收和分配任务;Worker进程,负责处理子任务。当Worker进程将子任务处理完成后,结果返回给Master进程,由Master进程做归纳汇总,最后得到最终的结果。
同一时刻只有一个worker建立连接,用到了锁的概念来保证只有一个worker处理请求。采用多线程好处,如果一个worker挂掉,对于其他没有影响
下面是一个简单的master、worker多线程实现,
Worker:用于实际处理一个任务;
Master:任务的分配和最终结果的合成
Main:启动程序,调度开启Master。
代码实现中……………………
总结:
Nginx服务器是一个高性能的服务器,可以用它来作为提高性能的系统,在上线的产品最好搭建在linux系统上面,会得到更好的性能。