面试官常问的Nginx的几个问题

1.什么是Nginx?

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

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

 

2.为何要用Nginx?

优势:java

  • 跨平台、配置简单
  • 非阻塞、高并发链接:处理2-3万并发链接数,官方监测能支持5万并发
  • 内存消耗小:开启10个nginx才占150M内存 成本低廉:开源
  • 内置的健康检查功能:若是有一个服务器宕机,会作一个健康检查,再发送的请求就不会发送到宕机的服务器了。从新将请求提交到其余的节点上。
  • 节省宽带:支持GZIP压缩,能够添加浏览器本地缓存
  • 稳定性高:宕机的几率很是小
  • master/worker结构:一个master进程,生成一个或者多个worker进程
  • 接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求所有接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力
  • 一边接收web服务器的返回数据,一边发送给浏览器客户端
  • 网络依赖性比较低,只要ping通就能够负载均衡
  • 能够有多台nginx服务器
  • 事件驱动:通讯机制采用epoll模型

 

3.为何Nginx性能这么高?

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

 

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就开始“读取请求–解析请求–处理请求”,数据完全返回客户端以后(目标网页出如今电脑屏幕上),这个事件就算完全结束。web

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

 

5.为何不使用多线程?

由于线程建立和上下文的切换很是消耗资源,线程占用内存大,上下文切换占用cpu也很高,采用epoll模型避免了这个缺点浏览器

 

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

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

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

而后再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.负载均衡

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

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

 

原文:Java架构笔记

免费Java高级资料须要本身领取,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G。       
传送门:        https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q
相关文章
相关标签/搜索