Java面试题冲刺第二十二天-- Nginx

目录
  • 面试题1:谈一下你对 Nginx 的理解
    • 为啥我们总说Nginx好用?
    • 追问1:正向代理和反向代理区别在哪?
      • 正向代理
  • 面试题2:常用的 Nginx 做负载均衡的策略有哪些?
    • 1.指定权重(weight)轮询(默认,常用):
    • 2、ip_hash(常用):
    • 3、least_conn:
    • 4、fair(第三方)
  • 面试题3:说几个你常用的 nginx 命令吧
  • 总结

面试题1:谈一下你对 Nginx 的理解

Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。 Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 也可以作为反向代理进行负载均衡的实现,在分布式火热的今天,Nginx是再好不过的选择。

为啥我们总说Nginx好用?

  • Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接;
  • 高度的模块化和自由软件许可证使得第三方模块(插件)层出不穷(开源时代的产物);
  • Nginx是跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上;

追问1:正向代理和反向代理区别在哪?

说到代理,我们要明确一个概念,所谓代理就是一个代表、一个渠道;

其实,正向代理和反向代理的关键不同点在于是否处于同一个网络环境下,我们往下看。

正向代理

如今的互联网公司基本都在使用内网开发,如果晚上我在家打着王者农药排位,这边领导打电话过来让我处理bug,我该怎么办?

不接,就当没听见,打完排位再说;恳切告知队友领导发病了,需要给她做人工呼吸,请勿举报~

注:如果领导也玩儿王者,那这道题就变成了失业题,请果断选二。

好了,有点跑偏了,这时我们打开电脑,肯定无法直接访问内网,因为不是同一个网络,这时就需要一个能访问内网(策略放开)的代理服务器,我们将请求发送给代理服务器,然后再将访问到的数据返回给我们;或直接通过代理服务器访问公司内网,然后改bug。我们通过这样的代理服务器访问内网的形式,就是主动代理,代理客户端去访问其他网络。如图:

这种代理模式称为正向代理,正向代理最大的特点是客户端明确要访问的服务器地址(或网络地址);而服务器只清楚请求来自哪个代理服务器,却不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。

正向代理,代理的是客户端,代客户端发出请求,是一个位于客户端和目标服务器间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标(内网服务器),然后代理向目标服务器转交请求并将获得的内容返回给客户端。

正向代理的用途:

  • 访问原来无法访问的资源,如外网、办公内网
  • 可以做缓存,加速访问资源
  • 对客户端访问授权,上网进行认证
  • 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息 反向代理

一说起反向代理,大家会不约而同的想到分布式部署。是的,反向代理通常使用在分布式架构中。在客户端明确的前提下,大量访问请求(QPS)涌入。我们后台通过Nginx代理了20个服务器,高QPS打进来后先打到Nginx中,通过Nginx的负载均衡来把请求分发给这20台服务器,减轻了单台服务器负担。这种客户端 → Nginx → 服务器 的模式称为反向代理,如下图:

N个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则均衡分发给了后端的业务处理服务器进行处理了。此时,请求的客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理,它代理的是服务端,代服务端接收请求,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

反向代理的作用:

(1)保证内网的安全,通常将反向代理服务器配置为公网访问地址,代理的Web服务器是内网IP。

(2)负载均衡,通过反向代理服务器来优化每个单机服务实例的负载。

正向代理中,Proxy和Client同属于一个网,隐藏了客户端信息;反向代理中,Proxy和Server同属于一个网,隐藏了服务端信息;

面试题2:常用的 Nginx 做负载均衡的策略有哪些?

1.指定权重(weight)轮询(默认,常用):

指定轮询几率,可以给不同的后端服务器设置一个权重值(weight),weight和访问比率成正比,接收到的请求按照权重分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。

这种方式用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的,多用于后端服务器性能不均的情况。

upstream dynamic_tsingxin {
    #ip地址1服务器的访问概率:30%
    server ip地址1 weight=3;
    #ip地址2服务器的访问概率:70%
    server ip地址2 weight=7;
}

2、ip_hash(常用):

上述方式存在一个问题,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,由于负载均衡,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,Session信息就丢失了!

这种情况可以采用ip_hash指令解决,如果客户已经访问了某个服务器A,当用户再次访问时,会将请求按访问IP的hash结果分配,自动定位到该服务器A。这样每个访客IP会固定访问一个后端服务器,可以解决session不能跨服务器的问题。

upstream dynamic_tsingxin {
    ip_hash;    #保证每个访客固定访问一个后端服务器
    server ip地址1;
    server ip地址2;
}

3、least_conn:

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn就可以达到更好的负载均衡效果。

upstream dynamic_tsingxin {
    least_conn;    #把请求转发给连接数较少的后端服务器
    server ip地址1;
    server ip地址2;
}

4、fair(第三方)

智能调整调度算法,动态根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;

需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块。

upstream dynamic_tsingxin {
    server ip地址1;
    server ip地址2;
    fair;    #实现响应时间短的优先分配
}

面试题3:说几个你常用的 nginx 命令吧

命令 作用
nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,热部署
nginx -s stop #强制停止Nginx服务,类似kill -9 pid
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务),类似kill pid
nginx -V #显示版本和配置选项信息,然后退出
nginx -t #检测配置文件是否有语法错误,然后退出

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java面试题冲刺第二十四天--并发编程

    目录 面试题1:说一下你对ReentrantLock的理解? CAS: AQS: 追问1:你认为 ReentrantLock 相比 synchronized 都有哪些区别? 面试题2:解释一下公平锁和非公平锁? 面试题3:能详细说一下CAS具体实现原理么? 追问1:那CAS的缺陷有哪些呢? 1.ABA: 2.自旋消耗资源: 3.多变量共享一致性问题: 追问2:讲一下什么是ABA问题?怎么解决? 总结 面试题1:说一下你对ReentrantLock的理解? ReentrantLock是JDK1.5

  • Java面试题冲刺第二十天--手撸算法

    目录 手撸算法1:查找数组中重复元素和重复元素的个数 1. 两层循环比较方式 2. 转成Map集合处理方式 手撸算法2:写个二分查找demo吧 手撸算法3:把两个有序数组合并成一个有序数组 总结 手撸算法1:查找数组中重复元素和重复元素的个数 当听让我写这个算法时,纸笔还没给到我手上,作为一个资深MySQL爱好者,瞬间从裤裆掏出一杆笔,打个哈欠的功夫,就在面试官脸上写下了: select num,count(num) from T group by num order by count(num)

  • Java面试题冲刺第二十一天--JVM

    目录 面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的? Java heap space GC overhead limit exceeded Permgen space Metaspace Unable to create new native thread Out of swap space? Kill process or sacrifice child Requested array size exceeds VM limit Direct buffer memory 面试题

  • Java面试题冲刺第二十三天--算法(2)

    目录 面试题1:你说一下常用的排序算法都有哪些? 追问1:谈一谈你对快排的理解吧 追问2:说一下快排的算法原理 追问3:来吧!给我手敲一个快排 面试题2:来!再给我手撸一个Spring 追问1:哦,咳咳-说一下构成递归的前提条件有啥? 追问2:递归都有哪些优缺点? 追问3:给我手写一个简单的递归算法的实现吧 面试题3: 10亿个数中找出最大的100000个数(top K问题) 总结 面试题1:你说一下常用的排序算法都有哪些? 追问1:谈一谈你对快排的理解吧 快速排序,顾名思义就是一种以效率快为特

  • Java面试题冲刺第二十三天--分布式

    目录 面试题1:说说什么分布式事务?解释一下什么是CAP? CAP理解: 追问1:怎么理解强一致性.弱一致性和最终一致性? 面试题2:了解BASE理论么? 追问1:基于BASE理论,举几个实际的例子 面试题3:实现分布式事务一致性(Consistency)的方法有哪些? 追问1:说一下二阶段提交(2PC)的原理吧 总结 面试题1:说说什么分布式事务?解释一下什么是CAP? 现在互联网开发多使用微服务架构,一个简单的操作,在服务端可能就是由多个服务和数据库实例协同完成的.但在一致性要求较高且高QP

  • Java面试题冲刺第二十二天-- Nginx

    目录 面试题1:谈一下你对 Nginx 的理解 为啥我们总说Nginx好用? 追问1:正向代理和反向代理区别在哪? 正向代理 面试题2:常用的 Nginx 做负载均衡的策略有哪些? 1.指定权重(weight)轮询(默认,常用): 2.ip_hash(常用): 3.least_conn: 4.fair(第三方) 面试题3:说几个你常用的 nginx 命令吧 总结 面试题1:谈一下你对 Nginx 的理解 Nginx 是一款自由的.开源的.高性能的 HTTP 服务器和反向代理服务器:同时也是一个

  • Java面试题冲刺第二十五天--实战编程2

    目录 面试题2:怎么理解负载均衡的?你处理负载均衡都有哪些途径? 1.[协议层]http重定向 2.[协议层]DNS轮询 3.[协议层]CDN 4.[协议层]反向代理负载均衡 5.[网络层]IP负载均衡 面试题3:你平时是怎样定位线上问题的? 总结 面试题1:当你发现一条SQL很慢,你的处理思路是什么? 发现Bug 确定Bug不是自己造成的,如果无法确定,不要理会步骤1 向组内宣传"程序里有一个未知Bug,错不在我" 谁响应,谁对Bug负责 没人响应,就要求特定人员配合调试 如果不配合

  • Java面试题冲刺第二十六天--实战编程2

    目录 面试题2:怎么理解负载均衡的?你处理负载均衡都有哪些途径? 1.[协议层]http重定向 2.[协议层]DNS轮询 3.[协议层]CDN 4.[协议层]反向代理负载均衡 5.[网络层]IP负载均衡 面试题3:你平时是怎样定位线上问题的? 总结 面试题1:当你发现一条SQL很慢,你的处理思路是什么? 发现Bug 确定Bug不是自己造成的,如果无法确定,不要理会步骤1 向组内宣传"程序里有一个未知Bug,错不在我" 谁响应,谁对Bug负责 没人响应,就要求特定人员配合调试 如果不配合

  • Java面试题冲刺第二十六天--实战编程

    目录 面试题1:你们是怎样保存用户密码等敏感数据的? 面试题2:怎么控制用户请求的幂等性的? 1.设置唯一索引:防止新增脏数据 2.token机制:防止页面重复提交 3.悲观锁 4.乐观锁 5.分布式锁 面试题3:你们是如何预防SQL注入问题的? 预防方式: 1.PreparedStatement(简单有效) 2.使用正则表达式过滤传入的参数 3.使用正则表达式过滤传入的URL 总结 面试题1:你们是怎样保存用户密码等敏感数据的? 本题回答参考朱晔的<Java业务开发常见错误100例> 我们知

  • Java面试题冲刺第二十五天--并发编程3

    目录 面试题1:你了解线程池么?简单介绍一下. 追问1:连接池 和 线程池是一个意思么?有什么区别? 不同点 面试题2:线程池中核心线程数量大小你是怎么设置的? 追问1:核心线程数量过大或过小会造成什么后果? 面试题3:线程池都有哪些状态呀? 追问1:什么条件下会进入TERMINATED状态 总结 面试题1:你了解线程池么?简单介绍一下. java提供的一个java.util.concurrent.Executor接口的实现用于创建线程池. 线程池是一种多线程处理形式,处理过程中将任务提交到线程

  • Java面试题冲刺第二十五天--JVM2

    目录 面试题1:简单说一下java的垃圾回收机制. 面试题2:JVM会在什么时候进行GC呢? 追问1:介绍一下不同代空间的垃圾回收机制 追问2:能说一下新生代空间的构成与执行逻辑么? 追问3:说一下发生OOM时,垃圾回收机制的执行流程. 面试题3:Full GC .Major GC和 Minor GC有什么不同 (1)Minor GC / Young GC (2)Old GC (3)Full GC (4)Major GC (5)Mixed GC 总结 面试题1:简单说一下java的垃圾回收机制.

  • Java面试题冲刺第二十八天--数据库(5)

    目录 面试题1:MySQL数据库cpu飙升到500%的话你会怎么处理? 面试题2:什么是存储过程?有哪些优缺点 优点 在数据库中集中业务逻辑 使数据库更安全 较快的执行速度 缺点 不可移植性 复杂存储过程消耗资源多 故障排除难 维护成本高 面试题3:比如有个用户表,身份证号字段唯一,那么基于这个字段建索引的话,从效率上讲,你会有哪些考虑呢? 总结 面试题1:MySQL数据库cpu飙升到500%的话你会怎么处理? 当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysql

  • Java面试题冲刺第二十九天--JVM3

    目录 面试题1:如何判断对象是否存活 1.引用计数算法 2.可达性分析算法 面试题2:哪些对象可以作为GC Roots? 面试题3:你了解的对象引用方式都有哪些? 1 强引用 2 软引用 3 弱引用 4 虚引用 总结 面试题1:如何判断对象是否存活 对于判断对象是否存活,主要是两种基本算法,引用计数和可达性分析,目前java主要采用的是可达性分析算法 1.引用计数算法 判断对象是否存活的方式如:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用失效时,计数器值就减一:任何

随机推荐