一、基础核心问题
原文链接: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 处理完当前请求后退出,实现无缝切换。