Nginx面试题及答案总结(19道常见必考题)

Nginx面试题及答案总结(19道常见必考题)-mikechen

Nginx是Java面试经常问到的内容,今天给大家总结了常见的Nginx的面试题及答案,希望对大家有所帮助@mikechen

什么是Nginx?

Nginx是一个高性能的HTTP和反向代理服务器,特点是占用内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现好。

Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。

 

Nginx的应用场景?

1、http服务器

Nginx是一个http服务可以独立提供http服务,可以做网页静态服务器。

2、虚拟主机

可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。

3、反向代理,负载均衡

当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。

并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。

4、Nginx中也可以配置安全管理

比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。

以上就是nginx应用场景有哪些?的详细内容,更多请关注php中文网其它相关文章!

 

Nginx的优缺点?

1.Nginx的优点

  • 占内存小,可实现高并发连接,处理响应快;
  • 可实现http服务器、虚拟主机、方向代理、负载均衡;
  • Nginx配置简单;
  • 可以不暴露正式的服务器IP地址。

 

2.Nginx的缺点

1)动态处理差

nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求。

2)rewrite弱

虽然nginx支持rewrite功能,但是相比于Apache来说,Apache比nginx 的rewrite 强大。

 

Nginx与Apache的区别?

1、作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。

在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一.,能够支持高达 50000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型。

2、Nginx 配置简洁, Apache 复杂 ,Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 . Nginx 静态处理性能比 Apache 高 3倍以上 ,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多。

3、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 。

4、nginx的优势是处理静态请求,cpu内存使用率低,apache适合处理动态请求,所以现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求。

 

nginx 相对 apache 的优点:

  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊
  • Nginx本身就是一个反向代理服务器
  • Nginx支持7层负载均衡
  • nginx 适合做静态,简单,效率高

apache 相对nginx 的优点:

  • rewrite ,比nginx 的rewrite 强大
  • 模块超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相对较多
  • 超稳定
  • apache 适合做动态,稳定,功能强

 

什么是正向代理与反向代理?

1)正向代理

正向代理就是一个人发送一个请求直接就到达了目标的服务器。

2)反向代理

反方代理就是请求统一被Nginx接收,nginx反向代理服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。

反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

 

为什么Nginx性能这么高?

因为他的事件处理机制:异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决。

 

为什么 Nginx 不使用多线程?

Apache: 创建多个进程或线程,而每个进程或线程都会为其分配 cpu 和内存(线程要比进程小的多,所以 worker 支持比 perfork 高的并发),并发过大会榨干服务器资源。

Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置 Nginx 主进程的工作进程的数量)(epoll),不会为每个请求分配 cpu 和内存资源,节省了大量资源,同时也减少了大量的 CPU 的上下文切换。所以才使得 Nginx 支持更高的并发。

 

Nginx怎么处理请求的?

nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的location,location就是实际地址:

server {                            # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen       80;                      # 提供服务的端口,默认80
        server_name  localhost;            # 提供服务的域名主机名
        location / {                        # 第一个location区块开始
            root   html;               # 站点的根目录,相当于Nginx的安装目录
            index  index.html index.htm;        # 默认的首页文件,多个用空格分开
        }                          # 第一个location区块结果
    }

 

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

500:Internal Server Error 内部服务错误,比如脚本错误,编程语言语法错误;

502:Bad Gateway错误,网关错误,比如:服务器当前连接太多,响应太慢,页面素材太多、带宽慢;

503:Service Temporarily Unavailable,服务不可用,web服务器不能处理HTTP请求,可能是临时超载或者是服务器进行停机维护;

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

 

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;
​

 

Nginx配置文件nginx.conf?

worker_processes  1;                                    # worker进程的数量
events {                                                  # 事件区块开始
    worker_connections  1024;                            # 每个worker进程支持的最大连接数
}                                                        # 事件区块结束
http {                                                   # HTTP区块开始
    include       mime.types;                            # Nginx支持的媒体类型库文件
    default_type  application/octet-stream;             # 默认的媒体类型
    sendfile        on;                                   # 开启高效传输模式
    keepalive_timeout  65;                               # 连接超时
    server {                                            # 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen       80;                                  # 提供服务的端口,默认80
        server_name  localhost;                           # 提供服务的域名主机名
        location / {                                    # 第一个location区块开始
            root   html;                               # 站点的根目录,相当于Nginx的安装目录
            index  index.html index.htm;                  # 默认的首页文件,多个用空格分开
        }                                                  # 第一个location区块结果
        error_page   500502503504  /50x.html;             # 出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                          # location区块开始,访问50x.html
            root   html;                                  # 指定对应的站点目录为html
        }
    }  
    ......

 

Nginx 常用命令有哪些?

启动 nginx 
停止 nginx -s stop 或 nginx -s quit 
重启 nginx -s reload 或 service nginx reload 
重载指定配置文件 .nginx -c /usr/local/nginx/conf/nginx.conf 
查看 nginx 版本 nginx -v

 

Nginx服务器上的Master和Worker进程分别是什么?

  • Master进程:读取及评估配置和维持 ;
  • Worker进程:处理请求;

 

如何用Nginx解决前端跨域问题?

使用Nginx转发请求,把跨域的接口写成调本域的接口,然后将这些接口转发到真正的请求地址。

 

Nginx动静态资源分离做过吗?

对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。

若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。

 

为什么要做动静分离?

动态资源、静态资源分离,为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。

网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。

比如说 js、css、html从A服务器返回,图片 从B服务器返回,其他请求从Tomcat服务器C返回。

让静态的资源只走静态资源服务器,动态的走动态的服务器,后台应用分开部署,提高用户访问静态代码的速度。

 

Nginx怎么来限流?

Nginx限流就是限制用户请求速度,防止服务器受不了。

限流有3种:

1、正常限制访问频率(正常流量)

Nginx中使用ngx_http_limit_req_module模块来限制的访问频率,限制的原理实质是基于漏桶算法原理来实现的。在nginx.conf配置文件中可以使用limit_req_zone命令及limit_req命令限制单个IP的请求处理频率。

#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
   limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

   #绑定限流维度
   server{

       location/seckill.html{
           limit_req zone=zone;    
           proxy_pass http://lj_seckill;
       }

   }

1r/s代表1秒一个请求,1r/m一分钟接收一个请求, 如果Nginx这时还有别人的请求没有处理完,Nginx就会拒绝处理该用户请求。

2、突发限制访问频率(突发流量)

Nginx提供burst参数结合nodelay参数可以解决流量突发的问题,可以设置能处理的超过设置的请求数外能额外处理的请求数。我们可以将之前的例子添加burst参数以及nodelay参数:

#定义限流维度,一个用户一分钟一个请求进来,多余的全部漏掉
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/m;

    #绑定限流维度
    server{

        location/seckill.html{
            limit_req zone=zone burst=5 nodelay;
            proxy_pass http://lj_seckill;
        }

    }

为什么就多了一个 burst=5 nodelay; 呢,多了这个可以代表Nginx对于一个用户的请求会立即处理前五个,多余的就慢慢来落,没有其他用户的请求我就处理你的,有其他的请求的话我Nginx就漏掉不接受你的请求。

3、 限制并发连接数

Nginx中的ngx_http_limit_conn_module模块提供了限制并发连接数的功能,可以使用limit_conn_zone指令以及limit_conn执行进行配置。接下来我们可以通过一个简单的例子来看下:

http {
   limit_conn_zone $binary_remote_addr zone=myip:10m;
   limit_conn_zone $server_name zone=myServerName:10m;
   }

   server {
       location / {
           limit_conn myip 10;
           limit_conn myServerName 100;
           rewrite / http://www.lijie.net permanent;
       }
   }

上面配置了单个IP同时并发连接数最多只能10个连接,并且设置了整个虚拟服务器同时最大并发数最多只能100个链接。当然,只有当请求的header被服务器处理后,虚拟服务器的连接数才会计数。

 

Nginx 有哪些负载均衡策略?

Nginx提供的负载均衡策略,常见的有4种:

1、轮询(round_robin)默认

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2、IP 哈希 (ip_hash)

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 共享的问题。

当然,实际场景下,一般不考虑使用 ip_hash 解决 session 共享。

3、最少连接( least_conn)

下一个请求将被分派到活动连接数量最少的服务器

4、权重(weight)

weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,达到合理的资源利用率。

 

 

什么是C10K问题?

C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法