面试必备-nginx 50问 ---持续更新

1、什么是nginx,有相似的产品吗?国内有类似产品吗?
    nginx是俄罗斯国立莫斯科鲍曼技术大学的lgor ysoev开发的,目前世界上相同的产品有Apache、IIS、Tomcat、Lighttpd,国内目前有阿里技术团队基于nginx开发的Tengine

2、nginx常用功能有哪些
    http代理和反向代理、负载均衡、web缓存。
        2.1、负载均衡主要有轮询、加权轮询和IP Hash三种策略,扩展策略主要是通过第三方模块来实现,有url_hash fair等。
        2.2、web缓存主要由proxy_cache和fastcgi_cache相关指令集构成。再由ngx_cache_purge模块已经完全实现了缓存技术。

3、nginx安装
    在linux一般情况通过--prefix来指定路径,其配置都会安装在该目录下

4、nginx的配置主要有那几大块
    全局参数、events、http这三大块组成。

5、http模块里包含哪些
    包含一个或多个server,每个server下又可以包含多个loation

6、配置中worker_process 默认是配置几个?在你的生产环境上是怎么配置的?为什么要这样配置?有过优化吗?
    6.1、默认配置是1
    6.2、在生产环境上配置的个数与cpu的核数相同。
    6.3、nginx的作者说worker_process开的太多会影响系统的io效率,加大主进程调度负担,降低性能,但为了充分利用cpu,设置成
         为与cpu核数相同可以很好的并行处理任务,同时绑定worker_cpu_affinity配合使用,旨在让cpu平均分配cpu的负担。

7、日志的级别有哪些
    stderr、debug、info、notice、warn、error、crit、alert、emerg

8、在网络中有个词叫“惊群”能说下吗?在nginx中有这样的问题吗?如何避免该问题
    惊群是指在某一时刻只会有一个网络连接到来,这时系统会叫醒所有的睡眠进程,然而只会有一个进程获得任务,浪费了系统的资源,影响了系统的性能,nginx中也会有,在配置中设置accept_mutex=on,可以让请求连接序列化,防止多个进程抢资源。

9、你刚才说了某时刻只有一个连接,nginx可以同时接收多个连接吗?
    可以,需要设置multi_accept = on

10、nginx配置中共有events,能说下里面经常用的参数吗?
    1、worer_connections,该参数主要是设置一个worker_process同时开启最大的连接数。线上配的是65535,是通过全局配置worker_r   limit_nofile 65535后,再设置worker_connections = 65535
    2、选择事件模型epoll

11、多路复用知道吗?它的事件驱动模型(多路复用的系统调用)都有哪些,你们线上使用的是什么?为什么要选择这种模型。
    (1)IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:
      1)当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。
      2)当一个客户同时处理多个套接口时,这种情况是可能的,但很少出现。
      3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
      4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
      5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。
    (2)目前支持I/O多路复用的系统调用有 select,pselect,poll,epoll
    (3)线上使用epoll
    (4)因为select模型,需要先创建读(read)、写(write)、异常(exception)三个句柄描述集合,其次调用select()函数实时监听,等待事件发生,等事件处理结束后对三个句柄事件描述符进行轮询,检查是否符合事件发生。
        poll,是创建一个句柄描述集合,对存储在里面的结构划分了读、写、异常,也是遵循select()轮询方式。
        epoll,在系统内核里创建一个描述集合,然后对这些事件设置关注,并且添加到内核当中,当某一时刻事件发生后,就会把该消息通知epoll库,epoll库就会做相应的处理。简单说就是先在内核注册做个关联,让内核完成后通知epoll。
12、为什么要用Nginx?(摘抄)
        跨平台、配置简单
       非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发
        内存消耗小:开启10个nginx才占150M内存,Nginx采取了分阶段资源分配技术
        nginx处理静态文件好,耗费内存少
        内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
        节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
        稳定性高:宕机的概率非常小
       master/worker结构:一个master进程,生成一个或者多个worker进程
        接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力
        一边接收web服务器的返回数据,一边发送给浏览器客户端
        网络依赖性比较低,只要ping通就可以负载均衡
        可以有多台nginx服务器
        事件驱动:通信机制采用epoll模型

13、同步、异步、阻塞、非阻塞
    同步:发送方发送完请求后,一直等待,直到接收方返回消息。
    异步:发送方发送完请求后,继续处理其他任务,直到接收方返回时,应用挂起,处理响应。
    阻塞:接收方接收到请求后发给IO,一直等待,直到IO返回消息
    非阻塞:接收方接收到请求后发给IO,继续处理其他任务,直到IO返回消息时,任务挂起,处理响应

14、nginx常用的配置优化

    a、worker_processes nginx服务的worker进程数,一般设置为与cpu相同或者是cpu的2倍。主要是为了让多核cpu更好的并行执行任务

    b、worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000 主要是为了让不同的进程分布到不同的cpu上运行

    c、use epoll 这个需要在内核为2.6以上进行运行,并可以设置worker_connection=65535

    d、keep_timeout 设置请求超时时间一般是60或者65秒

15、nginx的反向代理实现、健康检测极其缺点

upstream springboot {
    server 10.10.51.223:8080 max_fails=2 fail_timeout=30s; //缺点只能检测到端口
    server 10.10.51.223:8090 max_fails=2 fail_timeout=30s;
}
 
server {
    listen       80;
    server_name  localhost;
 
    location /test {
        proxy_pass http://springboot;
    }
}

 

你可能感兴趣的:(存库)