Nginx 运维开发高频面试题详解

一、基础核心问题

原文链接:https://blog.csdn.net/weixin_51146329/article/details/142963853

1、什么是Nginx?

Nginx 是一个高性能的 HTTP 和反向代理服务器,它以轻量级和高并发处理能力而闻名。

Nginx 的反向代理功能允许它作为前端服务器,接收客户端的请求并将它们转发到后端服务器,这样可以隐藏后端服务器的细节,提高安全性

Nginx 也能够作为负载均衡器,将流量分配到多个后端服务器,这样可以提高网站的可用性和扩展性。

Nginx 还支持静态文件服务,由于其高效的文件处理能力,它经常被用来作为静态资源的服务器,如图片、CSS 和 JavaScript 文件等

2. Nginx的特点和优势是什么?

Nginx 是一个高性能的 HTTP 和反向代理服务器,具有以下特点和优势:

  • 高并发处理:Nginx 使用异步非阻塞 I/O 模型(如 epoll 在 Linux 系统中),这使得它可以高效地处理大量并发连接。每个 Worker 进程可以处理数千个并发连接而不消耗过多资源

  • 低内存消耗:由于其轻量级的设计,Nginx 占用的系统资源相对较少,即使在处理数万并发连接时也能保持较低的内存占用 ty-reference。

  • 反向代理与负载均衡:Nginx 提供了强大的反向代理功能,并且支持多种负载均衡算法,比如轮询、加权轮询、IP Hash 等,能够有效地分散流量并提高服务可用性

  • 热部署:Nginx 支持平滑重启(nginx -s reload),可以在不中断现有服务的情况下加载新的配置文件或升级到新版本

  • 模块化设计:Nginx 的核心功能是通过一系列独立的模块实现的,这些模块可以根据需要进行编译加载,从而提供了高度的灵活性

3. Nginx的Master-Worker进程模型是如何工作的?

Nginx 采用了一种称为 Master-Worker 的架构来管理请求处理流程:

  • Master 进程:作为主控进程,它负责读取和验证配置文件、绑定端口以及启动和监控 Worker 进程。此外,Master 还能响应来自管理员的操作指令,例如重新加载配置或者优雅地关闭服务

  • Worker 进程:由 Master 创建的多个 Worker 进程实际负责处理客户端请求。每个 Worker 都是一个单线程进程,利用事件驱动机制处理网络I/O操作。通常情况下,Worker 的数量设置为 CPU 核心数以最大化硬件利用率

4、Nginx怎么处理请求的?

1、接收请求:当客户端发送一个 HTTP 请求到 Nginx 时,Nginx 的工作进程或线程会接收这个请求。
2、匹配 Server 和 Location:Nginx 会根据请求的域名和 URI 匹配相应的 server 块和 location 块。这是通过 listen 和 server_name 指令匹配 server 模块,再匹配 server 模块里的 location 实现的。
3、处理请求:一旦匹配到相应的 location 块,Nginx 就会根据该块中的配置处理请求。这可能涉及到静态文件服务、代理请求到后端服务器、重定向、返回错误页面等操作。
4、响应客户端:处理完请求后,Nginx 会生成一个响应并发送回客户端。

5. 正向代理 vs 反向代理的区别?Nginx属于哪种?

  • 正向代理:代理服务器位于客户端与目标服务器之间。客户端通过代理服务器向目标服务器发送请求。目标服务器只能看到代理服务器的 IP 地址,而看不到客户端的真实 IP 地址。正向代理通常用于客户端访问互联网时,通过代理服务器来访问外部资源,这可以提高安全性和隐私保护。

  • 反向代理:反向代理位于客户端和目标服务器之间,但与正向代理不同,客户端通常不知道反向代理的存在。反向代理隐藏了后端的真实服务器,对外表现为单一入口点。客户端无需知道后端的具体结构,所有请求都直接发送给反向代理服务器。后端服务器处理请求并将响应返回给反向代理服务器,反向代理服务器再将响应返回给客户端。

Nginx 主要用于反向代理场景,但也可以通过特定配置实现正向代理功能

6、使用“反向代理服务器”的优点是什么?

隐藏服务器:反向代理服务器可以隐藏后端服务器的存在和特征,这有助于提高安全性,因为外部用户无法直接访问后端服务器。

负载均衡:反向代理可以作为负载均衡器,将流量分配到多个后端服务器,这样可以提高网站的可用性和扩展性。

缓存静态内容:反向代理服务器可以缓存静态内容,如图片、CSS 和 JavaScript 文件等,这样可以减少后端服务器的负载并提高响应速度。

SSL 终端:反向代理服务器可以处理 SSL/TLS 加密,这样可以减轻后端服务器的加密负担。

7、Nginx的优缺点?

优点:
高性能和高并发:Nginx 能够处理大量的并发连接,而内存消耗相对较小,这使得它在高流量场景下表现出色。

静态文件处理:Nginx 在处理静态文件方面非常高效,它能够快速地提供图片、CSS、JavaScript 等静态资源。

负载均衡:Nginx 可以作为负载均衡器,将流量分配到多个后端服务器,这样可以提高网站的可用性和扩展性。
动态处理能力:Nginx 在处理动态内容方面相对较弱,它更适合作为静态资源的服务器和反向代理。对于需要复杂动态处理的应用,可能需要与其他应用服务器(如 PHP、Node.js)配合使用。


8、Nginx应用场景?

HTTP 服务器:Nginx 可以作为 HTTP 服务器独立提供 HTTP 服务,适用于静态网站托管。

反向代理和负载均衡:Nginx 可以作为反向代理服务器,将请求转发到后端服务器,并支持负载均衡,这对于高流量网站和应用来说非常重要。

API 网关:Nginx 可以配置为 API 网关,对每个接口服务进行拦截和路由,提供额外的安全层和流量控制。

邮件代理:Nginx 还可以作为邮件代理服务器,处理邮件传输。

9、Nginx配置文件nginx.conf有哪些属性模块?

events:定义了事件处理的配置,如工作连接数 worker_connections。
http:定义了 HTTP 服务器的配置,包括文件类型、默认类型、连接超时等。
server:定义了虚拟主机的配置,可以包含多个 server 块,每个块定义了一个虚拟主机的设置。
location:定义了请求的匹配和处理规则,可以根据 URI、正则表达式等匹配请求,并指定处理方式。
upstream:定义了负载均衡的配置,可以指定多个后端服务器,并设置负载均衡策略。

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

Nginx 可以通过配置 CORS(跨源资源共享)头部来解决前端跨域问题。以下是配置 CORS 的步骤:
在 server 或 location 块中,使用 add_header 指令添加 Access-Control-Allow-Origin 头部,指定允许访问的源。
如果需要,还可以添加 Access-Control-Allow-Methods 头部,指定允许的 HTTP 方法。
对于需要凭证的请求,可以添加 Access-Control-Allow-Credentials 头部。

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

在 Nginx 中配置虚拟主机主要涉及 server 块的设置。以下是配置虚拟主机的步骤:

定义 server 块:每个 server 块定义了一个虚拟主机的配置。
设置监听端口:使用 listen 指令设置服务器监听的端口,通常是 80(HTTP)和 443(HTTPS)。
设置服务器名称:使用 server_name 指令设置虚拟主机的域名。
定义 location 块:在 server 块内部定义 location 块,设置请求的处理规则。
设置根目录:使用 root 指令设置网站内容的根目录。
设置默认首页:使用 index 指令设置默认首页文件。

12、location的作用是什么?

location 指令在 Nginx 配置中扮演着核心角色,它定义了如何处理进入 Nginx 的 HTTP 请求。location 块可以匹配不同的 URI、正则表达式或指定的字符串,从而允许对特定的请求路径应用不同的处理规则。
精确匹配:使用 = 符号进行精确匹配,例如 location = / 匹配根路径。
字符串开头匹配:使用 ^~ 符号匹配以特定字符串开头的 URI。
正则表达式匹配:使用 ~ 或 ~* 符号进行正则表达式匹配,其中 ~ 是区分大小写的,而 ~* 是不区分大小写的。
通用匹配:使用 / 符号进行通用匹配,作为最后的选择,如果其他匹配都未成功,请求将被这个 location 块处理。

13. 如何配置Nginx实现负载均衡?常见的算法有哪些?

Nginx 支持多种负载均衡策略,包括但不限于:

  • 轮询(Round Robin):默认方式,依次分配请求到各后端服务器 ty-reference。
  • 加权轮询(Weighted Round Robin):根据权重分配请求,权重越大分配比例越高 ty-reference。
  • IP Hash:基于客户端 IP 地址的哈希值分配请求,保证同一客户端总是被定向到同一台后端服务器 ty-reference。
  • 最小连接数(Least Connections):将请求分发给当前连接数最少的服务器 ty-reference。

二、配置与调优

14. location匹配规则优先级(=、^、~*、无符号)

Nginx 的 location 匹配遵循特定顺序:

  • =:精确匹配,只有完全匹配路径才会生效。
  • ^~:前缀匹配,一旦匹配成功则不再尝试正则表达式匹配。
  • ~~*:区分大小写的正则匹配和不区分大小写的正则匹配。
  • 普通前缀匹配:最长前缀匹配原则

15. 如何实现URL重写(rewrite)?举例说明

Nginx 的 rewrite 指令允许你修改请求 URI,常用于 URL 重定向或内部转发:

server {
    rewrite ^/old-page/(.*)$ /new-page/$1 permanent; # 301永久重定向
    rewrite ^/user/(\d+)$ /user/profile?id=$1 last;   # 内部转发
}

16. 如何限制Nginx的并发连接数?

http {
    # 定义限制区域:以客户端IP为键,分配10MB内存存储状态
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location / {
            # 每个IP同时最多允许100个连接
            limit_conn addr 100;
            # 超出限制返回503错误
            limit_conn_status 503;
        }
    }
}

17. 如何配置HTTPS?SSL证书如何加载?

server {
    listen 443 ssl;
    server_name example.com;

    # SSL证书路径(PEM格式)
    ssl_certificate      /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key  /etc/nginx/ssl/example.com.key;

    # 优化SSL配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
}

18、Nginx配置高可用性怎么配置?

配置 Nginx 以实现高可用性主要涉及确保 Nginx 能够处理后端服务器的故障,并在必要时将流量重定向到健康的服务器。以下是一些关键的配置步骤:

定义多个后端服务器:在 upstream 块中定义多个服务器,以便在一个服务器失败时有备用服务器可用。
设置超时参数:配置 proxy_connect_timeout、proxy_send_timeout 和 proxy_read_timeout 指令,以便在后端服务器无响应时及时失败转移。
使用 max_fails 和 fail_timeout:配置 max_fails 指令来设置在多长时间内允许多少次失败,以及 fail_timeout 指令来设置服务器失败后应该被排除在外的时间。

三、故障排查与性能优化

19. Nginx的access_log和error_log的作用是什么?如何分析日志?

access_log:

记录客户端请求信息,如 IP、时间、请求方法、状态码、响应大小。

示例日志格式:

192.168.1.1 - - [10/Oct/2023:14:30:01 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0"
常用分析命令:
error_log:

记录 Nginx 运行时的错误信息(如配置错误、后端超时、权限问题)。

日志级别:debug | info | notice | warn | error | crit(默认 error)。

# 实时查看访问日志
tail -f /var/log/nginx/access.log

# 统计状态码为502的请求
grep ' 502 ' /var/log/nginx/access.log | awk '{print $1, $7}'

# 查找错误日志中的超时错误
grep 'upstream timed out' /var/log/nginx/error.log

20. 502 Bad Gateway错误可能的原因?如何排查?

可能原因:

后端服务未启动或崩溃。

反向代理配置错误(如后端地址错误、端口未监听)。

后端服务处理超时(Nginx 的 proxy_read_timeout 设置过短)。

防火墙或网络问题导致 Nginx 无法连接后端。
排查步骤:

检查Nginx error_log:grep "502" /var/log/nginx/error.log。

验证后端服务状态:curl -v http://backend-server:port。

检查网络连通性:telnet backend-server port 或 nc -zv backend-server port。

四、底层原理(加分项)

21. Nginx为什么比Apache更适合高并发场景?

架构模型:

Apache:多进程/多线程模型(如 prefork、worker),每个连接占用一个线程,资源消耗高。

Nginx:事件驱动 + 异步非阻塞模型,单个 Worker 处理数千连接,资源占用低。
内存消耗:

Apache:每个连接约消耗 2MB~8MB 内存。

Nginx:每个连接约消耗 2.5KB 内存。

22. 什么是惊群问题(Thundering Herd)?Nginx如何解决?

问题描述:多个进程/线程同时监听同一端口,当新连接到达时,所有进程被唤醒竞争资源,导致 CPU 资源浪费。

Nginx 解决方案:

使用 accept_mutex 锁(默认开启):同一时间只有一个 Worker 进程监听端口。

当有新连接时,获得锁的 Worker 处理连接,其他 Worker 继续处理现有请求。

五、实战场景

23. 如何用Nginx实现动静分离?

server {
    # 静态资源(图片、CSS、JS)
    location ~* \.(jpg|png|css|js)$ {
        root /data/static;
        expires 30d;  # 客户端缓存30天
        access_log off;  # 关闭日志减少磁盘IO
    }

    # 动态请求(API)
    location /api {
        proxy_pass http://backend_server;
        proxy_set_header Host $host;
    }
}

24. 如何限制某个IP的访问频率?

http {
    # 定义限流区域:每秒10个请求(10r/s),突发允许20个请求
    limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;

    server {
        location / {
            limit_req zone=ip_limit burst=20 nodelay;
            # nodelay表示突发请求立即处理,不延迟
        }
    }
}

六、扩展问题

25. Nginx如何实现热部署(Reload)?

流程:

执行 nginx -s reload 向 Master 进程发送 SIGHUP 信号。

Master 检查新配置文件语法是否正确。

若配置正确,启动新的 Worker 进程,并逐步关闭旧的 Worker。

旧 Worker 处理完当前请求后退出,实现无缝切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

核心集:DeepCore: A Comprehensive Library for CoresetSelection in Deep Learning

目录 一、TL;DR 二、为什么研究核心集? 三、问题定义和如何做 3.1 问题定义 3.2 业界方法 3.2.1 基于几何的方法 3.2.2 基于不确定性的方法 3.2.3 基于误差/损失的方法 3.2.5 GraNd 和 EL2N 分数 3.2.6 重要性采样 3.2.7 基于决策边界的办法 …

MyBatis-Plus笔记-快速入门

大家在日常开发中应该能发现,单表的CRUD功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。 因此,目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

Redis - String相关命令

目录 setgetmsetmgetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappendgetrangesetrangestrlen字符串类型编码方式总结 Redis - String Redis存储的字符串,是直接按二进制方式存储,不会做任何编码转换,存的是什么&#xff…

优选算法合集————双指针(专题二)

好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …

本地Ollama部署DeepSeek R1模型接入Word

目录 1.本地部署DeepSeek-R1模型 2.接入Word 3.效果演示 4.问题反馈 上一篇文章办公新利器:DeepSeekWord,让你的工作更高效-CSDN博客https://blog.csdn.net/qq_63708623/article/details/145418457?spm1001.2014.3001.5501https://blog.csdn.net/qq…

2. K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

文字加持:让 OpenCV 轻松在图像中插上文字

前言 在很多图像处理任务中,我们不仅需要提取图像信息,还希望在图像上加上一些文字,或是标注,或是动态展示。正如在一幅画上添加一个标语,或者在一个视频上加上动态字幕,cv2.putText 就是这个“文字魔术师”,它能让我们的图像从“沉默寡言”变得生动有趣。 今天,我们…

wsl+phpstorm+xdebug|windows子系统配置phpstorm开发调试|断点调试

安装wsl 安装apache php 安装xdebug扩展,并配置 这里是通过宝塔9.4面板安装的xdebug3.0 [xdebug] xdebug.modedebug xdebug.start_with_requesttrue xdebug.discover_client_hosttrue xdebug.client_host127.0.0.1配置PHPSTORM 注意:新建服务器一定要…

5 前端系统开发:Vue2、Vue3框架(上):Vue入门式开发和Ajax技术

文章目录 前言一、Vue框架(简化DOM操作的一个前端框架):基础入门1 Vue基本概念2 快速入门:创建Vue实例,初始化渲染(1)创建一个入门Vue实例(2)插值表达式:{{表…

语言月赛 202412【顽强拼搏奖的四种发法】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202412] 顽强拼搏奖的四种发法 题目描述 在 XCPC 竞赛里,会有若干道题目,一支队伍可以对每道题目提交若干次。我们称一支队伍对一道题目的一次提交是有效的,当且仅当: 在本次提交…

nodejs:express + js-mdict 网页查询英汉词典,能播放声音

向 DeepSeek R1 提问: 我想写一个Web 前端网页,后台用 nodejs js-mdict, 实现在线查询英语单词 1. 项目结构 首先,创建一个项目目录,结构如下: mydict-app/ ├── public/ │ ├── index.html │ ├── st…

使用Pygame制作“太空侵略者”游戏

1. 前言 在 2D 游戏开发中,“太空侵略者”是一款入门难度适中、却能覆盖多种常见游戏机制的项目: 玩家控制飞船(Player)左右移动,发射子弹。敌人(Enemy)排列成一行或多行,从屏幕顶…

Linux find 命令 | grep 命令 | 查找 / 列出文件或目录路径 | 示例

注:本文为 “Linux find 命令 | grep 命令使用” 相关文章合辑。 未整理去重。 如何在 Linux 中查找文件 作者: Lewis Cowles 译者: LCTT geekpi | 2018-04-28 07:09 使用简单的命令在 Linux 下基于类型、内容等快速查找文件。 如果你是 W…

JVM 四虚拟机栈

虚拟机栈出现的背景 由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多…

排序算法与查找算法

1.十大经典排序算法 我们希望数据以一种有序的形式组织起来&#xff0c;无序的数据我们要尽量将其变得有序 一般说来有10种比较经典的排序算法 简单记忆为Miss D----D小姐 时间复杂度 &#xff1a;红色<绿色<蓝色 空间复杂度&#xff1a;圆越大越占空间 稳定性&…

Spring理论知识(Ⅴ)——Spring Web模块

Spring的组成 Spring由20个核心依赖组成&#xff0c;这20个核心依赖可以分为6个核心模块 Spring Web模块简介 众所周知&#xff0c;Java目前最大的一个用途就是作为Web应用的服务端&#xff08;Java Web&#xff09; Spring又是JavaEE中使用最广泛的开发框架&#xff0…

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…

车载软件架构 --- 软件定义汽车面向服务架构的应用迁移

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙

【简介】除了单位用户以外&#xff0c;大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙&#xff0c;固件无法达到目前最高版本7.6&#xff0c;这里以最常用的60E为例&#xff0c;演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多&#xff0c;文章分上、下…

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果&#xff0c;能够为网页增添独特的视觉体验。它通常通过JavaScript和C…