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

最近一直在更新关于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. Nacos(一):Nacos介绍

    前言 6月份阿里开源的Nacos出了1.0.1版本,从去年7月份第一个release版本到现在一直在默默关注 官方的版本规划为:Nacos从0.8.0开始支持生产可用,1.0版本可大规模生产可用,2. ...

  2. 初学html总结

    2019-08-17 17:58:49 html:超文本标记语言,用于网页结构的搭建 html语言构成:由标签.属性.属性值构成 标签:" < "后面第一个单词 属性:标签后 ...

  3. nginx单机1w并发优化

    目录 ab工具 整体优化思路 具体的优化思路 编写脚本完成并发优化配置 性能统计工具 tips 总结 ab工具 ab -c 10000 -n 200000 http://localhost/index ...

  4. Vmware启动ubuntu 出现错误。

    Vmware启动ubuntu 出现错误“以独占方式锁定此配置文件失败. 可能其它正在运行VMware进程在使用此配置文件”. 在网上查找了很多方法,法(1)试过在启动任务管理器中“结束与VMware有 ...

  5. 答辩过了,但我知道我写的是一坨shi

    如果时间可以重来, 请好好珍惜大学里最重要的一份答卷. 以后的你会发现, 这种完全独立做出科研成果的机会, 可能不会再有. 1.保研了,才发现科研是多么难的一件事. 一直以来,读的喜欢的专业,考试成绩 ...

  6. 《快照读、当前读和MVCC》

    1.快照读 快照读是基于 MVCC 和 undo log 来实现的,适用于简单 select 语句,避免了幻读. 读已提交:一个事务内操作一条数据,可以查询到另一个已提交事务操作同一条数据的最新值.( ...

  7. iOS Autoresizing Autolayout Size classes

    Autoresizing:出现最早,仅仅能够针对父控件做约束(注意:要关闭Autolayout&Size classes才能够看到Autoresizing) 代码对应: UIView.h中的a ...

  8. 【selenium】- selenium IDE的安装以及使用

    本文由小编根据慕课网视频亲自整理,转载请注明出处和作者. 1. 自动化测试工程师的任务 一个合格的自动化测试工程师,需要把框架搭建起来.让不是自动化测试的人,一个普通功能化测试的人,可以完成自动化测试 ...

  9. hdu-6601 Keen On Everything But Triangle

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=6601 Description N sticks are arranged in a row, and ...

  10. HDU 6346 整数规划 二分图匹配最优解

    整数规划 原来的km+hunger跑法T了, 拿了一个新的板子, 新的写法是将这原来的找新的最小的d放在了上一次的残留图上,从而减小复杂度, 但是个人还不是很理解为什么最小的d下一次出现的位置一定是这 ...