乐趣区

关于java:Nginx相关面试题

什么是 Nginx

Nginx 是一个轻量级 / 高性能的反向代理 Web 服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协定能够高效的反向代理、负载
平衡,能够解决高并发连贯。

为什么要用 Nginx

跨平台、配置简略、方向代理、高并发连贯(解决 2w-3w 并发连接数,官网检测能反对 5w 并发)、内存耗费小(开启 10 个 nginx 才占
150M 内存,nginx 解决动态文件好,消耗内存少)

内置健康检查性能:如果一台服务器宕机,会做一个健康检查,再发送申请就不会发送到当即的服务器上,从新将申请提交到其
他节点上

节俭宽带:反对 GZIP 压缩,能够增加浏览器本地缓存

稳定性高:宕机的概率小,接管用户申请是异步的

为什么 Nginx 性能这么高

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

Nginx 怎么解决申请的

Nginx 接管到一个申请后,首先由 listen 和 server_name 指令匹配 server 模块,再匹配 server 模块里的 location,location 就是理论地

server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
}

什么是正向代理和反向代理

正向代理:代理服务器代理的对象是客户端,由代理服务代理客户端向服务端发动申请解决。绝对于服务端,代理服务就是客户端,也就是发动申请的一方。

反向代理:申请对立被 Nginx 接管,nginx 反向代理服务器接管到之后,依照肯定的规定分发给了后端的业务解决服务器进行解决。代理服务器代理的对象是服务端,和客户端打交道,代理服务器代理服务对申请做出解决,绝对于客户端,代理服务就是要申请的后盾服务。

应用反向代理服务器的长处是什么

应用反向代理之后, 客户端只和代理服务器打交道,是感知不到后端具体的服务的,这样就相当于暗藏了后端服务的存在,避免被攻打,能够很好的爱护后端服务不被裸露。平安失去保障。

Nginx 的优缺点

长处:

占用内存小,可实现高并发连贯,解决响应快
可实现 http 服务器、虚拟主机、方向代理、负载平衡
Nginx 配置简略
能够对外不裸露正式服务器的 ip 地址

毛病:

解决动静⻚面没有 Apache 优良

Nginx 的利用场景

http 服务器,能够作为一个 http 服务器,提供 http 服务,用于托管咱们的动态网⻚
虚拟主机,能够实现一台服务器虚构出多个网站
反向代理,负载平衡。当网站的访问量达到肯定水平后,单台服务器不能满足用户的申请时,须要用多台服务器集群,能够应用
nginx 做反向代理。并且多台服务器能够均匀分担负载,不会呈现因为某台服务器负载高宕机而某台服务器闲置的状况。
能够配置平安治理,比方应用 Nginx 搭建 API 接口网关,对每个接口服务进行拦挡。

Nginx 目录构造有哪些

├── client_body_temp
├── conf                             # Nginx 所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi 相干参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf 的原始备份文件
│   ├── fastcgi_params               # fastcgi 的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx 主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi 相干参数文件
│   ├── scgi_params.default  
│   ├── uwsgi_params                 # uwsgi 相干参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi 长期数据目录
├── html                             # Nginx 默认站点目录
│   ├── 50x.html                     # 谬误页面优雅代替显示文件,例如当呈现 502 谬误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx 日志目录
│   ├── access.log                   # 拜访日志文件
│   ├── error.log                    # 谬误日志文件
│   └── nginx.pid                    # pid 文件,Nginx 过程启动后,会把所有过程的 ID 号写到此文件
├── proxy_temp                       # 长期目录
├── sbin                             # Nginx 命令目录
│   └── nginx                        # Nginx 的启动命令
├── scgi_temp                        # 长期目录
└── uwsgi_temp                       # 长期目录

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 的 html ⻚面,咱们能够本人编写

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

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

Nginx 虚拟主机怎么配置

基于虚拟主机配置域名

须要建设 /data/demo /data/demo2 目录,windows 本地 hosts 增加虚拟机 ip 地址对应的域名解析;对应域名网站目录下新增 index.html 文件;#当客户端拜访 www.demo.com, 监听端口号为 80, 间接跳转到 data/demo 目录下文件
    server {
        listen       80;
        server_name  www.demo.com;
        location / {
            root   data/demo;
            index  index.html index.htm;
        }
    }

    #当客户端拜访 www.demo2.com, 监听端口号为 80, 间接跳转到 data/demo2 目录下文件
     server {
        listen       80;
        server_name  www.demo2.com;
        location / {
            root   data/demo2;
            index  index.html index.htm;
        }
    }

基于端口的虚拟主机

# 当客户端拜访 www.lijie.com, 监听端口号为 8080, 间接跳转到 data/www 目录下文件
     server {
        listen       8080;
        server_name  www.lijie.com;
        location / {
            root   data/www;
            index  index.html index.htm;
        }
    }
    
    #当客户端拜访 www.lijie.com, 监听端口号为 80 间接跳转到实在 ip 服务器地址 127.0.0.1:8080
    server {
        listen       80;
        server_name  www.lijie.com;
        location / {
         proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        }
    }

location 的作用是什么

location 的语法

匹配符 匹配规定 优先级
= 准确匹配 1
^~ 以某个字符串结尾 2
~ 辨别大小写的正则匹配 3
~* 不辨别大小写的正则匹配 4
!~ 辨别大小写的不匹配正则 5
!~* 不辨别大小写不匹配的正则 6
/ 通用匹配,任何申请都会匹配到 7

location 正则案例

# 优先级 1, 准确匹配,根门路
    location =/ {return 400;}

    #优先级 2, 以某个字符串结尾, 以 mm 结尾的,优先匹配这里,辨别大小写
    location ^~ /mm {root /data/mm/;}

    #优先级 3,辨别大小写的正则匹配,匹配 /media***** 门路, 如果是 /Media**** 门路就不会匹配到这里
    location ~ /media {alias /data/static/;}

    #优先级 4,不辨别大小写的正则匹配,所有的 ****.jpg|gif|png 都走这里,即 A.jpg 和 a.jpg 都会被匹配到
    location ~* .*\.(jpg|gif|png|js|css)$ {root  /data/mm/;}
    
    #优先级 5,辨别大小写的不匹配正则,即除了所有的 ****.jpg|gif|png 不走这里,其余 url 都能够走这里。url 辨别大小写
    location !~ .*\.(jpg|gif|png|js|css)$ {root  /data/mm/;}
    
    #优先级 6,不辨别大小写的不匹配正则,即除了所有的 ****.jpg|gif|png 不走这里,其余 url 都能够走这里。url 不辨别大小写
    location !~* .*\.(jpg|gif|png|js|css)$ {root  /data/mm/;}

    #优先 7,通用匹配
    location / {return 403;}

限流怎么做

Nginx 限流就是限度用户申请速度,避免服务器受不了。限流有三种:

  • 失常限度拜访频率:

限度一个用户发送的申请,Nginx 多久接管一个申请。Nginx 中应用 ngx_http_limit_req_module 模块来限度拜访的频率,限度的原
理本质是基于漏桶算法原理来实现的。在 nginx.conf 配置文件中能够应用 limit_req_zone 命令以及 limit_req 命令限度单个 ip 的申请解决
频率

    #定义限流维度,一个用户一分钟一个申请进来,多余的全副漏掉
    limit_req_zone $binary_remote_addr mylimit=one:10m rate=1r/m;
  #1r/ s 代表 1 秒一个申请,1r/ m 一分钟接管一个申请,如果 Nginx 这时还有他人的申请没有解决完,Nginx 就会回绝解决该用户申请。#绑定限流维度
    server{
        location /all{
            limit_req zone=mylimit;    
            proxy_pass http://localhost;
        }
    }
  • 突发限度拜访频率:

限度一个用户发送的申请,Nginx 多久接管一个申请。下面的配置能够肯定水平的限度访问量,然而遇到突发流量,超出申请被回绝,就无奈解决长期流动带来的突发流量。Nginx 提供了 burst 参数联合 nodelay 参数能够解决突发流量的事件。能够设置能解决的超过设置的申请数外能额定解决的申请数。

 #定义限流维度,一个用户一分钟一个申请进来,多余的全副漏掉
  limit_req_zone $binary_remote_addr mylimit=one:10m rate=1r/m;
  #1r/ s 代表 1 秒一个申请,1r/ m 一分钟接管一个申请,如果 Nginx 这时还有他人的申请没有解决完,Nginx 就会回绝解决该用户申请。#绑定限流维度
    server{
        location /all{
            limit_req zone=mylimit burst=5 nodelay;
                    #burst=5 nodelay 代表 Nginx 对于一个用户的申请会立刻解决前五个,多余的就慢慢来落,没有其余用户的申请我就解决你的,有其余的申请的话我 Nginx 就漏掉不承受你的申请
            proxy_pass http://localhost;
        }
    }
  • 限度并发连接数:

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.demo.com permanent;
        }
    }
    #下面配置了单个 IP 同时并发连贯数最多只能 10 个连贯,并且设置了整个虚构服务器同时最大并发数最多只能 100 个链接。当然,只有当申请的 header 被服务器解决后,虚构服务器的连接数才会计数。

为什么要做动静拆散

Nginx 的动态解决能力很强,动静⻚面的解决能力却比拟单薄,做动静拆散,让动态资源只走动态服务器,动静资源只走动静服务
器,充分发挥 Nginx 弱小的动态解决能力,把不擅⻓的动静解决交给动静的服务器进行解决。

Nginx 负载平衡的算法怎么实现的,策略有哪些

客户端将申请全副发送至 Nginx,由 Nginx 再转发给具体的服务器做解决,Nginx 负载平衡有 5 种策略:

轮询
每个申请依照申请程序逐个调配到后端的服务器上,如果后端服务器集群有机器宕机,则会主动剔除故障机器。这
种也是 Nginx 默认的负载平衡策略

upstream backserver { 
 server 172.0.0.12; 
 server 172.0.0.13; 
} 

权重

依据 weight 的值进行比例的调配,也就是 weight 的值越大,拜访到的几率也就越大。次要用于后端集群中服务器性
能之间差别不可疏忽的时候,为了充分利用服务器资源,能够依据性能调配不同的权重。

upstream backserver { 
  server 172.0.0.12 weight=2; 
  server 172.0.0.13 weight=8; 
} 

ip_hash

也叫 ip 绑定,也就是同一个 ip 的申请都会被转发到同一个后端服务器上,这种策略还能够无效解决动静⻚面之间的
session 共享问题

upstream backserver { 
 ip_hash; 
 server 172.0.0.12:88; 
 server 172.0.0.13:80; 
} 

fair(第三方插件)

必须装置 upstream_fai 模块,比照 weight、ip_hash 更加智能的负载平衡算法,fair 算法能够依据⻚面大小和加载工夫⻓短智能地进行负载平衡,响应工夫短的优先调配。

upstream backserver { 
 server server1; 
 server server2; 
 fair; 
} 

url_hash(第三方插件)

必须装置 Nginx 的 hash 软件包,按拜访 url 的 hash 后果来调配申请,使每个 url 定向到同一个后端服务器,能够进一步提高后端缓存服务器的效率。

upstream backserver { 
 server squid1:3128; 
 server squid2:3128; 
 hash $request_uri; 
 hash_method crc32; 
} 

Nginx 怎么实现高并发的

Nginx 采纳了单线程多过程和多路 I / O 复用的模型 (epoll),并发事件驱动的服务器。基于多过程和多路 I / O 复用模型 epoll,便实
现了 Nginx 的高并发。

在 Nginx 中,如何应用未定义的服务器名称来阻止解决申请

server{
    listen: 80;
    server_name: "";
    return 444;
}
# 这里服务器名被保留为一个空字符串,他将在没有主机头的状况下匹配申请,而被返回一个非凡的 Nginx 非标准代码 444,从而终止连贯。

请解释 Nginx 如何解决 HTTP 申请(能够肯定水平的答复 Nginx 怎么实现高并发)

Nginx 是一个高性能的 Web 服务器,可能同时解决大量的并发申请。它联合多过程机制和异步机制,异步机制应用的是异步非阻塞形式。

1、多过程机制

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

应用过程的益处是各个过程之间互相独立,不须要加锁,缩小了应用锁对性能造成影响,同时升高编程的复杂度,升高开发成本。其次,采纳独立的过程,能够让过程相互之间不会影响,如果一个过程产生异样退出时,其它过程失常工作,master 过程则很快启动新的 worker 过程,确保服务不会中断,从而将危险降到最低。

毛病是操作系统生成一个子过程须要进行 内存复制等操作,在资源和工夫上会产生肯定的开销。当有大量申请时,会导致系统性能降落。

2、异步非阻塞机制

每个工作过程 应用 异步非阻塞形式,能够解决 多个客户端申请。

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

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

请解释 Nginx 服务器上的 Master 和 Worker 过程别离是什么

Master 过程:读取及评估配置和维持。通过 for 循环接管和解决内部信号

Worker 过程:解决申请,主过程 Master 通过 fork()生成 worker()子过程,每一个子过程用 for()循环来实现 Nginx 服务器对事件的接管和解决

请解释你如何通过不同于 80 的端口开启 Nginx

为了通过一个不同于 80 的端口开启 Nginx,你必须进入 /etc/Nginx/sites-enabled/,如果这是默认文件,那么你必须关上名为
“default”的文件。编辑文件,并搁置在你想要的端口:

Like server {listen 81;}

请解释是否有可能将 Nginx 的谬误替换为 502 谬误、503

502 = 谬误网关

503 = 服务器超载

有可能,然而您能够确保 fastcgi_intercept_errors 被设置为 ON,并应用谬误页面指令。

location / {
    fastcgi_pass 172.0.0.1:8080;
    fastcgi_intercept_errors on;
    error_page 502 =503/error_page.html
}

在 Nginx 中,解释如何在 URL 中保留双斜线

要在 URL 中保留双斜线,就必须应用 merge_slashes_off;

语法:merge_slashes [on/off]

默认值: merge_slashes on

环境: http,server

请解释 ngx_http_upstream_module 的作用是什么

ngx_http_upstream_module 用于定义可通过 fastcgi 传递、proxy 传递、uwsgi 传递、memcached 传递和 scgi 传递指令来援用的
服务器组。

请解释什么是 C10K 问题

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

请陈说 stub_status 和 sub_filter 指令的作用是什么

Stub_status 指令:该指令用于理解 Nginx 以后状态的以后状态,如以后的流动连贯,承受和解决以后读 / 写 / 期待连贯的总数;
Sub_filter 指令:它用于搜寻和替换响应中的内容,并疾速修复古老的数据;

解释 Nginx 是否反对将申请压缩到上游

您能够应用 Nginx 模块 gunzip 将申请压缩到上游。gunzip 模块是一个过滤器,它能够对不反对“gzip”编码方法的客户机或服务
器应用“内容编码:gzip”来解压缩响应。

解释如何在 Nginx 中取得以后的工夫

要取得 Nginx 的以后工夫,必须应用 SSI 模块、$date_gmt 和 $date_local 的变量。
Proxy_set_header THE-TIME $date_gmt;

用 Nginx 服务器解释 -s 的目标是什么

用于运行 Nginx - s 参数的可执行文件。

解释如何在 Nginx 服务器上增加模块

在编译过程中,必须抉择 Nginx 模块,因为 Nginx 不反对模块的运行工夫抉择。

本文由博客群发一文多发等经营工具平台 OpenWrite 公布

退出移动版