Nginx篇

1. 简述一下什么是Nginx,它有什么优势和功能?
Nginx是一个web服务器和方向代理服务器,用于HTTP/HTTPS/SMTP/POP3/MAP协议。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
优点:
(1)更快
这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数万计的并发请求),Nginx可以比其他Web服务器更快的响应请求。
(2)高扩展性,跨平台
Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块本身,无须在意其他。而且在HTTP模块中,还设计了HTTP过滤器模块:一个正常的HPPT模块在处理完请求后,会有一串HTTP过滤器模块对请求的结果进行再处理,这样,当我们开发一个新的HTTP模块时,不但可以使用诸如HTTP核心模块、events模块、log模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有地HTTP过滤器模块。这种低耦合度的优秀设计,造就了Nginx庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。
(3)高可用性:用于反向代理,宕机的概率微乎其微
高可靠性是我们选择Nginx的基本条件,因为Nginx的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器大规模使用Nginx.Nginx的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速地“拉起”新的worker子进程提供服务。
(4)低内存消耗
一般情况下,10000个非活跃的HPPT Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这是Nginx支持高并发连接的基础。
(5)单机支持10万以上的并发连接
这是一个非常重要的特性!随着互联网的迅猛发展和互联网用户数量的成倍增长,各公司、网站需要应付海量并发请求,一个能够在峰值顶住10万以上并发请求的server,无疑会得到大家的青睐,理论上,Nginx支持的并发连接上限取决于内存,10万远未封顶。当然,能够及时处理更多的并发请求,是与业务特点紧密相关的。
(6)热部署
master管理进程与worker工作进程的分离设计,使得Nginx能够提供热部署功能,即可以在7*24小时不间断服务的前提下,升级Nginx的可执行文件。当然,它也支持不停止服务就更新配置项,更换日志文件等功能。
(7)最自由的BSD协议
这是Nginx可以快速发展的强大动力。BSD许可协议不只是允许用户免费使用Nginx,它还允许用户在自己的项目中直接使用或修改Nginx源码,然后发布。这吸引了无数开发者继续为Nginx贡献自己的智慧。
以上7个特点当然不是Nginx的全部,拥有无数个官方功能模块、第三方功能模块使得Nginx能够满足绝大部分应用场景,这些功能模块间可以叠加以实现更加强大、复杂的功能,有些模块还支持Nginx与Perl、Lua等脚本语言集成工作,大大提高了开发效率。这些特点促使用户在寻找一个Web服务器时更多考虑Nginx.
选择Nginx的核心理由还是它能支持高并发请求的同时保持高效的服务。

2. Nginx是如何处理一个HTTP请求的?
Nginx是一个高性能的Web服务器,能够同时处理大量的并发请求,它结合多进程机制和异步机制,异步机制使用的是异步非阻塞方式,以下就是关于Nginx的多线程机制和异步非阻塞机制。
1.多进程机制
服务器每收到一个客户端请求时,就有服务器主进程(master process)生成一个子进程(worker process)出来和客户端建立连接进行交互,直到连接断开,该子进程就结束了。

使用进程的好处是各个进程之间相互独立,不需要加锁,减少了锁对性能造成的影响,同时降低编程的复杂度,降低开发成本,其次,采用独立的进程,可以让进程之间不会互相影响,如果一个进程发生异常退出时,其他进程正常工作,master进程则很快启动新的work进程,确保服务不会中断,从而将风险降到最低。

缺点是操作系统生成一个子进程需要进行内存复制等操作,在资源和时间上会产生一定的开销。当有大量请求时,会导致系统性能下降。
2. 异步非阻塞机制
每个工作进程使用异步非阻塞方式,可以处理多个客户端请求。
当某个工作进程接收到客户端的请求以后,调用IO进行处理,如果不能立即得到结果,就去处理其他请求(即为非阻塞),而客户端在此期间也无需等待响应,可以去处理其他事情(即为异步)。
当IO返回时,就会通知此工作进程,该进程得到通知,暂时挂起当前处理的事务去响应客户端的请求。
3. 列举一些Nginx的特性
反向代理/L7负载均衡器,嵌入式Perl解释器,动态二进制升级,可用于重新编写URL,具有非常好的PCRE的支持
4. 请列举Nginx和Apache之间的不同点

NginxApache
Nginx是一个基于web的服务器Apache是一个基于流程的服务器
所有请求都由一个线程来处理单线程处理单个请求
Nginx避免子进程的概念Apache是基于子进程的
Nginx类似于速度Apache类似于功率
Nginx在内存消耗和连接方面比较好Apache在内存消耗和连接上面没有提高
Nginx在负载均衡Apache当流量达到进程的极限时,Apache将拒绝新的连接
对于PHP来说,Nginx更可取,因为他支持PHPApache支持的php python Peri和其他语言,使用插件,当应用程序基于python和ruby时,它非常有用
Nginx不支持ibmi和openvms一样的osApache支持更多的os
Nginx只具有核心功能Apache提供了比Nginx更多的功能
Nginx性能和可伸缩性不依赖于硬件Apache依赖于CPU和内存等硬件组件

5. 在Nginx中,如何使用未定义的服务器名称来阻止请求?
只需将请求删除的服务器定义为:

Server{
	listen 80;
	server_name "";
	return 444;
}

这里,服务器名被保留为一个空字符串,它将在没有“主机”头字段的情况下匹配请求,而一个特殊的Nginx的非标准代码444将返回,从而终止连接。

一般推荐worker进程数与CPU内核数一致,这样一来不存在大量的子进程生成和管理任务,避免了进程之间竞争CPU资源和进程切换的开销。而且Nginx为了更好的利用多核的特性,提供了CPU亲缘性的绑定选项,我们可以将某一进程绑定在某一个核上,这样就不会因为进程的切换带来Cache的失效。

对于每个请求,有且只有一个工作进程对其处理。首先,每个worker进程都是从master进程fork过来。在master进程里,先建立需要listen的socket(listenfd)之后,然后再fork出多个worker进程。

所有worker进程的listenfd会在新连接来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢占accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。

当一个worker进程在accept这个连接之后,就开始读取请求、解析请求、处理请求,产生数据后,在返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了有。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

在Nginx服务器的运行过程中,主进程和子进程需要进程交互,交互依赖于Socket实现的管道来实现。
6. 请解释Nginx服务器上的Master和Worker进程分别是什么?
主程序Master Process启动后,通过一个for循环来接收和处理外部信号;
主进程通过fork()函数产生worker子进程,每个子进程执行一个for循环来实现Nginx服务器对事件的接收和处理。
7. 请解释代理中的正向代理和反向代理
首先,代理服务器一般指局域网内部的机器通过代理服务器发送请求到互联网的服务器,代理服务器一般作用在客户端。例如:GoAgent over the wall软件,我们的客户端在进行over the wall操作时,我们使用的是正向代理,通过正向代理的方式,在我们的客户端运行一个软件,将我们的HTTP请求转发到其他不同的服务器端,实现请求的分发。

反向代理服务器作用在服务器端,它在服务器端接受客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的相应结果反馈给客户端。Nginx就是一个反向代理服务器软件。
在这里插入图片描述

从上图可以看出:客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址还有代理程序的端口。
反向代理正好和反向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。

8. 解释Nginx的用途
Nginx服务器的最佳用法是在网络上部署动态HTTP内容,使用SCGI、WSGI应用程序服务器。用于脚本的FastCGI处理程序,它还可以作为负载均衡器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值