文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

最近一直在更新关于Nginx的系列文章,终于将Nginx的几个关键知识点讲的差不多了。本篇作为Nginx系列的结尾篇幅,主要是列举一些面试时经常问到的Nginx知识点。其实Nginx适合提问的面试点并不多,问来问去基本都是类似的问题。接下来我们一起来看看Nginx基本的面试题。

Nginx的作用

这个问题是入门级知识点,讨论Nginx的用处。我觉得只要几个重要的点都回答到位就可以了,可以考虑这样的一个回答:Nginx是一个高性能web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。不仅可以实现负载均衡,还可以做接口限流,缓存等功能。

使用Nginx的优势点

  • Nginx由于使用了epoll和kqueue网路I/O模型,在实际生产环境能够支撑3万左右并发连接。

  • Nginx内存消耗低。

  • Nginx跨平台,而且配置相对来说难度较低。

  • Nginx内置健康检查功能,如果负载均衡其中一个服务器宕机了,则接受到的请求会发送给其他服务器去处理。

  • 支持Gzip压缩,可以添加浏览器本地缓存的Header头。

  • Nginx支持热部署,可以在不间断服务的情况下平滑进行配置的更改。

  • Nginx异步接收用户请求,减轻了Web服务器的压力。

Nginx如何实现高并发

这个问题出来可能懂一点Nginx的朋友们都是浮现出5个字:异步非阻塞。实际上Nginx就是异步非阻塞,使用了epoll模型并对底层代码进行大幅度优化。之前其实有讲过Nginx是采用1个master进程,多个worker进程的模式,每次接收到一个请求,master会将请求按照一定策略分发给一个worker进程去进行处理请求。worker进程数一般设置为和CPU核心数一致,异步非阻塞模式就会使得worker线程在等待请求callback的空闲时间可以接收处理新的请求,当接收到旧请求的callback时再回去继续处理该请求,这样就完成了少数几个worker进程却实现了高并发的问题。

Nginx为何不使用多线程?

众所周知,没创建一个新的线程,都需要为其分配cpu和内存。当然,创建进程也是一样,但是由于线程过多会导致内存消耗过多。所以Nginx采用单线程异步处理用户请求,这样不需要不断地为新的线程分配cpu和内存,减轻服务器内存消耗,所以使得Nginx性能方面更为高效。

Nginx如何处理请求?

Nginx启动后,首先进行配置文件的解析,解析成功会得到虚拟服务器的ip和端口号,在主进程master进程中创建socket,对addrreuse选项进行设置,并将socket绑定到对应的ip地址和端口并进行监听。然后创建子进程worker进程,当客户端和Nginx进行三次握手,则可以创建成功与Nginx的连接。当有新的请求进入时,空闲的worker进程会竞争,当某一个worker进程竞争成功,则会得到这个已经成功建立连接的socket,然后创建ngx_connection_t结构体,接下来设置读写事件处理函数并添加读写事件用来与客户端进行数据交换。当请求结束Nginx或者客户端主动关闭连接,此时一个请求处理完毕。

为什么要做动静分离?

在日常开发中,前端请求静态文件比如图片资源是不需要经过后端服务器的,但是调用API这些类型的就需要后端进行处理请求,所以为了提高对资源文件的响应速度,我们应该使用动静分离的策略去做架构。我们可以将静态文件放到Nginx中,将动态资源的请求转发到后端服务器去进行进一步的处理。

Nginx负载均衡的几种常用方式?

轮询方式:默认情况下Nginx使用轮询的方式实现负载均衡,每个新的请求按照时间顺序逐一分配到不同的后端服务器去进行处理,如果后端服务器宕机,则Nginx的健康检查功能会将这个后端服务器剔除。但是轮询方式是显而易见的:可靠性低而且负载分配不平衡,所以轮询方式更适用于图片服务器或者静态资源服务器。

  • weight:可以对不同的后端服务器设置不同的权重比例,这样可以改变不同后端服务器处理请求的比例。可以给性能更优的后端服务器配置更高的权重。

  • ip_hash:这种方式会根据请求的ip地址的hash结果分配后端服务器来处理请求,这样每个用户发起的请求固定只会由同一个后端服务器处理,这样可以解决session问题。

  • fail:这种方式有点类似于轮询方式,主要是根据后端服务器的响应时间来分配请求,响应时间短的后端服务器优先分配请求。

  • url_hash:这种方式是按照请求url的hash结果来将不同请求分配到不同服务器,使用这种方式每个url的请求都会由同一个后端服务器进行处理,后端服务器为缓存时效率会更高。

Session不同步如何处理?

上面其实提过了解决方案,负载均衡方式使用ip_hash方式,如果用户已经访问过某个后端器,则再次访问时会将这个请求的ip地址进行哈希算法转换,自动定位到该服务器。当然也可以通过redis缓存用户session,一样可以处理session不同步的问题。

Nginx常用优化配置

  1. 调整worker_processes指定Nginx需要创建的worker进程数量,刚才有提到worker进程数一般设置为和CPU核心数一致。

  2. 调整worker_connections设置Nginx最多可以同时服务的客户端数。结合worker_processes配置可以获得每秒可以服务的最大客户端数。

  3. 启动gzip压缩,可以对文件大小进行压缩,减少了客户端http的传输带宽,可以大幅度提高页面的加载速度。

  4. 启用缓存,如果请求静态资源,启用缓存是可以大幅度提升性能的。关于启用缓存可以观看Nginx缓存这篇文章:Nginx缓存原理及机制

Nginx正向代理

正向代理也是大家最常接触的到的代理模式,那究竟什么是正向代理呢?我们都知道Google在国内是无法正常访问的,但是某些时候我们由于技术问题需要去访问Google时,我们会先找到一个可以访问Google的代理服务器,我们将请求发送到代理服务器,代理服务器去访问Google,然后将访问到的数据返回给我们,这样的过程就是正向代理。正向代理最大的特点是客户端需要明确知道要访问的服务器地址,Google服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,正向代理可以隐藏真实客户端的具体信息。

客户端必须设置正向代理服务器,而且需要知道正向代理服务器的IP地址以及代理程序的端口。一句话来概括就是正向代理代理的是客户端,是一个位于客户端和Google服务器之间的服务器,为了从Google服务器取得数据,客户端向代理服务器发送一个请求并指定目标(Google服务器),然后代理向原始服务器转交请求并将获得的数据返回给客户端。总结正向代理的几个作用:

  • 访问国外无法访问的网站做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证代理
  • 可以记录用户访问记录(上网行为管理),对外隐藏用户信息

Nginx反向代理

多个客户端给服务器发送的请求,Nginx服务器接收到请求以后,按照一定的规则转发到不同的服务器进行业务逻辑处理,也就是我们刚才讲到的负载均衡的策略。此时请求来源于哪个客户端是确定的,但是请求由哪台服务器处理的并不明确,Nginx扮演的就是一个反向代理角色。可以这样来理解,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。反向代理代理的是服务端,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。总结下反向代理的两个作用:

  • 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网

  • 负载均衡,通过反向代理服务器来优化网站的负载

Nginx中正向代理与反向代理的区别

  1. 在正向代理中,隐藏了请求来源的客户端信息;

  2. 在反向代理中,隐藏了请求具体处理的服务端信息;

欢迎关注我的个人公众号:程序猿周先森

Nginx--面试基础必会的更多相关文章

  1. iOS 面试基础题目

    转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...

  2. 第4节:Java基础 - 必知必会(中)

    第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...

  3. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  4. 一些iOS面试基础题总结

    一些iOS面试基础题总结 目录 多线程 AutoLayout objc_msgSend Runtime 消息转发 Category NSObject 与 objc_class Runloop Auto ...

  5. nginx 的基础配置[转]

    nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报   目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...

  6. 10个经典的C语言面试基础算法及代码

    10个经典的C语言面试基础算法及代码作者:码农网 – 小峰 原文地址:http://www.codeceo.com/article/10-c-interview-algorithm.html 算法是一 ...

  7. nginx的基础应用

    nginx的基础应用 一.简介 今天我们将介绍一些nginx的简单应用,启动.停止nginx,重载nginx的配置,nginx配置文件的格式,如何配置nginx服务静态资源,如何配置nginx作为反向 ...

  8. nginx的基础应用(续)

    nginx的基础应用(续) 一.简介 上一篇文章我们介绍了nginx的基础应用,其中讲到了nginx作为代理服务器的使用,但是漏了一个重要的,也是使用非常普遍的特性--负载均衡.今天,我们将这段内容补 ...

  9. 快速掌握JavaScript面试基础知识(三)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

  10. 快速掌握JavaScript面试基础知识(二)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

随机推荐

  1. QFramework 使用指南 2020(二):下载与版本介绍

    目前 QFramework 有两个可供安装的版本 PackageKit:QFramework 的插件平台,可以下载只感兴趣的插件,除了 Framework 模块还有一些 Shader 案例.项目模板. ...

  2. nginx配置ssl证书实现https加密请求详解

    原文链接:http://www.studyshare.cn/software/details/1175/0 一.加密方式 1.对称加密 所谓对称加密即:客户端使用一串固定的秘钥对传输内容进行加密,服务 ...

  3. 几图理解BeautifulSoup

  4. 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)

    </pre><pre name="code" class="cpp">/* Theme:八皇后(非递归) Coder:秒针的声音 Tim ...

  5. C#ORM中的对象映射

    使用Linq.Expressions来动态生成映射方法 1.我们先写个简单的类Test,包含一个ID和Name. public class Test { public int? ID { get; s ...

  6. CSS3-------弹簧特效

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 怒改springMVC项目为springBoot项目

    背景:公司最近在做项目升级,融合所有项目,但是目前使用的一个系统还是最原始的框架 springMVC+spring+mybatis ,前端还是jsp,easyui(技术老的掉牙),终于出手了,结果.. ...

  8. 初识JAVA语言

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321 前言        很多游戏开发者可能会有疑问,你会C#,JS,TS,为什么还要初识JAVA呢?有人可能会说,多学点对自己有好处 ...

  9. 浅谈jQuery中的Ajax

    浅谈jQuery中的Ajax 一.前言 jQuery 对 Ajax 操作进行了封装, 在 jQuery 中最底层的方法时 $.ajax(), 第二层是 load(), $.get() 和 $.post ...

  10. MSIL实用指南-比较运算

    数值的比较就是大于.小于.等于.大于等于.小于等于.不等于,它们的运算结果都是布尔值.大于.小于.等于有直接对应的指令,分别是Cgt.Clt.Ceq.大于等于.小于等于.不等于没有直接对应的指令,它的 ...