为什么 Nginx 比 Apache 更牛逼

Nginx才短短几年,就拿下了Web服务器大壁江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于Httpd,甚至能轻松解决C10K问题。

在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。根据我的测试结果,Nginx + PHP(FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。

一般来说,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃。

而这台 Nginx + PHP(FastCGI) 服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。

在3万并发连接下,访问Nginx+ PHP(FastCGI) 服务器的PHP程序,仍然速度飞快。

为什么Nginx在处理高并发方面要优于httpd,我们先从两种web服务器的工作原理以及工作模式说起。

一、Apache三种工作模式

我们都知道Apache有三种工作模块,分别为:prefork、worker、event。

  • prefork: 多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
  • worker: 多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求。event: 基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的。

1、prefork的工作原理

如果不用“–with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache1.3中采用的模式。

prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。

2、worker的工作原理

相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。

但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性,这种MPM的工作方 式将是Apache2.0的发展趋势。

3、event 基于事件机制的特性

一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。可以实现一个进程程响应多个用户请求。支持持海量并发连接数,消耗更少的资源。

二、如何提高Web服务器的并发连接处理能力

有几个基本条件:

1、基于线程,即一个进程生成多个线程,每个线程响应用户的每个请求。

2、基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。

3、基于磁盘的AIO(异步I/O)

4、支持mmap内存映射,mmap传统的web服务器,进行页面输入时,都是将磁盘的页面先输入到内核缓存中,再由内核缓存中复制一份到web服务器上,mmap机制就是让内核缓存与磁盘进行映射,web服务器,直接复制页面内容即可。不需要先把磁盘的上的页面先输入到内核缓存去。

刚好,Nginx 支持以上所有特性。所以Nginx官网上说,Nginx支持50000并发,是有依据的。

三、Nginx优异之处

传统上基于进程或线程模型架构的Web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内存或CPU的利用率低下。

生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。

另一种高性能web服务器/Web服务器反向代理:Nginx,Nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级处理机制,Nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。

在Nginx中,连接请求由为数不多的几个仅包含一个线程的进程Worker以高效的回环(run-loop)机制进行处理,而每个Worker可以并行处理数千个的并发连接及请求。

四、Nginx 工作原理

Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、cache loader和cache manager均应以非特权用户身份运行。

在高连接并发的情况下,Nginx是Apache服务器不错的替代品。

Nginx 安装非常的简单 , 配置文件非常简洁(还能够支持perl语法),Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够 不间断服务的情况下进行软件版本的升级 。

五、Nginx 的诞生主要解决C10K问题

最后我们从各自使用的多路复用IO模型来分析:

1、select模型:(apache使用,由于受模块等限制,用的不多);

单个进程能够 监视的文件描述符的数量存在最大限制;

select()所维护的 存储大量文件描述符的数据结构 ,随着文件描述符数量的增长,其在用户态和内核的地址空间的复制所引发的开销也会线性增长;

由于网络响应时间的延迟使得大量TCP连接处于非活跃状态,但调用select()还是会对 所有的socket进行一次线性扫描 ,会造成一定的开销;

2、poll:poll是unix沿用select自己重新实现了一遍,唯一解决的问题是poll 没有最大文件描述符数量的限制;

3、epoll模型:(Nginx使用)

epoll带来了两个优势,大幅度提升了性能:

1)基于事件的就绪通知方式 ,select/poll方式,进程只有在调用一定的方法后,内核才会对所有监视的文件描述符进行扫描,而epoll事件通过epoll_ctl()注册一个文件描述符,一旦某个文件描述符就绪时,内核会采用类似call back的回调机制,迅速激活这个文件描述符,epoll_wait()便会得到通知

2)调用一次epoll_wait()获得就绪文件描述符时,返回的并不是实际的描述符,而是一个代表就绪描述符数量的值,拿到这些值去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里使用内存映射(mmap)技术, 避免了复制大量文件描述符带来的开销

3)当然epoll也有一定的局限性, epoll只有Linux2.6才有实现 ,而其他平台都没有,这和apache这种优秀的跨平台服务器,显然是有些背道而驰了。

4)简单来说epoll是select的升级版,单进程管理的文件描述符没有最大限制。但epoll只有linux平台可使用。作为跨平台的Apache没有使用

来源:http://codebay.cn/post/8557.html

到此这篇关于为什么 Nginx 比 Apache 更牛逼的文章就介绍到这了,更多相关Nginx对比 Apache内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Nginx与Apache共用80端口的配置方法

    一个典型的 Nginx + Apache 应用方案可以是Nginx 占用 80 端口,过滤静态请求,然后动态请求即 Proxy 到 Apache 的 8080 端口.Proxy 反向代理的好处是访问的时候,始终就是 80 端口,来访者不会觉察到有任何的区别. 但有的应用确非常"聪明",识别到 Apache 所位于的端口是 8080 ,就会把相关的超链接都一并加上 :8080 的后续.这么就死定了,还能有正常访问麽?! 有个方法可以解决这事,就是把 apache 也运行在80端口上.同一

  • 如何在Apache和Nginx禁止上传目录里PHP的执行权限

    Apache下禁止指定目录运行PHP脚本 在虚拟主机配置文件中增加php_flag engine off指令即可,配置如下: Options FollowSymLinks AllowOverride None Order allow,deny Allow from all php_flag engine off 另外一种方法,是设置在htaccess里面的,这个方法比较灵活一点,针对那些没有apapche安全操作权限的网站管理员: Apache环境规则内容如下:Apache执行php脚本限制 把

  • Linux服务器下Nginx与Apache共存的实现方法分析

    本文实例讲述了Linux服务器下Nginx与Apache共存的实现方法.分享给大家供大家参考,具体如下: 同一个端口是不能同时有两个程序监听的.所以换个思路解决同一台服务器下某些网站运行在nginx下,某些网站运行在Apache下共存. 解决思路: 将nginx作为代理服务器和web服务器使用,nginx监听80端口,Apache监听除80以外的端口,我这暂时使用8080端口. 解决方案: 在Linux 一经搭建好环境 先后安装了Nginx 和Apache 由于 默认端口都是:80 一般客户请求

  • iis、apache、nginx使用X-Frame-Options防止网页被Frame的解决方法

    当然也是因为被360检测到了示"X-Frame-Options头未设置",根据360的提示与百度了一些网上的一些资料整理了下,完美解决问题. 首先看下360给出的方案,但么有针对服务器的具体设置,不是每个人对服务器都很懂啊. 描述: 目标服务器没有返回一个X-Frame-Options头. X-Frame-Options HTTP响应头是用来确认是否浏览器可以在frame或iframe标签中渲染一个页面,网站可以用这个头来保证他们的内容不会被嵌入到其它网站中,以来避免点击劫持. 危害: 攻击者可

  • 浅谈apache和nginx的rewrite的区别

    1. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx Rewrite规则语法如下: rewrite ^/b/(.*)\.html /play.php?video=$1 break; 如果加上if语句,示例如下: if (!-f $request_filename) { rewrite ^/img/(.*)$ /site/$host/images/$1

  • 为什么 Nginx 比 Apache 更牛逼

    Nginx才短短几年,就拿下了Web服务器大壁江山,众所周知,Nginx在处理大并发静态请求方面,效率明显高于Httpd,甚至能轻松解决C10K问题. 在高并发连接的情况下,Nginx是Apache服务器不错的替代品.Nginx同时也可以作为7层负载均衡服务器来使用.根据我的测试结果,Nginx + PHP(FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍. 一般来说,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它

  • Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码

    美国时间 09 月 25 日,Oralce 正式发布了 Java 11,这是据 Java 8 以后支持的首个长期版本.非常值得大家的关注,可以通过下面的地址进行下载: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 为什么说是长期版本,看下面的官方发布的支持路线图表. 可以看出 Java 8 扩展支持到 2025 年,而 Java 11 扩展支持到 2026 年. 现在大部

  • Bootstrap嵌入jqGrid,使你的table牛逼起来

    Bootstrap原生的table组件只能满足简单的数据展示,满足不了更富有操作性的要求.当然了,你可以找到一款叫做"DataTables-1.10.11"的基于bootstrap的table组件,但如果你对API看得不甚了解的话,用起来可就痛苦了,但是如果你选择使用jqGrid,那么本篇教程就给你带来了解决这种富操作性table的解决方案. 一.效果展示 OK,就展示这一张图片,相信你已经爱上了bootstrap版的jqGrid,和bootstrap很兼容,简直完美,当然了,这需要我

  • 详解C++之C++11的牛逼特性

    一.列表初始化 1.1 C++98中,标准允许使用花括号{}对数组元素进行统一的列表初始值设定. int array1[] = {1,2,3,4,5}; int array2[] = {0}; 对对于一些自定义类型,却不行. vector<int> v{1,2,3,4,5}; 在C++98中这样无法通过编译,因此需要定义vector之后,在使用循环进行初始赋值. C++11扩大了用初始化列表的使用范围,让其适用于所有的内置类型和自定义类型,而且使用时,=可以不写 // 内置类型 int x1

  • IntelliJ IDEA 15款超级牛逼插件推荐(自用,超级牛逼)

    满满的都是干货  所有插件都是在 ctrl+alt+s   里的plugins 里进行搜索安装 1.CodeGlance 代码迷你缩放图插件 2. Codota 代码提示工具,扫描你的代码后,根据你的敲击完美提示 Codota基于数百万个开源Java程序和您的上下文来完成代码行,从而帮助您以更少的错误更快地进行编码. 安装: 3.Material Theme UI 那就顺便推荐一下这个吧,超多的主题插件,各种颜色,各种模式,感兴趣的可以试一下,图我就不截了 4.Alibaba Java Codi

  • Idea公司真牛逼发行最适合程序员编程字体

    正文如下: JetBrains年初的时候推出了一种新字体,即JetBrains Mono,它是专为开发人员设计的. 推荐阅读: https://mp.weixin.qq.com/s/iF1d_I6cij9L-MeQ2QMewg JetBrains表示: 在当今的大部分时间里,我们作为开发人员都在看代码.我们一直在寻找最佳字体,以使我们更容易在屏幕上查看文本. 但是,许多流行字体中的逻辑并不总是考虑到通读代码和阅读书本之间的区别. 我们的眼睛以非常不同的方式沿代码移动,通常必须垂直移动和水平移动,

  • SpringBoot+Tess4j实现牛逼的OCR识别工具的示例代码

    前言 " 等不到风中你的脸颊 眼泪都美到很融洽 等不到掩饰的雨落下 我的眼泪被你察觉 " 听着循环的歌曲,写着久违的bug.好吧,还是一天.正好一个小伙伴说,要不要做个工具站玩一下.我就随意的找了个工具站,看了下,发现很多都有文字的OCR识别功能.因此,我想起来之前了解的非常流行的开源的OCR大神级别的项目,Tesseract OCR. 简单介绍 官网如下所示 tesseract-ocr.github.io/ 简洁明了,挂在github上的网站. 详细的不再介绍,感兴趣的,可以进入同志

  • Nginx配合Apache或Tomcat的动静分离基本配置实例

    其实本人比较喜欢nginx跑静态和做负载反向代理,动态php还是交给apache处理比较稳定,jsp就交给tomcat.resin或jboss.nginx跑静态的能力是无与伦比的,是目前web服务器里最强的.nginx和apache.tomcat.resin的动静分离配置其实很简单,就几句配置,稳定性也非常好. 1.nginx和apache的动静分离配置: 把下面配置放到nginx配置文件相应的server { }里面,如果使用其他端口号,改一下就行: #所有php的动态页面均交由apache处

  • 修改Nginx与Apache上传文件大小限制

    修改 Nginx 上传文件最大值限制 我们使用 ngnix 做 web server 的时候,nginx 对上传文件的大小有限制. 这个时候我们要修改 nginx 参数. sudo vim /etc/nginx/nginx.conf #在http段里面添加: client_max_body_size 100m; //举例设置上传最大值为100m 然后重启nginx systemctl restart nginx 修改 Apache 上传文件最大值限制 打开 php.ini, 找到下面的项并修改之

  • 使用log_format为Nginx服务器设置更详细的日志格式方法

    nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf). nginx的log_format有很多可选的参数用于指示服务器的活动状态,默认的是: log_format access '$remote_addr - $remote_user [$time_local] "$request&q

随机推荐