本文分别介绍了Apache-HTTP
和Nginx
这两个引擎,然后对比一下他们的差别。有什么不足之处欢迎大家补充。
HTTP中间件
当我们在浏览器中输入一个网页链接后,浏览器基于HTTP(s)
传输协议向相应的服务器发送一个请求,服务器收到相应的请求后经过处理,返回相应的信息给浏览器,然后由浏览器解析http
中的内容,以网页的形式表现出来。
服务器负责接收请求,并在处理之后返回相应的数据,而其中又可以细分为处理http
连接的服务部分和执行服务内容的应用部分(WordPress
使用PHP
生成需要的页面,就属于应用部分)
而不论应用部分执行的是何种应用,处理http
连接的部分几乎是相同的,所以出现了专门处理http
连接的中间件,目前最常见的是Apache
和Nginx
。
Apache
正式名称是“Apache HTTP Server
”,是一款开源的HTTP
服务器中间件,诞生于1995年,曾经是HTTP
服务领域的龙头老大,拥有大量的用户和丰富的社区资源。Apache
的一大优点就是方便与Wordpress
等CMS软件进行集成,只需要简单的设定就能搭建一个基于CMS的网站。
Apache的内部处理模型
内部构造方面,Apache
采用多进程的方式,每有一个连接就会为这个连接开辟一个进程,专门用于处理这个连接上的请求,直到连接结束。这样做的好处是:
- 来自不同客户端的连接会立刻得到相应且互不干扰,而且不会因为某一个服务占用了较长的时间而使其它的连接得不到响应。
但是缺点也是显而易见的:
- 当同时访问数比较多的时候,
Apache
会建立大量的进程,占用过多的内存资源。 - 大量线程间的调度也会造成CPU处理能力的大量浪费。
由此产生了被称为C10K
的难题,C即客户端(Client),10K是指1万,即不论服务器的性能和网络带宽有多高,Apache
都难以同时处理1万个以上的连接。
Nginx
读作Engine-X
,和Apache
一样也是用于HTTP
服务的开源中间件,诞生于2004年。Nginx
比Apache
的历史要短,但是正因为是后来者,Nginx
吸取了Apache
的教训,在设计初期就考虑到了处理大量连接时的效率问题,解决了诸如C10K
等随着互联网规模壮大而产生的难题。
Nginx的内部处理模型
Nginx
采用了非阻塞IO
和异步消息驱动的方式,即在称作worker
的线程中使用循环来处理队列中的连接请求。而根据硬件的情况,可以设定多个worker
线程,充分利用CPU
的核心资源。
- 解决了处理大量连接时消耗内存过多,调度效率低下的问题,同时还能充分的利用所有的CPU核心。在相同硬件下处理并发连接的能力是
Apache
的10到100倍。
但是Nginx
这种方式也不是没有缺点。
- 当服务器单核性能较差时,基于CMS的动态网站可能需要较长的时间来执行一个请求,此时来自其他客户端的请求将无法立即被执行。当
CPU
核心数较少,worker
线程不足时会更加明显。
好在现在服务器的性能越来越强,在AMD
的带领下CPU
核心数也越来越多,Nginx
的缺点足以被弥补,而高效的优势也愈发显现出来。
综合对比
Apache Nginx
处理能力有限10-100倍是否会被复杂任务阻塞否有可能会设定难度比较简单相对复杂社区资源丰富相对较少
近年来,Nginx
的市场占有率不断提高,2019年已经达到了和Apache
持平的水平。而对于有极大访问量的大型网站,可以看到访问量越大,Nginx
的占比也就越高。这也从侧面印证了Nginx
在处理大量访问时的优越性能。
负载均衡
Nginx
除了可以作为HTTP服务器使用,其强大的反向代理功能还被广泛地用作负载均衡前端服务器,逐渐取代了基于硬件的负载均衡器。
在Nginx
中可以配置若干个后端服务器,Nginx
在收到HTTP
请求之后按照一定规则(轮询,IP哈希,优先随机)等将请求转发给后端服务器,实现负载在多台服务器上的平均或加权分配。
同时作为负载均衡的前端还能缓存后端返回的数据,缓解后端服务器的压力。前端采用Nginx
做负载均衡限制每个服务器的连接数,后端服务器运行Apache
的模式也并不少见。
硬件负载均衡器的业界大佬F5 networks
在2019年收购了Nginx
,推出了包含收费服务的负载均衡解决方案Nginx+
。
以上是关于apache
与nginx
的对比,希望对于刚接触apahce
和nginx
的人有一定的帮助。使用一个产品不能糊里糊涂的使用,我们需要了解其优点和缺点,这样才能更好的使用它们。你也可以了解更多相关知识
Nginx 入门指南:https://www.w3cschool.cn/nginx/