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 处理完当前请求后退出,实现无缝切换。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Three.js+React】教程001:绘制简单的盒子

文章目录 React整合Three.js创建项目绘制一个简单的盒子添加坐标辅助器React整合Three.js 在 React 中结合 Three.js 进行 3D 开发,可以使用 React + Three.js + @react-three/fiber 进行高效渲染,同时配合 @react-three/drei 提供的封装工具,让开发更加简洁。 创建项目 …

K8S集群架构及主机准备

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

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件: 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL(Data Definition Language):数据定义语言 1、操…

3.5.7 基于横盘结构的分析体系——缠论(背驰/背离)

背离(背驰) 本文讨论背离主要从量价和时空的角度来讨论。涉及的背离类型如下表: 角度 类型 成交量和价格 量价背离 时间和空间 MACD背离 笔背离 盘整背离 趋势背离 表1-9 背离的角度和类型。 从成交量和价格的角度,本文…

51c嵌入式~电路~合集25

我自己的原文哦~ https://blog.51cto.com/whaosoft/13241709 一、“开关电源”和“普通电源”的区别 什么叫开关电源 随着电力电子技术的发展和创新,使得开关电源技术也在不断地创新。目前,开关电源以小型、轻量和高效率的特点被广泛应用几乎所有的电…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【文件上传】

目录 一. 介绍二. 本地存储三. 阿里云OSS3.1 准备工作3.2 入门程序3.3 案例集成3.4 程序优化 \quad 一. 介绍 \quad 三要素缺一不可 \quad 二. 本地存储 \quad 解决相同命名覆盖问题 \quad 三. 阿里云OSS \quad \quad 3.1 准备工作 \quad \quad 3.2 入门程序 \quad \quad 3.3…

Deepseek-R1 和 OpenAI o1 这样的推理模型普遍存在“思考不足”的问题

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Vue3的el-table-column下拉输入实时查询API数据选择的实现方法

由于本人对el-table-column有下拉输入选择的要求&#xff0c;根据网上搜索的资料及本人优化&#xff0c;推出我比较满意的方法&#xff0c;供各位读者参考使用。 效果图 el-table-column写法 <el-table-columnlabel"货品编号"align"center"prop"…

Electron使用WebAssembly实现CRC-8 MAXIM校验

Electron使用WebAssembly实现CRC-8 MAXIM校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-8 MAXIM格式校验的方式。 CRC-8 MAXIM校验函数WebAssembly源文件 C语言实现C…

使用 Elastic Cloud Hosted 优化长期数据保留:确保政府合规性和效率

作者&#xff1a;来自 Elastic Jennie Davidowitz 在数字时代&#xff0c;州和地方政府越来越多地承担着管理大量数据的任务&#xff0c;同时确保遵守严格的监管要求。这些法规可能因司法管辖区而异&#xff0c;通常要求将数据保留较长时间 —— 有时从一年到七年不等。遵守刑事…

安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.熟悉广播机制的实现流程。 2.掌握广播接收者的创建方式。 3.掌握广播的类型以及自定义官博的创建。 二、实验条件 熟悉广播机制、广播接收者的概念、广播接收者的创建方式、自定广播实现方式以及有…

OPENPPP2 —— VMUX_NET 多路复用原理剖析

在阅读本文之前&#xff0c;必先了解以下几个概念&#xff1a; 1、MUX&#xff08;Multiplexer&#xff09;&#xff1a;合并多个信号到单一通道。 2、DEMUX&#xff08;Demultiplexer&#xff09;&#xff1a;从单一通道分离出多个信号。 3、单一通道&#xff0c;可汇聚多个…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

Deep Crossing:深度交叉网络在推荐系统中的应用

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在机器学习和深度学习领域&#xff0c;特征工程一直是一个关键步骤&#xff0c;尤其是对于大规模的推荐系统和广告点击率预…

AI智慧社区--Excel表的导入导出

Excel表导入导出的环境配置 1.导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>${easypoi.version}</version></dependency>2.配置Excel的导入导出以及…

【C++】B2122 单词翻转

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 &#x1f4af;一、我的做法代码实现&#xff1a;代码解析思路分析 &#x1f4af;二、老师的第一种做法代码实现&a…

【流媒体】搭建流媒体服务器

搭建Windows Nginx服务器 搭建 下载nginx工具包解压至本地&#xff0c;并在cmd窗口中切换至nginx所在的本地目录修改 conf/nginx.conf 文件&#xff0c;更改其端口号 server中的 listen的端口号从 80改为 8080&#xff0c;因为80经常被其他服务占用&#xff0c;导致无法打开 …

编程AI深度实战:给vim装上AI

系列文章&#xff1a; 编程AI深度实战&#xff1a;私有模型deep seek r1&#xff0c;必会ollama-CSDN博客 编程AI深度实战&#xff1a;自己的AI&#xff0c;必会LangChain-CSDN博客 编程AI深度实战&#xff1a;给vim装上AI-CSDN博客 编程AI深度实战&#xff1a;火的编程AI&…

MySQL锁详解

MySQL锁详解 数据库的锁机制锁的分类行级锁与表级锁行级锁之共享锁与排他锁乐观锁与悲观锁悲观锁乐观锁 Innodb存储引擎的锁机制行级锁与表级锁的使用区分三种行锁的算法死锁的问题多版本并发控制MVCC 数据库的锁机制 什么是锁&#xff1f;锁是一种保障数据的机制 为何要用锁…