Nginx 面试官常问的几个问题,看完之后,大部分程序员都收藏了

1. 什么是 Nginx?

Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器

Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器 目前使用的最多的 web 服务器或者代理服务器,像淘宝、新浪、网易、迅雷等都在使用

2. 为什么要用 Nginx?

优点:

3. 为什么 Nginx 性能这么高?

得益于它的事件处理机制: 异步非阻塞事件处理机制:运用了 epoll 模型,提供了一个队列,排队解决

4.Nginx 是如何实现高并发的

service nginx start 之后,然后输入 #ps -ef|grep nginx,会发现 Nginx 有一个 master 进程和若干个 worker 进程,这些 worker 进程是平等的,都是被 master fork 过来的。在 master 里面,先建立需要 listen 的 socket(listenfd),然后再 fork 出多个 worker 进程。当用户进入 nginx 服务的时候,每个 worker 的 listenfd 变的可读,并且这些 worker 会抢一个叫 accept_mutex 的东西,accept_mutex 是互斥的,一个 worker 得到了,其他的 worker 就歇菜了。而抢到这个 accept_mutex 的 worker 就开始“读取请求–解析请求–处理请求”,数据彻底返回客户端之后(目标网页出现在电脑屏幕上),这个事件就算彻底结束。

nginx 用这个方法是底下的 worker 进程抢注用户的要求,同时搭配“异步非阻塞”的方式,实现高并发量。

5. 为什么不使用多线程?

因为线程创建和上下文的切换非常消耗资源,线程占用内存大,上下文切换占用 cpu 也很高,采用 epoll 模型避免了这个缺点

6.Nginx 是如何处理一个请求的呢?

首先,nginx 在启动时,会解析配置文件,得到需要监听的端口与 ip 地址,然后在 nginx 的 master 进程里面

先初始化好这个监控的 socket(创建 socket,设置 addrreuse 等选项,绑定到指定的 ip 地址端口,再 listen)

然后再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程) 出多个子进程出来

然后子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与 nginx 进行三次握手,与 nginx 建立好一个连接后

此时,某一个子进程会 accept 成功,得到这个建立好的连接的 socket,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体

接着,设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后,nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了

7. 正向代理

一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器)

然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理

正向代理总结就一句话:代理端代理的是客户端

8. 反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求,发给内部网络上的服务器

并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

反向代理总结就一句话:代理端代理的是服务端

9. 动态资源、静态资源分离

动态资源、静态资源分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后

我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

动态资源、静态资源分离简单的概括是:动态文件与静态文件的分离

10. 为什么要做动、静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等文件)

这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗

当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决

动、静分离将网站静态资源(HTML,JavaScript,CSS,img 等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问

这里我们将静态资源放到 nginx 中,动态资源转发到 tomcat 服务器中

11. 负载均衡

负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中

负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力