Apache介绍:php
Apache是基于模块化设计的,它的核心代码并很少,大多数的功能都被分散到各个模块中,各个模块在系统启动的时候按需载入。html
MPM(Multi -Processing Modules,多重处理模块)是Apache的核心组件之一,Apache经过MPM来使用操做系统的资源,对进程和线程池进行管理。Apache为了可以得到最好的运行性能,针对不一样的平台 (Unix/Linux、Window)作了优化,为不一样的平台提供了不一样的MPM,用户能够根据实际状况进行选择,其中最常使用的MPM有 prefork和worker两种(两种模式介绍http://my.oschina.net/shyl/blog/523070)。至于您的服务器正以哪一种方式运行,取决于安装Apache过程当中指定的MPM编译参数,在X系统上默认的编译参数为 prefork。前端
Apache的CGI和Module:nginx
区别在于一个进程池是web server的进程池,一个是php的进程池;FASTCGI这种模式下,能够比较好的分离动态和静态请求,php出了问题不会影响web server。web
Nginx介绍:apache
Nginx的模块从结构上分为核心模块、基础模块和第三方模块:后端
核心模块:HTTP模块、EVENT模块和MAIL模块浏览器
基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块,缓存
第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。安全
Nginx的模块从功能上分为以下三类:
Handlers(处理器模块)。此类模块直接处理请求,并进行输出内容和修改headers信息等操做。Handlers处理器模块通常只能有一个。
Filters (过滤器模块)。此类模块主要对其余处理器模块输出的内容进行修改操做,最后由Nginx输出。
Proxies (代理类模块)。此类模块是Nginx的HTTP Upstream之类的模块,这些模块主要与后端一些服务好比FastCGI等进行交互,实现服务代理和负载均衡等功能。
CGI 和 FastCGI
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通讯的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等。同时,FastCGI也被许多脚本语言支持,其中就有PHP。
FastCGI是从CGI发展改进而来的。传统CGI接口方式的主要缺点是性能不好,由于每次HTTP服务器遇到动态程序时都须要从新启动脚本解析器来执行解析,而后将结果返回给HTTP服务器。这在处理高并发访问时几乎是不可用的。另外传统的CGI接口方式安全性也不好,如今已经不多使用了。
FastCGI接口方式采用C/S结构,能够将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,能够将其直接交付给FastCGI进程来执行,而后将获得的结果返回给浏览器。这种方式可让HTTP服务器专注地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提升了整个应用系统的性能。
Nginx和FastCGI
Nginx不支持对外部程序的直接调用或者解析,全部的外部程序(包括PHP)必须经过FastCGI接口来调用(不像Apache支持php Module)。FastCGI接口在Linux下是socket(这个socket能够是文件socket,也能够是ip socket)。
接下来以Nginx下PHP的运行过程来讲明。PHP-FPM是管理FastCGI的一个管理器,它做为PHP的插件存在。
FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的链接。
当客户端请求到达Web Server Nginx是时,Nginx经过location指令,将全部以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx经过location指令,将全部以php为后缀的文件都交给127.0.0.1:9000来处理。
FastCGI进程管理器PHP-FPM选择并链接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。
FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成。
FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个链接。
Apache、Nginx、Lighttpd优缺点对比:
Nginx轻量级,一样的web服务,占用资源少。
Nginx静态文件处理能力强。能够对静态文件缓存
Nginx抗并发能力强,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在Apache+PHP(prefork)模式下,若是PHP处理慢或者前端压力很大的状况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。Apache一个链接对应一个进程,nginx是异步的,多个链接(万级别)能够对应一个进程 ,所以,相似DOS这样的攻击对Nginx来讲基本上是没有任何做用的。
Nginx对cgi的处理能力较好
Apache的rewrite比nginx 的rewrite 强大
Apache模块超多,基本想到的均可以找到
Apache稳定,bug少。
Apache对PHP支持比较简单,Nginx须要配合其余后端(php-mpm)用。
Apache对cgi的支持很差
Lighttpd基本和Nginx的优缺点差很少,Nginx彻底不支持动态库so,因此它的模块都必须静态编译,且不能动态加载。要加载哪些模块,模块按照怎样的顺序执行,都是在编译期由 configure指定的,若是要调整,也只能从新编译一遍,没法经过改配置来实现。在这方面,Lighttpd作得比nginx好。Lighttpd支 持动态so,而且能够在配置文件中调整各模块的前后顺序,在某些应用场景下,调整模块的前后顺序是颇有用的。
Apache 后台服务器(主要处理php及一些功能请求 如:中文url)
Nginx 前端服务器(利用它占用系统资源少得优点来处理静态页面大量请求)
Lighttpd 图片服务器,跑CGI的不二人选。
参考:http://www.server110.com/nginx/201402/6543.html