学到现在,很多人都会问的一个问题,为什么要用Nginx,为什么不去用其他例如Caddy,Tomcat,Apache等HTTP服务器呢?
其实吧,这是个好问题,如果用上面的观点去看Nginx的话,Nginx就只有HTTP服务器的功能,而且非常容易被Tomcat,Apache等HTTP服务器替代,另外Tomcat还是一款自带运行环境的架构。
解释上面提出的问题,需要如下几点来回答
第一点,服务器的应用
Nginx是一个使用C语言开发的高性能HTTP服务器,反向代理服务器,TCP/UDP端口转发服务器;官方测试过Nginx能持续提供5万多并发连接,消耗的CPU,内存资源很少,并且运行可靠性很高。在作为HTTP服务器时,Nginx可以做静态网页服务器或者搭配FastCGI(例如PHP,Python,Go)做动态交互式网页;并做前端网页文件和后端服务文件的分离操作、目录绑定、目录加密、甚至是将Nginx服务器作为文件服务器(WebDav)。在很多时候,一台服务器可能需要部署多个网站,在使用的时候需要对网站进行隔离,常用的方法是通过使用不通端口访问不同的网站,那就会出现一种问题,除了80端口浏览器打开可以直接访问,其他的端口需要在访问的域名或者IP地址后面加上:[port]的形式访问网站,而对于Nginx来说可以不需要这种操作,Nginx可以在server参数中间指定server_name参数创建一个网站空间,再指定网站的目录位置,在访问网站的时候会带上请求的域名参数,到Nginx服务器上会比较域名参数,通过检索Nginx的配置文件参数内是否包含该域名,如果存在该域名则默认请求绑定该域名的网站,不存在则返回默认页面。在使用Nginx的时候会遇到不知名的攻击者针对服务器的攻击,一般情况下网站会使用CDN来保护源网站,并通过CDN加速网站的打开速度,如果没有正确配置Nginx的配置文件,那么会出现源站地址泄露或者攻击者访问到源站服务器,并针对源站服务器进行攻击,在配置Nginx的时候需要配置一个默认页,在直接通过IP访问网站的时候返回403或者直接返回502。
Nginx最主要也是最重要的功能就是反向代理,负载均衡;当某个公司的业务量增大,那么该公司的网站服务器就会出现大量的访问,如果服务器数量较少,则可能会出现访问该公司网站速度过慢,或者该公司网站打不开甚至是服务器崩溃;在这种情况下会使用到Nginx的负载集群方式来增加网站的负载能力,和网站的响应速度,所有请求网站用户的连接数会被Nginx平均负载,在某台服务器掉线的情况下不影响公司网站的正常运营,将故障服务器从集群中间去除,或者标记down。Nginx反向代理是通过反向访问其他的网页,但是有人会有疑问了,都反向代理其他的网站服务器了,为什么不直接使用其他的网站服务器,偏要去使用反向代理服务器呢?这个原因很简单,假设一个网站使用到了Python编写的动态语句,那么直接使用这个服务器上的Python引擎会出现一种情况,就是网站一般分静态资源和动态指令,如果直接让引擎接管全部操作的话,可能会出现源服务器需要实时回应静态资源或者是实时生成静态资源,会造成引擎产生大量的不必要连接数和不必要的性能浪费,那么就可以使用Nginx的反向代理缓存,缓存网站的静态资源,在用户访问网站的时候Nginx会直接缓存保存在缓存目录的静态资源文件,在用户进行动态操作的时候(例如查询信息)再将动态操作反馈到Python编写的服务器引擎,如果遇到没有缓存过的静态资源文件则再次向源Python请求保存的缓存文件,并缓存到Nginx的缓存目录;使用这种方法从而降低源服务器的性能浪费以及源服务器的资源消耗,并且Nginx支持极高的并发连接数,配合Nginx的负载集群(upstram)可以实现服务的高可用。
第二点,其他类型HTTP服务器的优缺点
Apache
优点:
几乎可以运行在所有的通用计算机上,使用的是静态解析文件的方法,可以通过扩展脚本的方式支持动态页面
缺点:
配置复杂,服务以进程结构为基础,消耗系统硬件资源比较高,所以在高并发连接的时候系统需要消耗大量资源
Lighttpd
优点:
比Apache轻量,服务器资源消耗较少,支持高并发
缺点:
稳定性和Apache Nginx相比较相差较远,支持的功能较少,并且代码的缺陷多
Caddy
优点:
使用GoLang开发,Windows和Linux平台都可以使用,需要安装Go语言环境,自动支持HTTPS,使用简单
缺点:
由于Caddy使用的Go开发,所以Caddy的处理性能就是Go的处理性能
IIS
优点:
使用简单,方便,支持多种动态语言
缺点:
无Linux平台版本,Linux平台只能用Docker版IIS,并且Linux版仅支持ASP.NET Core,标准版.NET Framework 5.0以下无法支持
第二点,支持并发量高
<网上摘录部分>
Nginx 服务器,正常运行过程中:
多进程:一个 Master 进程、多个 Worker 进程。
Master 进程:管理 Worker 进程。对外接口:接收外部的操作(信号);对内转发:根据外部的操作的不同,通过信号管理 Worker;监控:监控 Worker 进程的运行状态,Worker 进程异常终止后,自动重启 Worker 进程。
Worker 进程:所有 Worker 进程都是平等的。实际处理:网络请求,由 Worker 进程处理。Worker 进程数量:在 nginx.conf 中配置,一般设置为核心数,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。
HTTP 连接建立和请求处理过程如下:
Nginx 启动时,Master 进程,加载配置文件。
Master 进程,初始化监听的 Socket。
Master 进程,Fork 出多个 Worker 进程。
Worker 进程,竞争新的连接,获胜方通过三次握手,建立 Socket 连接,并处理请求。
Nginx 高性能、高并发
Nginx 为什么拥有高性能并且能够支撑高并发?
Nginx 采用多进程+异步非阻塞方式(IO 多路复用 Epoll)。
请求的完整过程:建立连接→读取请求→解析请求→处理请求→响应请求。
请求的完整过程对应到底层就是:读写 Socket 事件。
Nginx 的事件处理模型
Request:Nginx 中 HTTP 请求。
基本的 HTTP Web Server 工作模式:
接收请求:逐行读取请求行和请求头,判断段有请求体后,读取请求体。
处理请求。
返回响应:根据处理结果,生成相应的 HTTP 请求(响应行、响应头、响应体)。
Nginx 也是这个套路,整体流程一致:
Nginx 的模块根据其功能基本上可以分为以下几种类型:
①event module:搭建了独立于操作系统的事件处理机制的框架,及提供了各具体事件的处理。包括 ngx_events_module,ngx_event_core_module 和 ngx_epoll_module 等。
Nginx 具体使用何种事件处理模块,这依赖于具体的操作系统和编译选项。
②phase handler:此类型的模块也被直接称为 handler 模块。主要负责处理客户端请求并产生待响应内容,比如 ngx_http_static_module 模块,负责客户端的静态页面请求处理并将对应的磁盘文件准备为响应内容输出。
③output filter:也称为 filter 模块,主要是负责对输出的内容进行处理,可以对输出进行修改。
例如,可以实现对输出的所有 html 页面增加预定义的 footbar 一类的工作,或者对输出的图片的 URL 进行替换之类的工作。
④upstream:upstream 模块实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。
upstream 模块是一种特殊的 handler,只不过响应内容不是真正由自己产生的,而是从后端服务器上读取的。
⑤load-balancer:负载均衡模块,实现特定的算法,在众多的后端服务器中,选择一个服务器出来作为某个请求的转发服务器。
摘录链接
链接:https://www.jianshu.com/p/74aededc3457
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
第三点,使用难度较低
评论