Nginx 面试题

文章目录

    • Nginx 是如何实现高并发的?
    • 请解释 Nginx 如何处理 HTTP 请求。
    • 为什么要做动、静分离?
    • nginx 是如何实现高并发的?
    • Nginx 静态资源?
    • Nginx 配置高可用性怎么配置?
    • 502 错误可能原因
    • 在 Nginx 中,解释如何在 URL 中保留双斜线?
    • Nginx 服务器上的 Master 和 Worker 进程分别是什么?
    • Nginx 的优缺点?

Nginx 是如何实现高并发的?

如果一个 server 采用一个进程(或者线程)负责一个 request 的方式,那么进 程数就是并发数。那么显而易⻅的,就是会有很多进程在等待中。等什么?最 多的应该是等待网络传输。其缺点胖友应该也感觉到了,此处不述。
而 Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的 时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的 并发问题。
Nginx 是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负 责一个 request 的方式,那么,同时进来 4 个 request 之后,每个进程就 负责其中一个,直至会话关闭。期间,如果有第 5 个 request 进来了。就无法及时反应了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当 新进来了一个 request ,就新开个进程来处理。
Nginx 不这样,每进来一个 request ,会有一个 worker 进程去处理。但不 是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游 (后端)服务器转发 request ,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:“如果 upstream 返 回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了, 就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。 这就是为什么说,Nginx基于事件模型
由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络 传输中,实际上花费在 server 机器上的时间片不多。这是几个进程就解决高 并发的秘密所在。即:
webserver 刚好属于网络 IO 密集型应用,不算是计算密集型。异步,非阻 塞,使用 epol- ,和大量细节处的优化,也正是 Nginx 之所以然的技术基石。

请解释 Nginx 如何处理 HTTP 请求。

Nginx 使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。

为什么要做动、静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些 请求是不需要经过后台处理的(如:css、html、jpg、js 等等),这些不需要 经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静 态文件,但是如果直接忽略静态文件的话,后台的请求次数就明显增多了。在 我们对资源的响应速度有要求的时候,应该使用这种动静分离的策略去解决动、静分离将网站静态资源(HTML,JavaScript,CSS 等)与后台应用分开 部署,提高用户访问静态代码的速度,降低对后台应用访问。这里将静态资源 放到 nginx 中,动态资源转发到 tomcat 服务器中,毕竟 Tomcat 的优势是处理 动态请求。

nginx 是如何实现高并发的?

一个主进程,多个工作进程,每个工作进程可以处理多个请求,每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到可能发生 阻塞的地方,比如向上游(后端)服务器转发 request,并等待请求返回。那 么,这个处理的 worker 继续处理其他请求,而一旦上游服务器返回了,就会 触发这个事件,worker 才会来接手,这个 request 才会接着往下走。由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中, 实际上花费在 server 机器上的时间片不多。这是几个进程就解决高并发的秘密 所在。即 webserver刚好属于网络 IO 密集型应用,不算是计算密集型。

Nginx 静态资源?

静态资源访问,就是存放在 nginx 的 html ⻚面,我们可以自己编写。

Nginx 配置高可用性怎么配置?

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
Nginx 配置代码:

server {
		listen 80;
		server\_name www.lijie.com;
		proxy\_send\_timeout 1s;### nginx 发送给上游服务器(真实访问的服务器)超时时间
		proxy\_read\_timeout 1s;### nginx 接受上游服务器(真实访问的服务器)超时时间
		index index.html index.htm;
	}

502 错误可能原因

FastCGI 进程是否已经启动
FastCGI worker 进程数是否不够,FastCGI 执行时间过⻓

  • fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;

FastCGI Buffer 不够

  • nginx 和 apache 一样,有前端缓冲限制,可以调整缓冲参数 fastcgi_buffer_size 32k; fastcgi_buffers 8 32k;

Proxy Buffer 不够

  • 如果你用了 Proxying,调整proxy_buffer_size 16k; proxy_buffers 4 16k;

php 脚本执行时间过⻓

  • 将 php-fpm.conf 的 0s 的 0s 改成一个时间

在 Nginx 中,解释如何在 URL 中保留双斜线?

要在 URL 中保留双斜线,就必须使用 语法:merge_slashes [on/off] 默认值: merge_slashes on
环境: http,server merge_slashes_off;

Nginx 服务器上的 Master 和 Worker 进程分别是什么?

Master 进程:读取及评估配置和维持 ;Worker 进程:处理请求。

Nginx 的优缺点?

优点:

  • 占内存小,可实现高并发连接,处理响应快。
  • 可实现 HTTP 服务器、虚拟主机、方向代理、负载均衡。
  • Nginx 配置简单。
  • 可以不暴露正式的服务器 IP 地址。

缺点:

  • 动态处理差,nginx 处理静态文件好,耗费内存少,但是处理动态⻚面则很鸡 肋,现在一般前端用 nginx 作为反向代理抗住压力。

你可能感兴趣的:(Java面试,架构,nginx,运维)