关于java:Nginx常见的面试题限流正向反向代理负载均衡策略

1、什么是Nginx,谈谈集体都了解,我的项目中是否用到,为什么要用,有什么长处?

Nginx ,是一个 Web 服务器和反向代理服务器用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协定。

次要性能如下:

1、正向、反向代理
2、负载平衡、分流
3、虚拟主机(绑定host)

长处:

跨平台、配置简略,非阻塞、高并发连贯、内存耗费小、老本低廉。

2、正向代理和反向代理的区别是什么?

正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定原始服务器,而后代理向原始服务器转交申请并将取得的内容返回给客户端。代理服务器和客户端处于同一个局域网内。

比如说fanqiang。我晓得我要拜访谷歌,于是我就通知代理服务器让它帮我转发。

反向代理理论运行形式是代理服务器承受网络上的连贯申请。它将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给网络上申请连贯的客户端 。代理服务器和原始服务器处于同一个局域网内。

比如说我要拜访taobao,对我来说不晓得图片、json、css 是不是同一个服务器返回回来的,然而我不关怀,是反向代理 解决的,我不晓得原始服务器。

3、Nginx如何解决HTTP申请的?

它联合多过程机制(单线程)和异步非阻塞形式。

1、多过程机制(单线程)

服务器每当收到一个客户端时,就有 服务器主过程 ( master process )生成一个 子过程( worker process )进去和客户端建设连贯进行交互,直到连贯断开,该子过程就完结了。

2、异步非阻塞机制

每个工作过程 应用 异步非阻塞形式 ,能够解决 多个客户端申请 。 使用了epoll模型,提供了一个队列,排队解决。

当某个 工作过程 接管到客户端的申请当前,调用 IO 进行解决,如果不能立刻失去后果,就去 解决其余申请 (即为 非阻塞 );而 客户端 在此期间也 无需期待响应 ,能够去解决其余事件(即为 异步 )。

当 IO 返回时,就会告诉此 工作过程 ;该过程失去告诉,临时 挂起 以后解决的事务去 响应客户端申请 。

为什么这么快?能够参考一下Nginx官网介绍:http://www.aosabook.org/en/ng…

4、Nginx的master和worker是如何工作的?

这跟Nginx的多过程、单线程无关。(一个过程只有一个主线程)。

为什么要用单线程?

采纳单线程来异步非阻塞解决申请(管理员能够配置Nginx主过程的工作过程的数量),不会为每个申请调配cpu和内存资源,节俭了大量资源,同时也缩小了大量的CPU的上下文切换,所以才使得Nginx反对更高的并发。

简略过程:

主程序 Master process 启动后,通过一个 for 循环来 接管 和 解决内部信号 ;

主过程通过 fork() 函数产生 worker 子过程 ,每个子过程执行一个 for循环来实现Nginx服务器对事件的接管和解决 。

具体过程:

1、Nginx 在启动后,会有一个 master 过程和多个互相独立的 worker 过程。
2、master 接管来自外界的信号,先建设好须要 listen 的 socket(listenfd) 之后,而后再 fork 出多个 worker 过程,而后向各worker过程发送信号,每个过程都有可能来解决这个连贯。
3、所有 worker 过程的 listenfd 会在新连贯到来时变得可读 ,为保障只有一个过程解决该连贯,所有 worker 过程在注册 listenfd 读事件前抢占 accept_mutex ,抢到互斥锁的那个过程注册 listenfd 读事件 ,在读事件里调用 accept 承受该连贯。
4、当一个 worker 过程在 accept 这个连贯之后,就开始读取申请、解析申请、解决申请,产生数据后,再返回给客户端 ,最初才断开连接。

5、Nginx 常用命令有哪些?

  • 启动 nginx
  • 进行 nginx -s stopnginx -s quit
  • 重启 nginx -s reloadservice nginx reload
  • 重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf
  • 查看 nginx 版本 nginx -v

6、nginx中500、502、503、504 有什么区别?

500

Internal Server Error 外部服务谬误,比方脚本谬误,编程语言语法错误。

502

Bad Gateway谬误,网关谬误。比方服务器以后连贯太多,响应太慢,页面素材太多、带宽慢。

503

Service Temporarily Unavailable,服务不可用,web服务器不能解决HTTP申请,可能是长期超载或者是服务器进行停机保护。

504

Gateway timeout 网关超时,程序执行工夫过长导致响应超时,例如程序须要执行20秒,而nginx最大响应等待时间为10秒,这样就会呈现超时。

7、Nginx 压缩理解吗,如何开启压缩?

开启nginx gzip压缩后,图片、css、js等动态资源的大小会减小,可节俭带宽,进步传输效率,然而会耗费CPU资源。

开启:

    # 开启gzip
    gzip off;

    # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
    gzip_min_length 1k;

    # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU工夫,前面会有具体阐明
    gzip_comp_level 1;

    # 进行压缩的文件类型。javascript有多种形式。其中的值能够在 mime.types 文件中找到。
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;

8、Nginx 和 Apache、Tomcat 之间的不同点

1、Nginx/Apache 是Web Server,而Apache Tomact是一个servlet container
2、tomcat能够对jsp进行解析,nginx和apache只是web服务器,能够简略了解为只能提供html动态文件服务。

Nginx和Apache区别:

1)Nginx轻量级,同样起web 服务,比apache占用更少的内存及资源 。

2)Nginx 抗并发,nginx 解决申请是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能放弃低资源低消耗高性能 。

3)Nginx提供负载平衡,能够做做反向代理,前端服务器

4)Nginx多过程单线程,异步非阻塞;Apache多进程同步,阻塞。

9、Nginx 有哪些负载平衡策略

Nginx 默认提供的负载平衡策略:

  • 1、轮询(默认)round_robin

    每个申请按工夫程序逐个调配到不同的后端服务器,如果后端服务器 down 掉,能主动剔除。

  • 2、IP 哈希 ip_hash

    每个申请按拜访 ip 的 hash 后果调配,这样每个访客固定拜访一个后端服务器,能够解决 session 共享的问题。

    当然,理论场景下,个别不思考应用 ip_hash 解决 session 共享。

  • 3、起码连贯 least_conn

    下一个申请将被分派到流动连贯数量起码的服务器

  • 4、权重 weight

    weight的值越大调配到的拜访概率越高,次要用于后端每台服务器性能不平衡的状况下,达到正当的资源利用率。

还能够通过插件反对其余策略。

10、Nginx动动态资源拆散做过吗,为什么要这样做?

动静资源、动态资源拆散,是让动静网站里的动静网页依据肯定规定把不变的资源和常常变的资源辨别开来 路。

比如说 js、css、hrml从A服务器返回。图片 从B服务器返回,其余申请从Tomcat服务器C返回。

后盾利用离开部署,进步用户拜访动态代码的速度。而且当初还有CDN服务,不须要限度于服务器的带宽。

11、ngx_http_upstream_module模块理解吗?

ngx_http_upstream_module模块用于将多个服务器定义成服务器组,可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来援用的服务器组。

比方拜访www.a.com 缓存+调度:

http{
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_si #缓存
ze=1g;
    upstream mysqlsrvs{
        ip_hash; #源地址hash调度办法 写了backup就不可用
        server 172.18.99.1:80 weight=2; #weight权重
        server 172.18.99.2:80;          #标记down,配合ip_hash应用,实现灰度公布
        server 172.18.99.3:80 backup;   #backup将服务器标记为“备用”,即所有服务器均不可用时才启用 
    }
}
server{
    server_name www.a.com;
    proxy_cache proxycache;
    proxy_cache_key $request_uri;
    proxy_cache_valid 200 302 301 1h;
    proxy_cache_valid any 1m;
    location / {
        proxy_pass http://mysqlsrvs;
    }
}

12、限流理解吗,怎么限流的?

Nginx 提供两种限流形式,一是管制速率,二是管制并发连接数。

1、管制速率

ngx_http_limit_req_module 模块提供了漏桶算法(leaky bucket),能够限度单个IP的申请解决频率。

如:

1.1 失常限流:

http {
limit_req_zone 192.168.1.1 zone=myLimit:10m rate=5r/s;
}

server {
location / {
limit_req zone=myLimit;
rewrite / http://www.hac.cn permanent;
}
}

参数解释:

key: 定义须要限流的对象。
zone: 定义共享内存区来存储访问信息。
rate: 用于设置最大拜访速率。

示意基于客户端192.168.1.1进行限流,定义了一个大小为10M,名称为myLimit的内存区,用于存储IP地址访问信息。rate设置IP拜访频率,rate=5r/s示意每秒只能解决每个IP地址的5个申请。Nginx限流是依照毫秒级为单位的,也就是说1秒解决5个申请会变成每200ms只解决一个申请。如果200ms内曾经解决完1个申请,然而还是有有新的申请达到,这时候Nginx就会回绝解决该申请。

1.2 突发流量限度拜访频率

下面rate设置了 5r/s,如果有时候流量忽然变大,超出的申请就被回绝返回503了,突发的流量影响业务就不好了。

这时候能够加上burst 参数,个别再联合 nodelay 一起应用。

server {
location / {
limit_req zone=myLimit burst=20 nodelay;
rewrite / http://www.hac.cn permanent;
}
}

burst=20 nodelay 示意这20个申请立马解决,不能提早,相当于特事特办。不过,即便这20个突发申请立马解决完结,后续来了申请也不会立马解决。burst=20 相当于缓存队列中占了20个坑,即便申请被解决了,这20个地位这只能按 100ms一个来开释。

2、管制并发连接数

ngx_http_limit_conn_module 提供了限度连接数性能。

limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;

server {
    ...
    limit_conn perip 10;
    limit_conn perserver 100;
}

limit_conn perip 10 作用的key 是 $binary_remote_addr,示意限度单个IP同时最多能持有10个连贯。

limit_conn perserver 100 作用的key是 $server_name,示意虚拟主机(server) 同时能解决并发连贯的总数。

注:limit_conn perserver 100 作用的key是 $server_name,示意虚拟主机(server) 同时能解决并发连贯的总数。

拓展:

如果不想做限流,还能够设置白名单:

利用 Nginx ngx_http_geo_modulengx_http_map_module 两个工具模块提供的性能。

##定义白名单ip列表变量
geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/10 0;
    81.56.0.35 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}
# 失常限流设置
limit_req_zone $limit_key zone=myRateLimit:10m rate=10r/s;

geo 对于白名单 将返回0,不限流;其余IP将返回1,进行限流。

具体参考:http://nginx.org/en/docs/http…

除此之外:

ngx_http_core_module 还提供了限度数据传输速度的能力(即常说的下载速度)

location /flv/ {
    flv;
    limit_rate_after 500m;
    limit_rate       50k;
}

针对每个申请,示意客户端下载前500m的大小时不限速,下载超过了500m后就限速50k/s。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理