Nginx与Apache:性能、可扩展性与社区支持的比较
Apache & Nginx
Apache是Apache软件基金会下的一个项目,即Apache HTTP Server Project。Nginx同样是一款开源的HTTP服务器软件,它不仅可作为HTTP服务器,还能作为邮件代理服务器、通用的TCP代理服务器。
HTTP服务器本质上是运行在服务器上的应用程序,它绑定服务器IP地址并监听某一TCP端口,用于接收和处理HTTP请求,客户端(如IE、Firefox、Chrome等浏览器)可通过HTTP协议获取服务器上的各种资源,如网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等。
不仅Apache HTTP Server和Nginx,多数编程语言的类库中也实现了简单的HTTP服务器,方便开发者使用。例如:Java的HttpServer(https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html),Python的SimpleHTTPServer(https://docs.python.org/2/library/simplehttpserver.html)。使用这些类库可轻松运行HTTP服务器,通过绑定IP地址并监听TCP端口提供HTTP服务。
Apache Tomcat
Apache Tomcat是Apache基金会下的另一个项目。与Apache HTTP Server不同,Tomcat能够动态生成资源并返回给客户端。
Apache HTTP Server和Nginx只能返回固定文本文件内容,即静态资源,而动态资源在不同时间、不同客户端访问时内容不同,如显示当前时间或当前IP地址的页面。
Apache HTTP Server和Nginx本身不支持生成动态页面,但可通过其他模块(如Shell、PHP、Python脚本程序)实现动态内容生成。若使用Java程序动态生成资源内容,用这类HTTP服务器较难实现。Java Servlet技术及衍生的Java Server Pages技术可让Java程序处理HTTP请求并返回内容,Tomcat正是支持运行Servlet/JSP应用程序的容器。
Tomcat运行在JVM之上,绑定IP地址并监听TCP端口,还具备以下职责:管理Servlet程序的生命周期;将URL映射到指定Servlet进行处理;与Servlet程序合作处理HTTP请求,根据请求生成HttpServletResponse对象传递给Servlet处理,并将Servlet生成的内容返回给浏览器。
虽然Tomcat可视为HTTP服务器,但通常会与Nginx配合使用:实现动静态资源分离,利用Nginx的反向代理功能,将动态资源请求交给Tomcat,静态资源请求(如图片、视频、CSS、JavaScript文件等)直接由Nginx返回给浏览器,减轻Tomcat压力;实现负载均衡,当业务压力增大时,可启动多个Tomcat实例,Nginx的负载均衡功能可通过算法将请求分发到不同实例处理。