在学习如何搭建Nginx之前,我们有必要弄清楚Nginx是什么,能做什么,适合哪种业务情况,这样才有利于深入理解Nginx架构和学习项目框架,而不是一味去搭建它。
本文会告诉你:
一、Nginx是什么?
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。具体体现为:
- 高并发:Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
- 易拓展:高度的模块化和自由软件许可证使得第三方模块层出不穷
- 跨平台:Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上
- 高可靠性:核心框架代码的优秀设计、模块设计简洁高效、官方提供的常用模块都非常稳定。
二、Nginx有什么作用?
Nginx的作用可以主要分为几种: HTTP服务器,反向代理服务器,负载均衡
2.1 HTTP服务器
Nginx可以作为一个HTTP服务器,将服务器上的静态文件(如 html 页面,图片、视频等)通过HTTP协议让客户端获取到。即通过配置nginx,可以让我们通过url的方式,在网页上或者应用中拿到想要的网站页面,图片或视频等。
2.2 反向代理服务器
Nginx可以作为一个反向代理服务器。用户只知道Nginx服务器的地址,当Nginx服务器收到用户的请求,根据事先配置好的策略,再向相应的业务服务器发起请求,并将服务器返回的请求结果响应给用户。
2.2.1 反向代理是什么:
反向代理即对后方实际处理请求的业务服务器做代理,请求者无需知道最终是谁处理这个请求,只要将自己的请 求发送到代理服务器上,代理服务器会根据配置将这个请求发送到业务服务器,并将业务服务器返回的 数据传回给请求者。在整个过程中,用户不知道业务服务器是在哪里,有几台。
形象图(from 知乎):
2.2.2 反向代理的作用:
业务隔离:反向代理能避免暴露真实的业务服务器,提高网络安全性。
缓存: 将服务器的响应缓存在自己的内存中,减少服务器的压力。
负载均衡:将用户请求根据配置好的策略,分配给多个服务器。
访问控制:反向代理服务器能够对请求做访问控制,防止无效或异常的请求被发送到业务服务器,减轻服务器压力。
安全防护:反向代理服务器能够通过配置防火墙、安装安全软件等方式,一定程度防护网络攻击。
2.3 负载均衡
基于2.2的反向代理服务器,当用户访问量过大一台业务服务器撑不住时,可以部署多台相同服务的业务服务器,由Nginx可以根据配好的策略,将用户的访问分配到各个配好的服务器。
使用负载均衡的好处在于:
更高的并发量:Nginx代理服务器仅做转发的功能,不负责请求和响应的解析,业务逻辑十分简单,可以承载较大的并发
量。而业务服务器往往耗时更久,同时多台并发处理能提高效率。
更高的稳定性:业务服务器情况复杂,多台并发处理的话,若其中一台宕机,代理服务器能及时将请求分配到其他服器,
降低对用户使用的影响。
突破性能瓶颈:单机性能往往受到cpu、内存的限制,而通过负载均衡能够让多台服务器共同处理,这也是集群的基本构
架。
降低开发成本:高性能的服务器十分昂贵,通过负载均衡实现集群,能够将多台服务器联合在一起,花费更小的代价,达
到甚至超过高性能服务器。
2.4 虚拟主机
有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。例如将http://www.aaa.com和http://www.bbb.com两个网站部署在同一台服务器上,两个域名解析到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
三、Tomcat、Apache、Nginx对比,如何选择
3.1 Tomcat、Apache、Nginx分别是什么
Apache/Nginx 应该叫做「HTTP Server」;而 Tomcat 则是一个「Application Server」,或者更准确的来说,是一个「Servlet/JSP」应用的容器(Ruby/Python 等其他语言开发的应用也无法直接运行在 Tomcat 上)。即Apache和Nginx只能用于处理静态资源的访问,或是请求与转发。而Tomcat则是一个应用服务器,他可以动态处理和返回资源。,
一个 HTTP Server 关心的是 HTTP 协议层面的传输和访问控制,所以在 Apache/Nginx 上你可以看到代理、负载均衡等功能。客户端通过 HTTP Server 访问服务器上存储的资源(HTML 文件、图片文件等等)。通过 CGI 技术,也可以将处理过的内容通过 HTTP Server 分发,但是一个 HTTP Server 始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端。
而应用服务器,则是一个应用执行的容器。它首先需要支持开发语言的 Runtime(对于 Tomcat 来说,就是 Java),保证应用能够在应用服务器上正常运行。其次,需要支持应用相关的规范,例如类库、安全方面的特性。对于 Tomcat 来说,就是需要提供 JSP/Sevlet 运行需要的标准类库、Interface 等。为了方便,应用服务器往往也会集成 HTTP Server 的功能,但是不如专业的 HTTP Server 那么强大,所以应用服务器往往是运行在 HTTP Server 的背后,执行应用,将动态的内容转化为静态的内容之后,通过 HTTP Server 分发到客户端。
3.2 三者如何选择
动态请求:使用Tomcat,支持动态请求处理,Apache/Nginx只能处理静态文件,或做负载均衡进行转发,无法处理请求。
动态请求如restApi请求。
高并发:使用Nginx,Nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性
能。且Nginx处理动态请求速度高于Apache。
稳定运行:使用Apache,模块多,少bug,运行稳定。
rewrite频繁: 使用Apache。rewrite即需要重写请求url的时候,由于不同的HTTP Server对请求的url的解析是不一样的。对于
/index.php/abc这种url,Apache按"index.php?abc"来解释,而nginx会认为是请求名字是“index.php”的目录下
的abc文件的内容。所以一些框架,如CI,在nginx下不配置rewrite是无法运行的,而在Apache则正常。