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

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

file

正向代理:代理服务器代理的对象是客户端,由代理服务代理客户端向服务端发起请求处理。相对于服务端,代理服务就是客户端,也就是发起请求的一方。

file

反向代理:请求统一被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服务器对事件的接收和处理
file

请解释你如何通过不同于 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模块、 d a t e g m t 和 date_gmt和 dategmtdate_local的变量。
Proxy_set_header THE-TIME $date_gmt;

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

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

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

在编译过程中,必须选择Nginx模块,因为Nginx不支持模块的运行时间选择。

欢迎关注我的公众号

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值