来源:www.kaoacca.cn | 更新时间:2023-10-27 | 标签:Nginx面试, 负载均衡, 反向代理
在互联网大厂的技术面试中,Nginx 几乎是后端开发、运维工程师以及前端部署岗位的“必问项”。为什么面试官如此青睐 Nginx?因为它不仅仅是一个 Web 服务器,更是高并发架构中的核心组件。从反向代理到负载均衡,从动静分离到 HTTPS 终结,Nginx 几乎涵盖了 Web 服务的所有核心场景。
本站特别整理了 Nginx面试18题 及相关的周边高频考点,旨在帮助求职者不仅“知其然”,更“知其所以然”。以下内容结合了实际生产环境的配置案例,力求在信息密度和实用性上达到最佳平衡。
为了便于阅读,我们将这18道高频面试题分为四大模块:基础原理、配置技巧、性能优化与高可用。以下是详细的解答与背景知识拓展。
解析: Nginx 采用 异步非阻塞 的 I/O 模型,基于事件驱动(Event-driven)。在 Linux 系统中,它主要利用 epoll 系统调用。相比 Apache 的“每连接一进程/线程”模型,Nginx 的 Master-Worker 架构使得单个 Worker 进程可以处理成千上万的并发连接,而不会消耗过多的内存资源。
关键点: 异步非阻塞、epoll、Master-Worker 架构、零拷贝技术。
解析: 反向代理(Reverse Proxy)是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个服务器。在 Nginx 中,主要通过 proxy_pass 指令实现。
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
keepalive 连接有什么用?如何配置?解析: keepalive 允许客户端与服务器保持长连接,避免每次请求都建立新的 TCP 连接(三次握手),从而显著降低延迟并减少服务器资源消耗。在 Nginx 中,需要在 upstream 或 proxy 配置中启用。
upstream backend {
server 192.168.1.10:8080;
keepalive 32; # 每个worker进程保留的空闲连接数
}
location 匹配优先级。解析: Nginx 的 location 匹配顺序非常关键,优先级从高到低如下:
= 精确匹配,优先级最高。^~ 前缀匹配,如果匹配成功,则停止搜索其他正则。~ 和 ~,按配置文件的顺序匹配。/。/ 通用匹配,优先级最低。解析: Nginx 内置了多种负载均衡策略:
解析: 开源版 Nginx 本身不提供主动健康检查功能,但可以通过以下方案实现:
nginx_upstream_check_module,提供主动健康检查功能。解析: 配置 HTTPS 需要申请 SSL 证书(.crt 和 .key 文件),并在 server 块中启用 ssl 指令。
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
注意:建议强制 HTTP 跳转 HTTPS,通过 301 重定向实现。
解析: HSTS(HTTP Strict Transport Security)是一种安全策略机制,告诉浏览器只能通过 HTTPS 访问网站。在 Nginx 中通过添加响应头实现:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
解析: 优化 Nginx 性能可以从以下几个方面入手:
ulimit -n 调整系统文件描述符限制。解析: 动静分离是指将动态请求和静态请求分别由不同的服务器处理。在 Nginx 中,可以通过 location 指令区分。
server {
listen 80;
server_name example.com;
# 静态资源
location ~ \.(gif|jpg|jpeg|png|css|js)$ {
root /var/www/static;
expires 30d;
}
# 动态请求
location / {
proxy_pass http://backend_app;
}
}
解析: 502 错误通常表示后端服务器无响应或连接被拒绝。常见原因及解决方案:
fastcgi_read_timeout)。proxy_read_timeout)。解析: Nginx 提供两种限流方式:
limit_conn_zone 和 limit_conn。limit_req_zone 和 limit_req,支持令牌桶算法,可配置漏桶速率和突发容量。limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search {
limit_req zone=one burst=5;
proxy_pass http://backend;
}
}
解析: 热加载允许在不中断服务的情况下更新配置或重启进程。使用命令 nginx -s reload。主进程(Master)会检查新配置文件的语法,如果正确,会启动新的 Worker 进程并优雅地关闭旧进程。
解析: Nginx 通过 access_log 和 error_log 指令配置日志。可以使用 log_format 自定义格式,包含 IP、时间、请求方法、URI、状态码、referer、user-agent 等。
log_format main 'remote_user [request" '
'body_bytes_sent "$http_referer" '
'"http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
解析: 灰度发布可以通过 weight 参数或 map 指令结合 header 实现。例如,根据 User-Agent 或 Cookie 将特定流量导向新版本服务器。
map group {
default 0;
~version=2 1;
}
upstream backend {
server v1_server weight=9;
server v2_server weight=1;
}
server {
location / {
if ($group = 1) {
proxy_pass http://v2_server;
}
proxy_pass http://v1_server;
}
}
解析: 在 Nginx 中,可以通过添加响应头轻松解决跨域问题。
add_header 'Access-Control-Allow-Origin' '';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
解析: 确保 autoindex 指令关闭(默认关闭)。如果开启,建议配合 location 限制特定目录的访问,或使用 deny all 禁止敏感目录。
解析:
| 特性 | Nginx | Apache |
|---|---|---|
| 架构 | 异步非阻塞,事件驱动 | 同步阻塞,每连接一进程/线程 |
| 高并发 | 擅长处理静态文件和低负载动态请求 | 擅长处理动态内容,资源占用较高 |
| 配置 | 简洁,易于学习 | 复杂,灵活性高 |
| 模块 | 静态编译为主 | 动态加载模块 |
除了面试题目,掌握实际配置能力同样重要。以下汇总了生产环境中常用的 Nginx 配置片段。
实现 URL 美化、301 重定向等。
# 301 重定向
rewrite ^/old-page$ /new-page permanent;
去除 www
if () {
rewrite ^/(.)1/$1 permanent;
}
隐藏版本号,限制访问频率。
# 隐藏 Nginx 版本号
server_tokens off;
限制 IP 访问
allow 192.168.1.0/24;
deny all;
为静态资源设置长期缓存。
location ~ \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
优化 Linux 内核网络参数,如 net.core.somaxconn,net.ipv4.tcp_max_syn_backlog 等,以支持更多并发连接。
配置 gzip on,选择适当的压缩级别(通常 1-6),压缩文本类资源(HTML, CSS, JS, JSON),可显著减少带宽消耗。
启用 HTTP/2 协议,支持多路复用、头部压缩,提升页面加载速度。需在 Nginx 编译时支持 --with-http_v2_module。
调整 ulimit -n,确保 Nginx 能打开足够多的文件描述符,以支持高并发连接。
通过上述 Nginx面试18题 的详细解析,我们可以看到 Nginx 不仅是一个简单的 Web 服务器,更是一个功能强大的反向代理、负载均衡器和 HTTP 缓存服务。从基础原理到高级配置,从性能优化到高可用架构,每一个知识点都体现了 Nginx 在现代互联网架构中的核心地位。
希望本站提供的 Nginx 面试指南和相关周边知识,能帮助您更好地应对技术面试,并在实际工作中灵活运用 Nginx 解决复杂问题。如需了解更多技术细节,请持续关注 kaoacca.cn。