Nginx面试题

1、什么是Nginx?

Nginx 是一个 轻量级 / 高性能的反向代理 Web 服务器,用于 HTTP 、HTTPS 、SMTP 、POP3 和 IMAP 协议。他实 现非常高效的反向代理、负载平衡,他可以处理 2-3 万并发连接数,官方监测能支持 5 万并发,现在中国使用 nginx 网站用户有很多,例如:新浪、网易、 腾讯等。

2 、Nginx有哪些优点?

跨平台、配置简单。 非阻塞、高并发连接:处理 2-3 万并发连接数,官方监测能支持 5 万并发。 内存消耗小:开启 10 个 Nginx 才占 150M 内存。 成本低廉,且开源。 稳定性高,宕机的概率非常小。 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务 器了。重新将请求提交到其他的节点上

3 、Nginx 应用场景?

. http 服务器。 Nginx 是一个 http 服务可以独立提供 http 服务。可以做网页静态服务器。 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服 务器集群可以使用 nginx 做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机 而某台服务器闲置的情况。 . nginz 中也可以配置安全管理、比如可以使用 Nginx 搭建 API 接口网关, 对每个接口服务进行拦截。

4、如何安装Nginx?

下面给出在CentOS上面的安装方式。

  1. 第一步:更新系统软件包

    首先,需要确保系统中的软件包是最新的。打开终端,并使用以下命令执行系统软件包更新:

    sudo yum update
    
  2. 第二步:安装EPEL存储库 Nginx在CentOS默认软件源中不可用,但可以通过EPEL存储库来获取。使用以下命令安装EPEL存储库:

    sudo yum install epel-release
    
  3. 第三步:安装Nginx 执行以下命令以安装Nginx:

    sudo yum install nginx
    
  4. 第四步:启动Nginx服务 安装完成后,可以使用以下命令启动Nginx服务:

    sudo systemctl start nginx
    

    要检查Nginx是否已成功启动,请使用以下命令:

    sudo systemctl status nginx
    

5、Nginx 怎么处理请求的?

server { # 第一个Server区块开始,表示一个独立的虚拟主机站点
  listen       80;# 提供服务的端口,默认80
  server name localhost; # 提供服务的域名主机名
  location / { # 第一个location区块开始
    root   html; # 站点的根目录,相当于Nginx的安装目录
    index  index.html index.html; # 默认的首页文件,多个用空格分开 
} # 第一个location区块结果
  • 首先, Nginx 在启动时,会解析配置文件,得到需要监听的端口与 IP 地址,然后在 Nginx 的 Master 进程里 面先初始化好这个监控的 Socket(创建 S ocket,设置 addr 、reuse 等选项,绑定到指定的 ip 地址端口,再 listen 监听)。
  • 然后,再 fork(一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子进程) 出多 个子进程出来。
  • 之后,子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与 nginx 进行三 次握手,与 nginx 建立好一个连接后。此时,某一个子进程会 accept 成功,得到这个建立好的连接的Socket ,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体。
  • 接着,设置读写事件处理函数,并添加读写事件来与客户端进行数据的交换。
  • 最后, Nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了。

6 、Nginx 是如何实现高并发的?

如果一个 server 采用一个进程 (或者线程) 负责一个 request 的方式,那么进程数就是并发数。那么显而易见的, 就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。 ⽽ Nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。 因此表现为少数几个进程就解决了大量的并发问题。 Nginx 是如何利用的呢,简单来说:同样的 4 个进程,如果采用一个进程负责一个 request 的方式,那么,同时 进来 4 个 request 之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第 5 个 request 进来了。就无 法及时反应了,因为 4 个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个 request ,就新开个 进程来处理。

回想下, BIO 是不是存在酱紫的问题?

Nginx 不这样,每进来一个 request ,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request ,并等待请求返回。那么,这个处理的worker 不会这么傻等着,他会在发送完请求后,注册一个事件: “如果 upstream 返回了,告诉我一声,我再接着 ⼲” 。于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着往下走。 这就是为什么说, Nginx 基于事件模型。

由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中,实际上花费在 server 机器上 的时间片不多。这是几个进程就解决高并发的秘密所在。即: webserver 刚好属于网络 IO 密集型应用,不算是计算密集型。 异步,非阻塞,使用 epoll ,和大量细节处的优化。也正是 Nginx 之所以然的技术基石。

7、什么是正向代理?

一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个 请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

客户端才能使用正向代理。正向代理总结就一句话:代理端代理的是客户端。例如说:我们使用的 OpenVPN 等 等。

8、什么是反向代理?

反向代理(Reverse Proxy)方式,是指以代理服务器来接受 Internet 上的连接请求,然后将请求,发给内部网络 上的服务器并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 反向代理总结就一句话:代理端代理的是服务端。

9、反向代理服务器的优点是什么?

反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和 web 服务器之间的中间层。这对于安全方面 来说是很好的,特别是当您使用 web 托管服务时。

10 、Nginx 目录结构有哪些?

tree /usr/local/nginx 
/usr/local/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相关参数⽂件
11、Nginx 配置⽂件 nginx.conf 有哪些属性模块?
12、cookie 和 session 区别?
│ ├── 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 # 临时⽬录

11、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 
   } 
 } 
 ......

12、cookie 和 session 区别?

共同:

存放⽤户信息。存放的形式:key-value 格式 变量和变量内容键值对。

区别:

  • 存放在客户端浏览器
  • 每个域名对应⼀个 cookie,不能跨跃域名访问其他 cookie
  • ⽤户可以查看或修改 cookie
  • http 响应报⽂⾥⾯给你浏览器设置
  • 钥匙(⽤于打开浏览器上锁头)

session

  • 存放在服务器(⽂件,数据库,redis)
  • 存放敏感信息
  • 锁头

13、为什么 Nginx 不使⽤多线程?

Apache: 创建多个进程或线程,⽽每个进程或线程都会为其分配 cpu 和内存(线程要⽐进程⼩的多,所以 worker⽀持⽐ perfork ⾼的并发),并发过⼤会榨⼲服务器资源。 Nginx: 采⽤单线程来异步⾮阻塞处理请求(管理员可以配置 Nginx 主进程的⼯作进程的数量)(epoll),不会为每个请求分配 cpu 和内存资源,节省了⼤量资源,同时也减少了⼤量的 CPU 的上下⽂切换。所以才使得 Nginx ⽀持更⾼的并发。

14、nginx 和 apache 的区别

轻量级,同样起 web 服务,⽐ apache 占⽤更少的内存和资源。

抗并发,nginx 处理请求是异步⾮阻塞的,⽽ apache 则是阻塞性的,在⾼并发下 nginx 能保持低资源,低消耗⾼ 性能。

⾼度模块化的设计,编写模块相对简单。

最核⼼的区别在于 apache 是同步多进程模型,⼀个连接对应⼀个进程,nginx 是异步的,多个连接可以对应⼀个进程。

区别 Nginx Apache
处理方式 事件驱动 多线程
内存消耗 低 高
并发连接 高 适中
静态文件处理能力 高 适中
可用模块 少 丰富
配置灵活性 较高 较高
模块加载方式 动态加载 静态/动态加载
主要应用场景 高并发环境、反向代理、负载均衡 一般网站、动态内容

具体的特性和性能还取决于实际的配置和使⽤场景。不过⽬前来说,Nginx已经成为绝对的主流。

15、什么是动态资源、静态资源分离?

动态资源、静态资源分离,是让动态⽹站⾥的动态⽹⻚根据⼀定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后我们就可以根据静态资源的特点将其做缓存操作,这就是⽹站静态化处理的核⼼思路。

动态资源、静态资源分离简单的概括是:动态⽂件与静态⽂件的分离。

16、为什么要做动、静分离?

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等⽂件),这些不需要经过后台处理的⽂件称为静态⽂件,否则动态⽂件。

因此我们后台处理忽略静态⽂件。这会有⼈⼜说那我后台忽略静态⽂件不就完了吗?当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使⽤这种动静分离的策略去解决动、静分离将⽹站静态资源(HTML,JavaScript,CSS,img 等⽂件)与后台应⽤分开部署,提⾼⽤户访问静态代码的速度,降低对后台应⽤访问。

这⾥我们将静态资源放到 Nginx 中,动态资源转发到 Tomcat 服务器中去。

当然,因为现在七牛、阿里云等 CDN 服务已经很成熟,主流的做法,是把静态资源缓存到 CDN 服务中,从⽽提升访问速度。

相⽐本地的 Nginx 来说,CDN 服务器由于在国内有更多的节点,可以实现⽤户的就近访问。并且,CDN 服务可以提供更⼤的带宽,不像我们⾃⼰的应⽤服务,提供的带宽是有限的。

17、什么叫 CDN 服务?

CDN 即内容分发网络。 通过在现有的 Internet 中 增加⼀层新的网络架构,将网站的内容发布到最接近⽤户的⽹络边缘,使⽤户可就近取得所需的内容,提⾼⽤户访问网站的速度。 ⼀般来说,因为现在 CDN 服务⽐较⼤众,所以基本所有公司都会使⽤ CDN 服务。

18、Nginx 怎么做的动静分离?

只需要指定路径对应的⽬录。location / 可以使⽤正则表达式匹配。并指定对应的硬盘中的⽬录。如下:(操作都是在 Linux 上)

location /image/ {
	root /usr/local/static/;
	autoindex on;
}
步骤:
# 创建目录
mkdir /usr/local/static/image

# 进入目录
cd /usr/local/static/image

#上传图片
photo.jpg

#重启nginx
sudo nginx -s reload

打开浏览器 输⼊ server_name/image/1.jpg 就可以访问该静态图⽚了。

19、Nginx 负载均衡的算法怎么实现的? 策略有哪些?

为了避免服务器崩溃,⼤家会通过负载均衡的⽅式来分担服务器压力。将对台服务器组成⼀个集群,当⽤户访问时,先访问到⼀个转发服务器,再由转发服务器将访问分发到压力更小的服务器。Nginx 负载均衡实现的策略有以下五种:

1.轮询 (默认)

每个请求按时间顺序逐⼀分配到不同的后端服务器,如果后端某个服务器宕机,能⾃动剔除故障系统。

location /image/ { 
 root /usr/local/static/; 
 autoindex on; 
} 

2.权重 weight

weight 的值越⼤,分配到的访问概率越⾼,主要⽤于后端每台服务器性能不均衡的情况下。其次是为在主从的情 况下设置不同的权值,达到合理有效的地利⽤主机资源。

# 权重越⾼,在被访问的概率越⼤,如上例,分别是20%,80%。
upstream backserver { 
 server 192.168.0.12 weight=2; 
 server 192.168.0.13 weight=8; 
}

3.ip_hash(IP 绑定)

每个请求按访问 IP 的哈希结果分配,使来⾃同⼀个 IP 的访客固定访问⼀台后端服务器,并且可以有效解决动态⽹ ⻚存在的 session 共享问题

upstream backserver { 
 ip_hash; 
 server 192.168.0.12:88; 
 server 192.168.0.13:80; 
}

4.fair(第三方插件)

必须安装 upstream_fair 模块。 对⽐ weight、ip_hash 更加智能的负载均衡算法,fair 算法可以根据⻚⾯⼤⼩和加载时间⻓短智能地进⾏负载均衡,响应时间短的优先分配。

# 哪个服务器的响应速度快,就将请求分配到那个服务器上。
upstream backserver { 
 server server1; 
 server server2; 
 fair; 
}

5.url_hash(第三⽅插件)

必须安装 Nginx 的 hash 软件包 按访问 url 的 hash 结果来分配请求,使每个 url 定向到同⼀个后端服务器,可以进⼀步提⾼后端缓存服务器的效率。

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

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

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

21、Nginx 虚拟主机怎么配置?

1、基于域名的虚拟主机,通过域名来区分虚拟主机——应⽤:外部⽹站 2、基于端⼝的虚拟主机,通过端⼝来区分虚拟主机——应⽤:公司内部⽹站,外部⽹站的管理后台 3、基于 ip 的虚拟主机。 基于虚拟主机配置域名 需要建⽴/data/www /data/bbs ⽬录,windows 本地 hosts 添加虚拟机 ip 地址对应的域名解析;对应域名⽹站⽬录下新增 index.html ⽂件;

# 当客户端访问www.lijie.com,监听端⼝号为80,直接跳转到data/www⽬录下⽂件
server { 
 listen 80; 
 server_name www.lijie.com; 
 location / { 
 root data/www; 
 index index.html index.htm; 
 } 
} 
# 当客户端访问www.lijie.com,监听端⼝号为80,直接跳转到data/bbs⽬录下⽂件
 server { 
 listen 80; 
 server_name bbs.lijie.com; 
 location / { 
 root data/bbs; 
 index index.html index.htm; 
 } 
}

基于端⼝的虚拟主机 使⽤端⼝来区分,浏览器使⽤域名或 ip 地址: 端⼝号 访问

# 当客户端访问www.lijie.com,监听端⼝号为8080,直接跳转到data/www⽬录下⽂件
 server { 
 listen 8080; 
 server_name 8080.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; 
 } 
}

22、location 的作⽤是什么?

location 指令的作⽤是根据⽤户请求的 URI 来执⾏不同的应⽤,也就是根据⽤户请求的⽹站 URL 进⾏匹配,匹配成功即进⾏相关的操作。 Location 正则案例

# 优先级1,精确匹配,根路径
location =/ { 
 return 400; 
} 
# 优先级2,以某个字符串开头,以av开头的,优先匹配这⾥,区分⼤⼩写
location ^~ /av { 
 root /data/av/; 
} 
# 优先级3,区分⼤⼩写的正则匹配,匹配/media*****路径
location ~ /media { 
 alias /data/static/; 
} 
# 优先级4 ,不区分⼤⼩写的正则匹配,所有的****.jpg|gif|png 都⾛这⾥
location ~* .*\.(jpg|gif|png|js|css)$ { 
 root /data/av/; 
} 
# 优先7,通⽤匹配
location / { 
 return 403; 
}

23、限流怎么做的?

Nginx 限流就是限制⽤户请求速度,防⽌服务器受不了。 限流有 3 种:

  • 正常限制访问频率(正常流量)
  • 突发限制访问频率(突发流量)
  • 限制并发连接数

Nginx 的限流都是基于漏桶流算法,实现三种限流算法:

  1. 正常限制访问频率(正常流量): 限制⼀个⽤户发送的请求,我 Nginx 多久接收⼀个请求。 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 多久接收⼀个。 上⾯的配置⼀定程度可以限制访问频率,但是也存在着⼀个问题:如果突发流量超出请求被拒绝处理,⽆法处理活动时候的突发流量,这时候应该如何进⼀步处理呢? 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 是基于漏桶算法原理实现的,实际上限流⼀般都是基于漏桶算法和令牌桶算法实现的。

24、漏桶流算法和令牌桶算法知道?

漏桶算法

漏桶算法思路很简单,我们把⽔⽐作是请求,漏桶⽐作是系统处理能⼒极限,⽔先进⼊到漏桶⾥,漏桶⾥的⽔按⼀ 定速率流出,当流出的速率⼩于流⼊的速率时,由于漏桶容量有限,后续进⼊的⽔直接溢出(拒绝请求),以此实 现限流。

kappframework-CuAEey(1)(1)

令牌桶算法

令牌桶算法的原理也⽐较简单,我们可以理解成医院的挂号看病,只有拿到号以后才可以进⾏诊病。 系统会维护⼀个令牌(token)桶,以⼀个恒定的速度往桶⾥放⼊令牌(token),这时如果有请求进来想要被处理,则需要先从桶⾥获取⼀个令牌(token),当桶⾥没有令牌(token)可取时,则该请求将被拒绝服务。令牌桶算法通过控制桶的容量、发放令牌的速率,来达到对请求的限制。

image-20240319173510037

25、Nginx 配置⾼可⽤性怎么配置?

当上游服务器 (真实访问服务器),⼀旦出现故障或者是没有及时相应的话,应该直接轮训到下⼀台服务器,保证服务器的⾼可⽤。 Nginx 配置代码:

server { 
 listen 80; 
 server_name www.lijie.com; 
 location / { 
 ### 指定上游服务器负载均衡服务器
 proxy_pass http://backServer; 
 ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握⼿等候响应
超时时间
 proxy_connect_timeout 1s; 
 ###nginx发送给上游服务器(真实访问的服务器)超时时间
 proxy_send_timeout 1s; 
 ### nginx接受上游服务器(真实访问的服务器)超时时间
 proxy_read_timeout 1s; 
 index index.html index.htm; 
 } 
 }

26、Nginx 怎么判断别 IP 不可访问?

# 如果访问的ip地址为192.168.9.115,则返回403 
 if ($remote_addr = 192.168.9.115) { 
 return 403; 
 }

27、在 nginx 中,如何使⽤未定义的服务器名称来阻⽌处理请求?

只需将请求删除的服务器就可以定义为: 服务器名被保留⼀个空字符串,他在没有主机头字段的情况下匹配请求,⽽⼀个特殊的 nginx 的⾮标准代码被返回,从⽽终⽌连接。

28、怎么限制浏览器访问?

## 不允许⾕歌浏览器访问 如果是⾕歌浏览器返回500 
if ($http_user_agent ~ Chrome) { 
 return 500; 
} 
Rewrite全局变量是什么?
$remote_addr //获取客户端ip 
$binary_remote_addr //客户端ip(⼆进制) 
$remote_port //客户端port,如:50472 
$remote_user //已经经过Auth Basic Module验证的⽤户名
$host //请求主机头字段,否则为服务器名称,如:blog.sakmon.com 
$request //⽤户请求信息,如:GET ?a=1&b=2 HTTP/1.1 
$request_filename //当前请求的⽂件的路径名,由root或alias和URI request组合⽽成,
如:/2013/81.html 
$status //请求的响应状态码,如:200 
$body_bytes_sent // 响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40 
$content_length // 等于请求⾏的“Content_Length”的值
$content_type // 等于请求⾏的“Content_Type”的值
$http_referer // 引⽤地址
$http_user_agent // 客户端agent信息,如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/29.0.1547.76 Safari/537.36 
$args //与$query_string相同 等于当中URL的参数(GET),如a=1&b=2 
$document_uri //与$uri相同 这个变量指当前的请求URI,不包括任何参数(⻅$args) 如:/2013/81.html 
$document_root //针对当前请求的根路径设置值
$hostname //如:centos53.localdomain 
$http_cookie //客户端cookie信息
$cookie_COOKIE //cookie COOKIE变量的值
$is_args //如果有$args参数,这个变量等于”?”,否则等于”",空值,如? 
$limit_rate //这个变量可以限制连接速率,0表示不限速
$query_string // 与$args相同 等于当中URL的参数(GET),如a=1&b=2 
$request_body // 记录POST过来的数据信息
$request_body_file //客户端请求主体信息的临时⽂件名
$request_method //客户端请求的动作,通常为GET或POST,如:GET
$request_uri //包含请求参数的原始URI,不包含主机名,如:/2013/81.html?a=1&b=2 
$scheme //HTTP⽅法(如http,https),如:http 
$uri //这个变量指当前的请求URI,不包括任何参数(⻅$args) 如:/2013/81.html 
$request_completion //如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后⼀个时,为
空(Empty),如:OK 
$server_protocol //请求使⽤的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1 
$server_addr //服务器IP地址,在完成⼀次系统调⽤后可以确定这个值
$server_name //服务器名称,如:blog.sakmon.com 
$server_port //请求到达服务器的端⼝号,如:80

29、Nginx 如何实现后端服务的健康检查?

⽅式⼀,利⽤ nginx ⾃带模块 ngx_http_proxy_module 和 ngx_http_upstream_module 对后端节点做健康检查。 ⽅式⼆ (推荐),利⽤ nginx_upstream_check_module 模块对后端节点做健康检查。

30、Nginx 如何开启压缩?

开启 nginx gzip 压缩后,⽹⻚、css、js 等静态资源的⼤⼩会⼤⼤的减少,从⽽可以节约⼤量的带宽,提⾼传输效率,给⽤户快的体验。虽然会消耗 cpu 资源,但是为了给⽤户更好的体验是值得的。 开启的配置如下: 将以上配置放到 nginx.conf 的 http{…} 节点中。

http { 
 # 开启gzip 
 gzip on; 
 # 启⽤gzip压缩的最⼩⽂件;⼩于设置值的⽂件将不会被压缩
 gzip_min_length 1k; 
 # gzip 压缩级别 1-10 
 gzip_comp_level 2; 
 # 进⾏压缩的⽂件类型。
 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;
 # 是否在http header中添加Vary: Accept-Encoding,建议开启
 gzip_vary on; 
}

保存并重启 nginx,刷新⻚⾯(为了避免缓存,请强制刷新)就能看到效果了。

31、ngx_http_upstream_module 的作⽤是什么?

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

32、什么是 C10K 问题?

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

32、Nginx 是否⽀持将请求压缩到上游?

您可以使⽤ Nginx 模块 gunzip 将请求压缩到上游。gunzip 模块是⼀个过滤器,它可以对不⽀持 “gzip” 编码⽅法 的客户机或服务器使⽤ “内容编码: gzip” 来解压缩响应。

34、如何在 Nginx 中获得当前的时间?

要获得 Nginx 的当前时间,必须使⽤ SSI 模块、和 date_local 的变量。

Proxy_set_header THE-TIME $date_gmt;

35、⽤ Nginx 服务器解释 - s 的⽬的是什么?

⽤于运⾏ Nginx -s 参数的可执⾏⽂件。

36、如何在 Nginx 服务器上添加模块?

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

37、⽣产中如何设置 worker 进程的数量呢?

在有多个 cpu 的情况下,可以设置多个 worker,worker 进程的数量可以设置到和 cpu 的核⼼数⼀样多,如果在 单个 cpu 上起多个 worker 进程,那么操作系统会在多个 worker 之间进⾏调度,这种情况会降低系统性能,如果 只有⼀个 cpu,那么只启动⼀个 worker 进程就可以了。

38、Nginx状态码

499:服务端处理时间过⻓,客户端主动关闭了连接。 502: (1).FastCGI 进程是否已经启动 (2).FastCGI worker 进程数是否不够 (3).FastCGI 执⾏时间过⻓

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

(4).FastCGI Buffer 不够,nginx 和 apache ⼀样,有前端缓冲限制,可以调整缓冲参数

Proxy_set_header THE-TIME $date_gmt;
fastcgi_buffer_size 32k;
fastcgi_buffers 8 32k;

(5). Proxy Buffer 不够,如果你⽤了 Proxying,调整

proxy_buffer_size 16k;
proxy_buffers 4 16k;

(6).php 脚本执⾏时间过⻓ 将 php-fpm.conf 的 0s 的 0s 改成⼀个时间

39、Nginx有哪些配置⽂件?

Nginx具有以下⼏个重要的配置⽂件,它们各⾃位于不同的⽂件夹下⾯,具体的配置⽂件和⽂件夹路径可能因 Nginx版本、操作系统以及⾃定义设置等因素⽽有所不同。下⾯提到的路径是在Linux系统上使⽤默认安装路径时 的常规配置。

  1. nginx.conf :主要的Nginx配置⽂件,包含全局性的设置,例如进程数、⼯作模式等。该⽂件位 于/ etc/nginx/ ⽬录下。

  2. sites-available/default :默认的虚拟主机配置⽂件,⽤于指定默认虚拟主机的设置。该⽂件位 于 /etc/nginx/sites-available/ ⽬录下。

  3. sites-available/ :该⽂件夹下存放了⽤于配置不同虚拟主机的配置⽂件,每个⽂件对应⼀个虚拟主机。 可以在该⽂件夹下创建新的配置⽂件以配置更多的虚拟主机。

  4. sites-enabled/ :该⽂件夹下存放了启⽤的虚拟主机的配置⽂件的符号链接。通常情况下,使⽤ln -s命令 将sites-available/⽬录下的配置⽂件链接到 sites-enabled/ ⽬录,从⽽启⽤该虚拟主机。

  5. conf.d/ :该⽂件夹下存放了其他Nginx配置⽂件的⽬录,这些配置⽂件可以包含在主配置⽂件中。可以在 该⽂件夹下创建新的配置⽂件以添加其他配置选项。

40、Nginx有哪些命令,如何重载Nginx配置⽂件?

Nginx有完善的命令操作管理和操作Nginx服务器,以下是⼀些常⽤的命令:

  1. 启动Nginx: nginx 或 nginx -s start

  2. 停⽌Nginx: nginx -s stop

  3. 重启Nginx: nginx -s restart

  4. 检查Nginx配置⽂件是否正确: nginx -t

  5. 打开Nginx主进程PID⽂件: nginx -s reopen

  6. 关闭Nginx,并在处理完当前请求后退出: nginx -s quit

    要重载Nginx配置⽂件,可以使⽤以下命令:

  7. ⾸先检查配置⽂件是否正确: nginx -t

  8. 如果配置⽂件正确,可以使⽤以下命令重载Nginx: nginx -s reload

    重载配置⽂件会使Nginx重新加载配置⽂件,⽽⽆需停⽌和启动整个服务器。这对于更新Nginx配置⽂件中的更改 ⾮常有⽤,因为它可以避免中断服务器的服务。

41、如何将Nginx设置为反向代理服务器?

1.打开Nginx的主配置⽂件。⼀般情况这个⽂件位于 /etc/nginx/nginx.conf 。如果没有找到,可以⽤find命令查找⼀下。

2.配置反向代理:在 Nginx 配置⽂件中找到 http 部分,并在该部分添加以下内容来配置反向代理:

http {
 server {
 listen 80;
 server_name demoxxx.com; # 替换为您的域名
 location / {
 proxy_pass http://backend-server; # 替换为您的后端服务器地址
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
 }
 upstream backend-server {
 server backend1.demoxxx.com; # 替换为您的后端服务器地址
 server backend2.demoxxx.com; # 可以添加多个后端服务器
 }
}

在上⾯的配置中, demoxxx.com 是您的域名, backend-server 是您的后端服务器地址。您可以根据需要添加多个后端服务器。

检查配置并重启Nginx:使⽤命令 sudo nginx -t 检查您的Nginx配置是否正确。如果没有错误,使⽤命令 sudo service nginx restart 重启Nginx服务。这样,您就成功将Nginx设置为反向代理服务器了。现在,当请求到达您的域名时,Nginx将转发该请求到后端服务器,并将响应返回给客户端。

42、Nginx的⼯作流程是什么?

  1. Nginx通过监听指定的端⼝来接收客户端请求。
  2. 当接收到请求后,Nginx使⽤配置⽂件中定义的虚拟主机来确定请求应该被转发到哪个后端服务器。
  3. Nginx使⽤内部的事件驱动模型来处理请求,⽽不是为每个连接创建⼀个新的线程或进程。这使得Nginx能够 处理⼤量并发连接⽽不耗费过多的系统资源。
  4. Nginx根据配置⽂件中定义的规则将请求转发给后端服务器。这可以是静态⽂件的直接传输,也可以是动态请 求的转发到后端应⽤程序服务器。
  5. Nginx还提供了⼀些额外的功能,如负载均衡、缓存、SSL/TLS协议⽀持等,以提⾼性能和安全性。

43、Nginx可以进⾏内容压缩吗?如何配置?

Nginx 可以进⾏内容压缩。主要通过 gzip 实现,要配置 Nginx 以启⽤内容压缩,需要进⾏以下步骤:

  1. 确保已安装Nginx服务器。

  2. 修改Nginx配置⽂件 nginx.conf 或虚拟主机配置⽂件。

  3. 找到 http 块,并添加以下配置项:

    http {
     gzip on;
     gzip_types text/plain text/css application/json application/javascript
    text/javascript;
     gzip_min_length 1000;
     gzip_comp_level 2;
     gzip_proxied any;
     gzip_vary on;
     gzip_disable "MSIE [1-6]\.(?!.*SV1)";
     gzip_buffers 16 8k;
     gzip_http_version 1.1;
     gzip_static on;
    }
    

​ 上述配置项的含义: ​ gzip on :启⽤gzip压缩 ​ gzip_types :指定要压缩的⽂件类型 ​ gzip_min_length :指定压缩⽂件的最⼩⻓度 ​ gzip_comp_level :指定压缩级别,范围从1到9(1表示压缩⽐较低,但速度快,9表示压缩⽐较⾼,但速度慢) ​ gzip_proxied :指定在代理服务器上启⽤压缩 ​ gzip_vary :启⽤Vary头部,⽤于根据Accept-Encoding请求头选择正确的压缩版本 ​ gzip_disable :禁⽤压缩的⽤户代理列表 ​ gzip_buffers :指定压缩缓冲区的数量和⼤⼩ ​ gzip_http_version :指定⽀持gzip的HTTP版本 ​ gzip_static :启⽤预压缩⽂件的发送

保存配置⽂件并重新启动Nginx服务器。 配置完成后,Nginx将⾃动对指定类型的⽂件进⾏压缩,并在响应时添加相应的压缩头。

44、如何查看Nginx的⽇志⽂件?

要查看Nginx的⽇志⽂件,可以按照以下步骤操作:

  1. 打开终端或命令提示符,登录到服务器上,确保具有⾜够的权限。

  2. Nginx的⽇志⽂件通常位于 /var/log/nginx ⽬录下。使⽤ cd /var/log/nginx 命令进⼊该⽬录。

  3. 查看⽇志⽂件可以使⽤ cat 、 less 或 tail 等命令。例如,使⽤ less access.log 命令查看 access.log⽂件内容。

  4. 如果想实时查看⽇志⽂件的变化,可以使⽤ tail -f access.log 命令。这将持续显示新的⽇志内容。

要定义Nginx的⽇志格式,可以按照以下步骤操作:

  1. 打开Nginx配置⽂件。通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf 。

  2. 在 http 块中找到 log_format 指令。这条指令⽤于定义⽇志的格式。它通常位于 http 块内的其他指令之前。

  3. 使⽤以下语法定义⽇志格式:

    log_format format_name '$variable1 $variable2 ...';
    

​ 其中, format_name 是你给⽇志格式起的名称, $variable1 、 $variable2 是可⽤的变量。变量的选择根据你希望包含的信息⽽定。

  1. 示例:定义⼀个名为 mylog 的⽇志格式,包含时间、客户端IP、请求⽅法和URL。

    log_format mylog '$time_local $remote_addr $request_method $request_uri';
    
  2. 定义好⽇志格式后,可以在 access_log 指令中使⽤该格式。例如,在 server 块中的 access_log 指令中 添加以下内容:

    access_log /var/log/nginx/access.log mylog;
    
  3. 保存配置⽂件并重新加载Nginx: sudo nginx -s reload 。 现在,Nginx将按照你定义的⽇志格式记录访问⽇志。

45、如何限制同时连接到Nginx的客户端数量?

您可以通过在Nginx配置⽂件中设置 limit_conn 指令来限制同时连接到Nginx的客户端数量。 以下是设置的步骤:

  1. 打开Nginx的配置⽂件。默认位置是 /etc/nginx/nginx.conf 。

  2. 在 http 块中添加以下代码:

    http {
     # ...
     limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; # 定义IP地址的连接限制
    区域
     # ...
    }
    

    这⾥的 10m 表示分配给连接限制区域的内存⼤⼩,可以根据需要进⾏调整。

  3. 在需要限制连接数量的 http 、 server 或 location 块中使⽤ limit_conn 指令来设置限制。例如:

    http {
     # ...
     server {
     # ...
     limit_conn conn_limit_per_ip 10; # 设置每个IP地址最⼤连接数为10
     # ...
     }
    }
    

    这⾥的 conn_limit_per_ip 是刚刚定义的连接限制区域名字, 10 表示每个IP地址允许的最⼤连接数。

  4. 保存配置⽂件并重新加载Nginx。

      sudo nginx -t # 检查配置⽂件语法是否正确
      sudo systemctl reload nginx # 重新加载Nginx配置
    

    现在,您已经成功限制了同时连接到Nginx的客户端数量。超过设定的连接数时,Nginx会返回 503 Service Unavailable 错误给客户端。

46、如何限制某个URL的访问速率?

要限制某个URL的访问速率,可以使⽤Nginx的 ngx_http_limit_req_module 模块。该模块提供了⼀种基于令牌桶算法的限速机制。 以下是如何在Nginx中配置限制某个URL的访问速率的步骤:

  1. 在Nginx的配置⽂件中找到对应的Server块,例如 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf 。

  2. 在Server块中添加⼀个 location 指令,⽤于匹配特定的URL。例如,要限制 /api/slow 的访问速率,可以 添加如下的location指令:

    location /api/slow {
     limit_req zone=api_rate_limit burst=5 nodelay;
     proxy_pass http://backend;
    }
    
  3. 在location指令内部使⽤ limit_req 指令来定义限速规则。 limit_req 指令有以下常⽤参数:

    zone : 定义限速区域名称,多个限速指令可以共享相同的限速区域。

    burst : 定义允许的最⼤并发请求数。

    nodelay : 指定是否⽴即处理超过限速阈值的请求,默认为等待处理。

  4. 保存配置⽂件并重新加载Nginx配置。

    以上配置将会限制 /api/slow 的访问速率。你可以根据需要⾃定义 burst 和 nodelay 参数的值,以满⾜你的需求。

47、如何实现HTTP重定向?

在nginx中,可以通过使⽤ rewrite 指令来实现HTTP重定向。 rewrite 指令⽤于修改URL或执⾏重定向操作。 下⾯是⼀个示例配置,演示了如何实现HTTP重定向:

server {
 listen 80;
 server_name demoxxx.com;
 # 重定向到指定URL
 location /old-url {
 rewrite ^/old-url$ http://demoxxx.com/new-url permanent;
 }
 # 重定向到HTTPS
 location /secure {
 rewrite ^ https://demoxxx.com$request_uri? permanent;
 }
 # 正则表达式匹配并重定向
 location ~ ^/redirect/(.*)$ {
 return 301 http://demoxxx.com/new-location/$1;
 }
}

上述示例中,通过 rewrite 指令实现了以下⼏种重定向操作:

  1. 将 http://demoxxx.com/old-url 重定向到 http://demoxxx.com/new-url ,采⽤永久重定向。

  2. 将 http://demoxxx.com/secure 重定向到 https://demoxxx.com/secure ,采⽤永久重定向。

  3. 使⽤正则表达式匹配 http://demoxxx.com/redirect/{任意内容} ,将其重定向到 http://demoxxx.com/new-location/{匹配内容} ,采⽤永久重定向。

需要注意的是, rewrite 指令⽀持正则表达式匹配和重定向,并且⽀持使⽤变量来进⾏动态重定向。

48、如何防⽌DDoS攻击?

要防⽌ DDoS (分布式拒绝服务)攻击, Nginx 可以采取以下措施。

  1. 配置反向代理服务器:使⽤ Nginx 作为反向代理服务器,将请求转发给后端真实服务器进⾏处理。这样可以隐藏真实服务器的IP地址,使其难以被攻击者直接攻击。

  2. 配置 HTTP 限制:使⽤ Nginx 的模块,如 limit_req 和l imit_conn ,对每个客户端的请求数量和连接数进⾏限制,防⽌攻击者通过发送⼤量请求来耗尽服务器资源。

  3. 配置访问限制:使⽤ Nginx 的模块,如 GeoIP 和 IP ⿊名单等,对恶意IP进⾏拦截或限制访问。可以基于地理位置、IP地址段、⽤户代理字符串等进⾏限制。

  4. 加载均衡和泛洪限制:通过 Nginx 的负载均衡功能,将请求分散到多个后端服务器上,从⽽分摊DDoS攻击的压⼒。同时,配置 Nginx 的模块,如 ngx_http_limit_req_module 和 ngx_http_limit_conn_module ,限制每个请求的速率,防⽌泛洪攻击。

  5. 使⽤Nginx的缓存功能:将动态⻚⾯转换为静态⻚⾯,并使⽤Nginx的缓存功能,将结果缓存在内存中,减轻后端服务器的负载。

  6. 配置防⽕墙:结合Nginx与防⽕墙⼯具(如iptables),对⽹络流量进⾏过滤和限制。可以设置特定规则,只允许合法的请求通过,阻⽌恶意流量。

  7. 监控和⽇志分析:通过监控Nginx的访问⽇志和⽹络流量,及时发现异常流量和攻击⾏为,并采取相应的应对措施。

以上是⼀些基本的防⽌DDoS攻击的⽅法,但需要根据实际情况进⾏调整和优化。同时,还可以考虑使⽤专业的DDoS防护设备或服务来提⾼安全性。

49、Nginx如何监控性能?

Nginx可以通过以下⼏种⽅式来监控性能。

  1. Nginx Stub Status模块:Stub Status模块为Nginx提供了⼀组统计信息,可以通过HTTP请求查询这些信息。使⽤Stub Status模块可以获取当前的请求数、连接数、HTTP状态码等信息,以便于实时监控Nginx的性能指标。

  2. Nginx Plus:Nginx Plus是Nginx官⽅提供的商业版本,它提供了更多⾼级的监控和管理功能,包括实时活动监控、实时流量监控、健康检查和负载均衡等功能。

  3. 第三⽅监控⼯具:可以使⽤⼀些第三⽅的监控⼯具,如Zabbix、Prometheus等来监控Nginx的性能。这些⼯具可以通过HTTP API、⽇志⽂件等⽅式获取Nginx的统计信息,并进⾏图表展示、报警等操作。

  4. ⽇志分析⼯具:可以使⽤⼀些⽇志分析⼯具,如ELK Stack(Elasticsearch、Logstash、Kibana)等来分析Nginx的访问⽇志。通过对访问⽇志的分析,可以获取Nginx的访问模式、访问量、响应时间等信息,从⽽判断Nginx的性能状况。