Nginx面筋 - 牛客专供

Nginx牛客专供

大家好,我是希晨er,一名刚毕业的程序猿小登

鉴于牛客平台的氛围,我发布在掘金的文章并不适合直接照搬,因此我仅从我校招期间的面试经历中总结关于Nginx的常见面试问题与我的回答思路,仅代表个人。问题排序分先后,建议大家顺序观看

原文我也直接粘在下面,感兴趣的可以自行阅读。欢迎大家积极提出建议和意见,我会在未来做的更好!

Q0:Nginx是什么?它有什么作用?

分析:开场白问题,答定义+简单应用场景,不必特别深入,可以借此引出自己的项目与Nginx的关联,掌控面试主动权;如有可能,尽量避免深究Nginx内部架构(我不熟的我忽视)——除非面试官专门提问,见后文

A:Nginx是一个轻量的、高性能的开源Web服务器,可以用于提供反向代理负载均衡动静分离等多种实用功能。在我的xx项目当中就用到了Nginx作为【静态资源服务器】【反向代理服务器】【负载均衡器】

tag:#Nginx基础#概念解析#功能概述ps:回答完这个问题后,面试官的提问方向有三种:

  • 解释功能:Q1、Q2、Q3
  • 追问项目:需要你自己总结
  • 专门提问:Q5、Q6

Q1:解释一下Nginx【反向代理】

分析:简单基础应用场景,考察网络基础和代理模式的理解。直接回答即可

A:代理或者说正向代理,指的是客户端将自己的请求发送给代理服务器,代理服务器再将请求转发给目标服务器,比如VPN;而反向代理则是指代理服务器接收客户端请求,然后将请求转发给后端的多个服务器上,比如服务器集的负载均衡。

对于正向代理来说,是服务器不知道真实客户端的信息,在服务器眼中是代理对自己发送的请求;对于反向代理来说,是客户端不知道真实服务端的信息,客户端只知道自己请求的是代理服务器,而不知道具体是机房内哪一台服务器在处理它的请求。

这里给大家分享一下我的个人项目的反向代理策略:我的云服务是2c2g的,部署了Nginx作为反向代理服务器、部署了多个不同的项目,通过Nginx配置不同虚拟主机,将不同的端口的请求转发到不同的项目上。

server {
    listen 3000;
    server_name ip;
    ...
}

server {
    listen 3001;
    server_name ip;
    ...
}

tag:#Nginx基础#反向代理#代理模式ps:提问方向:

  • 下一个知识点:Q2、Q3
  • 追问项目:需要你自己总结

Q2:解释一下Nginx【负载均衡】

分析:简单基础应用场景,其实背一下负载均衡策略就能过。直接回答即可,可以用自己的项目来举例子

A:负载均衡是通过Nginx的【反向代理】功能实现的,它将客户端的请求分发到多个后端服务器上,按照一定策略将请求进行分发。Nginx可以配置多种负载均衡策略,包括轮询(默认)、IP-hash、最少连接、权重分配等。

  • 轮询:将请求按照顺序依次分配给每个后端服务器,每个服务器处理的请求数量大致相同。
  • 权重分配:根据后端服务器的配置权重,将请求按照权重比例分配给不同的服务器。
  • IP-hash:根据客户端的IP地址进行哈希计算,将相同IP的请求分配到同一个后端服务器上,便于保持会话状态。
  • 最少连接:将请求分配给当前连接数最少的后端服务器。

tag:#Nginx基础#负载均衡#集群架构ps:提问方向:

  • 下一个知识点:Q3
  • 追问项目:需要你自己总结

Q3:解释一下Nginx【动静分离】

分析:简单基础应用场景,直接回答即可

A:动静分离是指将静态资源和动态请求分离开处理的架构模式。比如最常见的前后端分离架构,前端请求静态资源(HTML、CSS、JS、图片等)直接由Nginx处理,而动态请求(如API请求)则通过反向代理由后端服务器处理。一般的实践是通过location指令将动态请求和静态请求分离开来,比如:

location /api {
    proxy_pass http://backend;
}

location / {
    root /path/to/static/files;
    index index.html;
}

tag:#Nginx基础#动静分离#资源优化

Q4:Nginx的配置文件结构

分析:实际配置过Nginx配置文件,这道题就非常简单,哪怕背的不熟面试官也能看出来你是实际配过的,反之若逻辑不通,背再熟也早晚露馅。推荐大伙儿还是自己手动实践一下。

一图胜千言:![[../../附件/Pasted image 20251024103313.png]]图源:面试被常问的Nginx_牛客网

其实很多非核心原理问题只要吃透了Nginx配置文件,问啥直接看配置文件就知道答案了。

tag:#Nginx基础#配置文件#结构解析#实践技能

Q5:Nginx有哪些优点?

分析:传统的八股思维就是硬撕事件驱动和异步模型(后面也有),但我喜欢往应用上靠,你不直接问我就不直接回答。

A:相较于传统的Web服务器,Nginx最明显的有点就是它的高并发处理能力,能够同时处理成千上万个并发连接;其次是它在运维架构上能够做到高可用,比如:不停机更新、动态扩容等,比如我的xx项目上就用到了【不停机更新】【动态扩容】

tag:#Nginx基础#高并发处理#高可用架构#性能优化ps:回答完这个问题后,面试官的提问方向有两种:

  • 细究高并发:Q6、Q7
  • 追问项目:需要你自己总结,可参考Q9,动态扩容直接upstream,不多讲

Q6:Nginx的Master-Worker进程模型是如何工作的?

分析:该模型涉及Nginx高性能、高并发的实现原理。问到了再回答,没问到就不提

A:Nginx的Master-Worker进程模型是一种高效的并发处理模型,它通过Master进程和多个Worker进程的协作,实现了高并发、高可用的Web服务。

Master进程负责管理工作进程、处理信号、监控Worker进程健康状态等,它不处理任何用户请求,只负责管理和协调Worker进程;Worker进程则负责监听端口、接收客户端请求并处理。多个Worker进程之间是并行处理请求的,每个进程都有自己的事件循环,能够独立处理请求,互不干扰。

worker_processes设置与之关联,一般为CPU核心数

tag:#Nginx进阶#进程模型#架构设计#高并发原理

Q7:Nginx的异步事件循环模型是如何工作的?

分析:该模型涉及Nginx高性能、高并发的实现原理。问到了再回答,没问到就不提

A:Nginx采用Reactor模式的异步事件循环模型,每个Worker进程内部采用单线程事件循环的方式处理请求,基于非阻塞IO和事件轮询机制,能够高效处理大量并发连接。

而传统的多线程模型,每个线程处理一个连接,线程数量受限于系统资源,无法处理大量并发连接。

在Nginx启动时,Master进程会创建监听socket,然后将这些socket传递给各个Worker进程。当有新的连接到达时,各Worker进程接受连接,将其注册到自己的事件循环中,等待事件触发。事件循环会不断轮询所有注册的连接,检查是否有可读或可写事件发生。一旦有事件触发,Worker进程会立即调用对应的处理函数进行处理。

以一个HTTP请求GET /index.html为例:

  • 用户请求到达Nginx服务器,该连接被注册到事件循环中
  • 事件循环发现该连接存在一个可读事件(GET /index.html请求到达)
  • Nginx将该连接分发给空闲的Worker进程处理
  • Worker进程处理完成(磁盘读取index.html,非阻塞IO),将响应注册到事件循环中,等待可写事件触发
  • 事件循环发现该连接存在一个可写事件(index.html文件已准备好)
  • Nginx将响应发送给客户端
  • 客户端收到响应,关闭连接,同时将连接从事件循环中注销

tag:#Nginx进阶#事件驱动#异步模型#Reactor模式#非阻塞IO

Q8:如何保证Nginx后端应用获取到真实的客户端IP,而不是Nginx的IP?

分析:这是一个实际应用场景:用Nginx作为【反向代理】之后,后端服务器日志记录到的IP全是Nginx的IP,而不是客户端的IP。需要结合Nginx的配置才能实现。考察反向代理客户端透传IP的场景

A:由于Nginx作为反向代理,因此TCP连接中的IP一定是Nginx的IP;通过调整Nginx的配置,可以将客户端IP信息通过标准的HTTP头部传递给后端。

具体来说,Nginx可以通过设置proxy_set_header指令,将客户端的IP信息添加到HTTP请求头中,常用的头部有X-Real-IPX-Forwarded-For

proxy_pass http://backend_app;

# 设置X-Real-IP头,传递单个客户端的真实IP
proxy_set_header X-Real-IP $remote_addr;
# 设置X-Forwarded-For头,传递整个代理链的IP列表
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ... 其他配置

tag:#Nginx进阶#反向代理#客户端IP透传#网络架构ps:相关问题:

  • 反向代理:Q1

Q9:Nginx如何解决跨域问题?

分析:先介绍跨域问题的定义,再详细讲解Nginx如何解决跨域问题。

A:跨域问题是指在浏览器端,仅支持同一服务下的资源请求,不同服务之间的请求被浏览器拦截(早期浏览器安全考虑)。一般解决方案就是在后端在响应的Header中添加Access-Control-Allow-Origin字段,允许指定的域名或所有域名访问。

此时,Nginx作为所有后端的反向代理,可以代替后端服务处理跨域请求。具体实现如下:

location /api {
    proxy_pass http://backend_app;
    add_header Access-Control-Allow-Origin *; # 根据生产环境需求
    # ... 其他配置
}

tag:#Nginx进阶#跨域问题#Web安全#HTTP头设置ps:相关问题:

  • 反向代理:Q1
  • 配置文件:Q4

Q10:Nginx的【不停机更新】是如何实现的?

分析:先解释【不停机更新】的应用场景,再讲如何配置Nginx实现不停机更新。

A:Nginx实现不停机更新有两种方式:

  1. 负载均衡方式:人造一个新旧并存的”多节点架构“,通过引入新版本节点,逐步将流量从旧节点切换到新节点,待流量完全切换后再移除旧节点。
  2. 热更新方式:利用Nginx自身的信号控制机制,发送HUP信号可以重载配置;发送USR2+WINCH信号可以实现二进制文件的无缝升级,期间不会丢失连接。(复杂,还没学到这里)

tag:#Nginx应用#高可用#不停机更新#运维技巧#无感知部署ps:提问方向:

  • 负载均衡:Q2

结语

感谢各位读者的耐心阅读!希望这份Nginx面试指南能为你的求职或技术提升提供实用帮助。

如果你在实践中遇到了新的面试题,或发现文中有任何疏漏和错误,欢迎在评论区提出建议、意见或纠错,这将帮助我不断完善内容质量。

想了解更全面的Nginx安装、配置与应用实践,请查看原文:Nginx从入门到实践:安装、配置与应用 - 掘金

祝大家面试顺利,技术之路越走越宽广!

#大厂面试问八股多还是项目多?##面试题刺客退退退##面试时最害怕被问到的问题#
🍊晨光随笔 文章被收录于专栏

所思所想,闲聊杂谈

全部评论

相关推荐

评论
1
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务