nginx⾯试题
nginx⾯试题
1.请解释⼀下什么是 Nginx ?
Nginx ,是⼀个 Web 服务器和反向代理服务器,⽤于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
⽬前使⽤的最多的 Web 服务器或者代理服务器,像淘宝、新浪、⽹易、迅雷等都在使⽤。
Nginx 的主要功能如下:
作为 http server (代替 Apache ,对 PHP 需要 FastCGI 处理器⽀持)
FastCGI:Nginx 本⾝不⽀持 PHP 等语⾔,但是它可以通过 FastCGI 来将请求扔给某些语⾔或框架处理。
反向代理服务器
实现负载均衡
虚拟主机
2.fastcgi 与 cgi 的区别?
1)cgi
web 服务器会根据请求的内容,然后会 fork ⼀个新进程来运⾏外部 c 程序(或 perl 脚本…), 这个进程会把处理完的数据返回给web 服务器,最后 web 服务器把内容发送给⽤户,刚才 fork 的进程也随之退出。
如果下次⽤户还请求改动态脚本,那么 web 服务器⼜再次 fork ⼀个新进程,周⽽复始的进⾏。
2)fastcgi
web 服务器收到⼀个请求时,他不会重新 fork ⼀个进程(因为这个进程在 web 服务器启动时就开启了,⽽且不会退出),web 服务器直接把内容传递给这个进程(进程间通信,但 fastcgi 使⽤了别的⽅式,tcp ⽅式通信),这个进程收到请求后进⾏处理,把结果返回给 web 服务器,最后⾃⼰接着等待下⼀个请求的到来,⽽不是退出。
综上,差别在于是否重复 fork 进程,处理请求。
3.Nginx 常⽤命令?
启动 nginx 。
停⽌ nginx -s stop 或 nginx -s quit 。
重载配置 ./sbin/nginx -s reload(平滑重启) 或 service nginx reload 。
重载指定配置⽂件 .nginx -c /usr/local/nginx/f 。
查看 nginx 版本 nginx -v 。
检查配置⽂件是否正确 nginx -t 。
显⽰帮助信息 nginx -h 。
4.Nginx 常⽤配置?
worker_processes  8; # ⼯作进程个数
worker_connections  65535; # 每个⼯作进程能并发处理(发起)的最⼤连接数(包含所有连接数)
error_log        /data/logs/nginx/error.log; # 错误⽇志打印地址
access_log      /data/logs/nginx/access.log; # 进⼊⽇志打印地址
log_format  main  '$remote_addr"$request" ''$status $upstream_addr "$request_time"'; # 进⼊⽇志格式
## 如果未使⽤ fastcgi 功能的,可以⽆视
fastcgi_connect_timeout=300; # 连接到后端 fastcgi 超时时间
fastcgi_send_timeout=300; # 向 fastcgi 请求超时时间(这个指定值已经完成两次握⼿后向fastcgi传送请求的超时时间)
fastcgi_rend_timeout=300; # 接收 fastcgi 应答超时时间,同理也是2次握⼿后
fastcgi_buffer_size=64k; # 读取 fastcgi 应答第⼀部分需要多⼤缓冲区,该值表⽰使⽤1个64kb的缓冲区读取应答第⼀部分(应答头),可以设置为fastcgi_buffers 选项缓冲区⼤⼩
fastcgi_buffers 4 64k; # 指定本地需要多少和多⼤的缓冲区来缓冲fastcgi应答请求,假设⼀个php或java脚本所产⽣页⾯⼤⼩为256kb,那么会为其分配4个64kb 的缓冲来缓存
fastcgi_cache TEST; # 开启fastcgi缓存并为其指定为TEST名称,降低cpu负载,防⽌502错误发⽣
listen      80; # 监听端⼝
server_name  st.jiedaibao; # 允许域名
root  /data/release/rrc/web; # 项⽬根⽬录
index  index.php index.html index.htm; # 访问根⽂件
Nginx ⽇志格式中的 $time_local 表⽰的是什么时间?请求开始的时间?请求结束的时间?其次,当我们从前到后观察⽇志中的
$time_local 时间时,有时候会发现时间顺序前后错乱的现象,请说明原因?
$time_local :在服务器⾥请求开始写⼊本地的时间。
因为请求发⽣时间有前有后,所以会时间顺序前后错乱。
5.Nginx 有哪些优点?
跨平台、配置简单。
⾮阻塞、⾼并发连接
处理 2-3 万并发连接数,官⽅监测能⽀持 5 万并发。
内存消耗⼩
开启 10 个 Nginx 才占 150M 内存。
成本低廉,且开源。
稳定性⾼,宕机的概率⾮常⼩。
6.使⽤“反向代理服务器”的优点是什么?
反向代理服务器可以隐藏源服务器的存在和特征。它充当互联⽹云和 Web 服务器之间的中间层。这对于安全⽅⾯来说是很好的,特别是当我们使⽤ Web 托管服务时。
这⾥,先不考虑负载均衡。
什么是正向代理?
⼀个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送⼀个请求并指定⽬标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户
端。
客户端才能使⽤正向代理。
正向代理总结就⼀句话:代理端代理的是客户端。例如说:? 我们使⽤的软件,OpenVPN 等等。
什么是反向代理?
反向代理(Reverse Proxy)⽅式,是指以代理服务器来接受 Internet上的连接请求,然后将请求,发给内部⽹络上的服务器并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为⼀个反向代理服务器。
反向代理总结就⼀句话:代理端代理的是服务端。
请列举 Nginx 和 Apache 之间的不同点?
轻量级,同样起 web 服务,Nginx ⽐ Apache 占⽤更少的内存及资源。
抗并发,Nginx 处理请求是异步⾮阻塞的,⽽ Apache 则是阻塞型的,在⾼并发下 Nginx 能保持低资源低消耗⾼性能。
最核⼼的区别在于 Apache 是同步多进程模型,⼀个连接对应⼀个进程;Nginx 是异步的,多个连接(万级别)可以对应⼀个进程。
Nginx ⾼度模块化的设计,编写模块相对简单。
LVS、Nginx、HAproxy 有什么区别?
LVS :是基于四层的转发。
HAproxy : 是基于四层和七层的转发,是专业的代理服务器。
Nginx :是 WEB 服务器,缓存服务器,⼜是反向代理服务器,可以做七层的转发。
Nginx 引⼊ 之后,也可以⽀持四层的转发。
区别
LVS 由于是基于四层的转发所以只能做端⼝的转发,⽽基于 URL 的、基于⽬录的这种转发 LVS 就做不了。
⼯作选择:
HAproxy 和 Nginx 由于可以做七层的转发,所以 URL 和⽬录的转发都可以做,在很⼤并发量的时候我们就要选择 LVS ,像中⼩型公司的话并发量没那么⼤选择 HAproxy 或者 Nginx ⾜已。
由于 HAproxy 由是专业的代理服务器配置简单,所以中⼩型企业推荐使⽤HAproxy 。
有些使⽤,使⽤ HAproxy 还是 Nginx ,也和公司运维对哪个技术栈的掌控程度。掌控 OK ,选择 Nginx 会更加不错。
另外,LVS + Nginx 和 LVS + HAProxy 也是⽐较常见的选型组合。
Squid、Varinsh、Nginx 有什么区别?
三者都实现缓存服务器的作⽤。所以,本问题所有的视⾓,都是在作为缓存服务器下来聊。
1、Nginx本来是反向代理/web服务器,⽤了插件可以做做这个副业(缓存服务器)。
但是本⾝不⽀持特性挺多,只能缓存静态⽂件。
2、从这些功能上,Varinsh 和 Squid 是专业的 Cache 服务,⽽Nginx 这些是第三⽅模块完成。
3、Varnish 本⾝的技术上优势要⾼于 Squid ,它采⽤了可视化页⾯缓存技术。
在内存的利⽤上,Varnis h⽐ Squid 具有优势,性能要⽐ Squid ⾼。
还有强⼤的通过 Varnish 管理端⼝,可以使⽤正则表达式快速、批量地清除部分缓存
Varnish 是内存缓存,速度⼀流,但是内存缓存也限制了其容量,缓存页⾯和图⽚⼀般是挺好的。
4、Squid 的优势在于完整的庞⼤的 cache 技术资料,和很多的应⽤⽣产环境。
⼯作选择:
要做 cache 服务的话,我们肯定是要选择专业的 cache 服务,优先选择Squid 或者 Varnish 。
请解释 Nginx 如何处理 HTTP 请求?
⾸先,Nginx 在启动时,会解析配置⽂件,得到需要监听的端⼝与 IP 地址,然后在 Nginx 的 Master
进程⾥⾯先初始化好这个监控的Socket(创建 S ocket,设置 addr、reuse 等选项,绑定到指定的 ip 地址端⼝,再 listen 监听)。
然后,再 fork(⼀个现有进程可以调⽤ fork 函数创建⼀个新进程。由 fork 创建的新进程被称为⼦进程 )出多个⼦进程出来。
之后,⼦进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与nginx进⾏三次握⼿,与 nginx 建⽴好⼀个连接后。此时,某⼀个⼦进程会 accept 成功,得到这个建⽴好的连接的 Socket ,然后创建 nginx 对连接的封装,即
ngx_connection_t 结构体。
接着,设置读写事件处理函数,并添加读写事件来与客户端进⾏数据的交换。
这⾥,还是有⼀些逻辑,继续在 问题中来看。
最后,Nginx 或客户端来主动关掉连接,到此,⼀个连接就寿终正寝了。
最后,Nginx 或客户端来主动关掉连接,到此,⼀个连接就寿终正寝了。
Nginx 是如何实现⾼并发的?
如果⼀个 server 采⽤⼀个进程(或者线程)负责⼀个request的⽅式,那么进程数就是并发数。那么显⽽易见的,就是会有很多进程在等待中。等什么?最多的应该是等待⽹络传输。其缺点胖友应该也感觉到了,此处不述。
思考下,Java 的 NIO 和 BIO 的对⽐哟。
⽽ Nginx 的异步⾮阻塞⼯作⽅式正是利⽤了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数⼏个进程就解决了⼤量的并发问题。
Nginx是如何利⽤的呢,简单来说:同样的 4 个进程,如果采⽤⼀个进程负责⼀个 request 的⽅式,那么,同时进来 4 个 request 之后,每个进程就负责其中⼀个,直⾄会话关闭。期间,如果有第 5 个request进来了。就⽆法及时反应了,因为 4 个进程都没⼲完活呢,因此,⼀般有个调度进程,每当新进来了⼀个 request ,就新开个进程来处理。
回想下,BIO 是不是存在酱紫的问题?嘻嘻。
Nginx 不这样,每进来⼀个 request ,会有⼀个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发⽣阻塞的地⽅,⽐如向上游(后端)服务器转发 request ,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册⼀个事件:“如果 upstream 返
回了,告诉我⼀声,我再接着⼲”。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种⽅式处理。⽽⼀旦上游服务器返回了,就会触发这个事件,worker 才会来接⼿,这个 request 才会接着往下⾛。
这就是为什么说,Nginx 基于事件模型。
由于 web server 的⼯作性质决定了每个 request 的⼤部份⽣命都是在⽹络传输中,实际上花费在 server 机器上的时间⽚不多。这是⼏个进程就解决⾼并发的秘密所在。即:
webserver 刚好属于⽹络 IO 密集型应⽤,不算是计算密集型。
⽽正如叔度所说的
nginx和apache区别异步,⾮阻塞,使⽤ epoll ,和⼤量细节处的优化。
也正是 Nginx 之所以然的技术基⽯。
为什么 Nginx 不使⽤多线程?
Apache: 创建多个进程或线程,⽽每个进程或线程都会为其分配 cpu 和内存(线程要⽐进程⼩的多,所以 worker ⽀持⽐ perfork ⾼的并发),并发过⼤会榨⼲服务器资源。
Nginx: 采⽤单线程来异步⾮阻塞处理请求(管理员可以配置 Nginx 主进程的⼯作进程的数量)(epoll),不会为每个请求分配 cpu 和内存资源,节省了⼤量资源,同时也减少了⼤量的 CPU 的上下⽂切换。所以才使得 Nginx ⽀持更⾼的并发。
Netty、Redis 基本采⽤相同思路。
什么是动态资源、静态资源分离?
动态资源、静态资源分离,是让动态⽹站⾥的动态⽹页根据⼀定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后我们就可以根据静态资源的特点将其做缓存操作,这就是⽹站静态化处理的核⼼思路。
动态资源、静态资源分离简单的概括是:动态⽂件与静态⽂件的分离。
为什么要做动、静分离?
在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等⽂件),这些不需要经过后台处理的⽂件称为静态⽂件,否则动态⽂件。
因此我们后台处理忽略静态⽂件。这会有⼈⼜说那我后台忽略静态⽂件不就完了吗?当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使⽤这种动静分离的策略去解决动、静分离将⽹站静态资源
(HTML,JavaScript,CSS,img等⽂件)与后台应⽤分开部署,提⾼⽤户访问静态代码的速度,降低对后台应⽤访问
这⾥我们将静态资源放到 Nginx 中,动态资源转发到 Tomcat 服务器中去。
当然,因为现在七⽜、阿⾥云等 CDN 服务已经很成熟,主流的做法,是把静态资源缓存到 CDN 服务中,从⽽提升访问速度。
相⽐本地的 Nginx 来说,CDN 服务器由于在国内有更多的节点,可以实现⽤户的就近访问。
并且,CDN 服务可以提供更⼤的带宽,不像我们⾃⼰的应⽤服务,提供的带宽是有限的。
什么叫 CDN 服务?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。