Nginx
1、简述一下什么是 Nginx,它有什么优势和功能?
Nginx 是一个 web 服务器和方向代理服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
Nginx 是一款免费的、自由的、开源的、高性能 HTTP 服务器和反向代理服务器;也是一个 IMAP、POP3、SMTP 代理服务器;Nginx 以其高性能、稳定性、丰富的功能、简单的配置和低资源消耗而闻名。
也就是说 Nginx 本身就可以托管网站(类似于 Tomcat 一样),进行 Http 服务处理,也可以作为反向代理服务器、负载均衡器和 HTTP 缓存。
Nginx 解决了服务器的 C10K(就是在一秒之内连接客户端的数目为 10k 即 1 万)问题。它的设计不像传统的服务器那样使用线程处理请求,而是一个更加高级的机制—事件驱动机制,是一种异步事件驱动结构。
优点:
1)更快 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应;另一方面,在高峰期(如有数以万计的并发请求),Nginx 可以比其他 Web 服务器更快地响应请求。
2)高扩展性,跨平台 Nginx 的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复 Bug 或进行升级时,可以专注于模块自身,无须在意其他。而且在 HTTP 模块中,还设计了 HTTP 过滤器模块:一个正常的 HTTP 模块在处理完请求后,会有一串 HTTP 过滤器模块对请求的结果进行再处理。这样,当我们开发一个新的 HTTP 模块时,不但可以使用诸如 HTTP 核心模块、events 模块、log 模块等不同层次或者不同类型的模块,还可以原封不动地复用大量已有的 HTTP 过滤器模块。这种低耦合度的优秀设计,造就了 Nginx 庞大的第三方模块,当然,公开的第三方模块也如官方发布的模块一样容易使用。Nginx 的模块都是嵌入到二进制文件中执行的,无论官方发布的模块还是第三方模块都是如此。这使得第三方模块一样具备极其优秀的性能,充分利用 Nginx 的高并发特性,因此,许多高流量的网站都倾向于开发符合自己业务特性的定制模块。
3)高可靠性:用于反向代理,宕机的概率微乎其微 高可靠性是我们选择 Nginx 的最基本条件,因为 Nginx 的可靠性是大家有目共睹的,很多家高流量网站都在核心服务器上大规模使用 Nginx。
Nginx 的高可靠性来自于其核心框架代码的优秀设计、模块设计的简单性;另外,官方提供的常用模块都非常稳定,每个 worker 进程相对独立,master 进程在 1 个 worker 进程出错时可以快速“拉起”新的 worker 子进程提供服务。4)低内存消耗 一般情况下,10000 个非活跃的 HTTP 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 进程则很快启动新的 worker 进程,确保服务不会中断,从而将风险降到最低。
缺点是操作系统生成一个子进程需要进行 内存复制等操作,在资源和时间上会产生一定的开销。当有大量请求时,会导致系统性能下降。
2、异步非阻塞机制
每个工作进程使用异步非阻塞方式,可以处理多个客户端请求。
当某个工作进程 接收到客户端的请求以后,调用 IO 进行处理,如果不能立即得到结果,就去处理其他请求(即为非阻塞);而客户端在此期间也无需等待响应,可以去处理其他事情(即为异步)。
当 IO 返回时,就会通知此工作进程;该进程得到通知,暂时挂起当前处理的事务去响应客户端请求。
3、列举一些 Nginx 的特性
Nginx 服务器的特性包括:
反向代理/L7负载均衡器
嵌入式 Perl 解释器
动态二进制升级
可用于重新编写 URL,具有非常好的 PCRE 支持
4、请列举 Nginx 和 Apache 之间的不同点

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 翻墙软件。我们的客户端在进行翻墙操作的时候,我们使用的正是正向代理,通过正向代理的方式,在我们的客户端运行一个软件,将我们的 HTTP 请求转发到其他不同的服务器端,实现请求的分发。
反向代理服务器作用在服务器端,它在服务器端接收客户端的请求,然后将请求分发给具体的服务器进行处理,然后再将服务器的相应结果反馈给客户端。Nginx 就是一个反向代理服务器软件。
8、解释 Nginx 用途
Nginx 服务器的最佳用法是在网络上部署动态 HTTP 内容,使用 SCGI、WSGI 应用程序服务器、用于脚本的 FastCGI 处理程序。它还可以作为负载均衡器。