Nginx 调优面试题

1. 为什么Nginx性能这么高?

  • 原因:Nginx性能高的主要原因包括:
    • 事件驱动模型:Nginx采用异步非阻塞IO模型,基于epoll等高效的事件处理机制,能够高效地处理大量并发连接。
    • 多进程/多线程混合模式:Nginx默认采用单个主进程管理多个工作进程的设计,每个工作进程都是单线程且只做CPU密集型计算,避免了锁竞争,提高系统并发能力。
    • 内存池与零拷贝技术:Nginx通过内存池管理和减少数据复制操作,极大提高了数据传输效率。
    • 轻量级架构:代码简洁,内存占用小,启动快速,处理HTTP请求时资源消耗少。

2. 什么是Nginx?

  • 定义:Nginx 是一个高性能的Web和反向代理服务器,也支持邮件代理、负载均衡器以及通用TCP/UDP代理。它以其稳定、高效及丰富的功能被广泛应用在互联网服务中。

3. 什么是正向代理和反向代理?

  • 正向代理:用户先设置代理服务器地址,客户端通过该服务器访问外部网络资源,对外隐藏了真实客户端信息。常用于突破网络限制或隐私保护。

  • 反向代理:客户端直接访问代理服务器,由代理服务器根据规则转发请求至内部网络的真实服务器,并将结果返回给客户端。主要用于负载均衡、安全隔离、缓存加速等目的。

4. 为什么要用Nginx?

  • 用途:Nginx 通常被用于提升网站性能,例如作为静态内容服务器、动态请求的反向代理、负载均衡器,提供SSL终结点以提高安全性,解决跨域问题,以及进行URL重写、缓存控制等多种任务。

5. Nginx怎么处理请求的?

  • 请求处理流程:Nginx接收到客户端请求后,根据其配置文件(如nginx.conf)中的指令匹配路由(如location块),然后执行相应的动作,可能涉及代理、重定向、缓存、FastCGI或其他处理器。对于静态资源,Nginx可以直接读取并返回;对于动态请求,则可能将其转发到后端应用服务器。

6. Nginx应用场景?

  • 应用场景举例
    • 静态网页和文件服务器
    • 动态内容的反向代理
    • 负载均衡器,分发请求至集群中的不同服务器
    • HTTPS SSL/TLS 加密终止
    • 实现动静态内容分离
    • 作为API网关处理RESTful请求
    • 防止DDoS攻击的安全屏障

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

  • 反向代理优势
    • 隐藏后端服务器IP地址,增强安全性
    • 提供负载均衡能力,分散请求压力
    • 进行缓存优化,减少后端服务器负担
    • 统一入口便于进行权限控制、日志记录和统计分析

8. Nginx的优缺点?

  • 优点

    • 高并发性:Nginx采用事件驱动模型,能够轻松应对大规模并发连接,性能优秀。
    • 稳定性强:即使在高负载下也能保持稳定运行,宕机率低。
    • 灵活配置:Nginx配置文件简洁易懂,支持多种复杂的功能配置,如反向代理、负载均衡、缓存控制、SSL加密等。
    • 模块化设计:通过插件方式支持扩展,可以根据需要加载不同功能模块。
    • 轻量级:内存占用相对较小,适合资源有限的环境。
  • 缺点

    • 动态语言处理能力相对较弱:虽然可以通过FastCGI、uWSGI等方式与PHP、Python等后端应用协作,但相比Apache这类对PHP有原生支持的服务,在某些特定环境下配置相对复杂。
    • 不支持动态模块加载:在生产环境中,修改配置或添加新模块通常需要重启服务。
    • 开发调试工具相对较少:相比其他Web服务器,Nginx在调试方面的可视化工具和社区支持不如Apache丰富。

9. Nginx目录结构有哪些?

  • 典型目录结构
    • /etc/nginx/usr/local/nginx/conf:存放全局配置文件,如 nginx.conf 主配置文件。
    • /var/log/nginx/usr/local/nginx/logs:存储日志文件。
    • /usr/share/nginx/html/usr/local/nginx/html:默认的静态文件根目录,存放静态资源。
    • /etc/nginx/sites-available/etc/nginx/sites-enabled:在一些发行版中,用于存放虚拟主机配置文件,启用站点时会软链接到sites-enabled。

10. Nginx静态资源?

  • Nginx处理静态资源:Nginx非常擅长于高效地处理静态资源,如HTML、CSS、JavaScript文件、图片、视频等。通过简单的配置,可以指定本地目录路径,让Nginx直接从磁盘读取并发送这些资源给客户端,无需经过脚本解析或后端服务器处理。

11. 如何用Nginx解决前端跨域问题?

  • CORS配置:在Nginx中可以通过配置响应头来允许跨域请求。例如,为某个location块添加如下配置:
    location /api {
        if ($request_method = 'OPTIONS') {
            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';
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            return 204;
        }
    
        if ($request_method = 'POST') {
            add_header 'Access-Control-Allow-Origin' '*';
        }
    
        proxy_pass http://backend_server;
    }
    

12. 基于虚拟主机配置域名

  • 虚拟主机配置:在Nginx中,通过创建不同的server块来配置不同的虚拟主机,每个虚拟主机对应一个或多个域名。示例配置如下:
server {
    listen 80;
    server_name example.com www.example.com;  # 配置对应的域名

    # 根据域名配置相关路径和代理规则
    root /var/www/example.com/public_html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name blog.example.com;

    root /var/www/blog.example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP-FPM配置,处理动态请求
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

13. Location的作用是什么?

  • location作用:在Nginx中,location指令用于配置URL前缀或者正则表达式与之匹配的请求处理逻辑。当Nginx接收到一个请求时,会根据URI去查找匹配的location块,并执行该块内的配置指令,比如内容处理、代理、重写等。

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

  • 配置模块:Nginx的配置文件主要包括以下几个核心模块及其配置项:
    • events模块:定义事件处理模型,如worker_connections设置最大并发连接数。
    • http模块:主要负责HTTP协议相关的所有配置,包含server、location、upstream等多个子模块。
    • server模块:定义虚拟主机,包含监听端口、server_name(域名)和多个location块。
    • location模块:匹配请求URL并对匹配成功的请求执行特定操作,如proxy_pass、rewrite等。
    • upstream模块:定义后端服务器组,用于负载均衡和故障转移。
    • access_log和error_log:分别设置访问日志和错误日志路径。
    • include指令:用于引入其他配置文件,组织大型配置结构。

15. Nginx虚拟主机怎么配置?

  • 配置虚拟主机:在nginx.conf或单独的conf文件中,创建一个新的server块,并指定listenserver_name参数:
server {
    listen 80;  # 监听端口
    server_name example.org www.example.org;  # 服务的域名或多个域名

    # 根据需要配置以下内容
    root /var/www/example.org;  # 网站根目录
    index index.html index.htm;

    # location配置和其他高级设置...
}

16. 基于端口的虚拟主机

  • 基于端口区分虚拟主机:通过不同的端口为同一台服务器上的不同服务创建虚拟主机。例如:
server {
    listen 8080;
    server_name localhost;

    # 对应8080端口的服务配置
}

server {
    listen 8081;
    server_name localhost;

    # 对应8081端口的服务配置
}

17. 限流怎么做的?

  • 限流实现:在Nginx中,可以通过各种模块实现限流,其中常用的有ngx_http_limit_req_module和ngx_http_limit_conn_module。

ngx_http_limit_req_module
这个模块通过漏桶算法(Leaky Bucket)实现流量整形和限速。它可以根据请求的处理速率(如每秒请求数)来限制请求,防止过多请求同时到达后端服务器导致过载。基本配置如下:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;  # 定义一个大小为10M,每秒不超过1个请求的共享内存区域

    server {
        location / {
            limit_req zone=mylimit burst=5 nodelay;  # 使用mylimit区域进行限流,允许瞬时超出的最大请求数为5个,若超过此值则立即返回503错误
        }
    }
}

ngx_http_limit_conn_module
这个模块则是用来限制来自单一IP地址的同时连接数,确保每个IP不会占用过多的连接资源。配置示例:

http {
    limit_conn_zone $binary_remote_addr zone=myconnlimit:10m;  # 定义一个大小为10M,用于存储每个IP地址连接计数的共享内存区域

    server {
        location / {
            limit_conn myconnlimit 10;  # 对于myconnlimit区域,每个IP最多允许建立10个并发连接
        }
    }
}

18. location的语法能说出来吗?

  • location语法
    • 精确匹配location = /exact/path { ... } 当请求URI与指定路径完全相同时生效。
    • 前缀匹配location /prefix/path { ... } 当请求URI以指定前缀开始时生效。
    • 正则表达式匹配location ~ pattern { ... } 当请求URI符合Perl兼容正则表达式时生效,注意这里使用波浪线(~)表示普通正则表达式。
    • 正则表达式严格匹配location ~ ^pattern$ { ... } 类似上面的正则匹配,但强调整个URI必须完全匹配表达式。
    • 默认匹配location / { ... } 如果没有其他location匹配成功,则匹配此location。

19. Location正则案例

  • 正则匹配实例
    location ~* \.(jpg|jpeg|gif|png)$ {
        access_log off;  # 关闭图片请求的日志记录
        expires 30d;  # 图片缓存有效期30天
    }
    

在这个例子中,任何以.jpg、.jpeg、.gif或.png结尾的请求都将匹配此location,Nginx将会处理与图片相关的配置,如关闭日志记录并设置较长的缓存期限。

20. 限制并发连接数

  • 限制并发连接数
    limit_conn_zone $binary_remote_addr zone=myconnlimit:10m;
    server {
        location / {
            limit_conn myconnlimit 100;  # 每个IP地址最大并发连接数限制为100
        }
    }
    

上述配置将限制来自单个IP地址的同时连接数不超过100个。

21. 为什么要做动静分离?

  • 动静分离的原因
    • 性能优化:静态资源(如图片、CSS、JS)可以被浏览器缓存,处理它们的请求不需要消耗太多服务器资源,因此通过专门的服务器或CDN来提供静态资源,可以减轻后端应用服务器的压力。
    • 架构扩展:动静分离使得静态资源和动态内容可以独立伸缩,方便运维人员针对不同类型的内容采取不同的缓存策略和服务部署方案。
    • 安全性提升:将静态资源放在不同于业务服务器的地方,可以降低因动态应用漏洞引发的安全风险。

22. 漏桶流算法和令牌桶算法知道吗?

  • 漏桶流算法:漏桶算法是一种流量整形和速率限制算法,其形象比喻为一个固定容量的桶,系统持续以恒定速率流出水滴(处理请求)。无论输入水流的速度如何,输出的水滴速率总是稳定的。如果有过多的水进入桶内,多余的水将被丢弃。这种方式可以平滑突发流入的流量,使其以固定的速率流出。

  • 令牌桶算法:令牌桶算法也是一种流量控制机制,但它允许突发流量。系统以恒定速率产生令牌放入桶中,每次请求到来时,需要从桶中取出一个令牌才能被处理。如果桶中有足够的令牌,请求可以立刻被处理;否则,请求将等待直到有足够的令牌为止。同时,桶本身可以有一定容量存储令牌,这意味着在短时间内可以处理比平均速率更多的请求,这有助于处理突发流量高峰。

在Nginx中,ngx_http_limit_req_module模块实现了类似漏桶算法的限流,而有些第三方模块或服务可以实现更复杂的令牌桶算法。

23. 突发限制访问频率(突发流量):

  • 应对突发流量:在Nginx中,ngx_http_limit_req_module模块的burst参数可用于应对突发流量。它可以设定在一个周期内允许暂时超出平均速率的请求数量,从而在保证整体限速的同时,允许一定范围内的突发流量。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
location / {
    limit_req zone=mylimit burst=5;
}

在这个配置中,burst=5意味着在1秒内,除了常规的1个请求外,还允许5个额外的突发请求通过。

24. Nginx负载均衡的算法怎么实现的?策略有哪些?

  • Nginx负载均衡算法
    • 轮询(Round Robin):默认情况下,Nginx会按顺序将请求分配给各个后端服务器。
    • 权重轮询(Weighted Round Robin):可以为每个后端服务器设置权重,权重越大的服务器将得到更多的请求分配。
    • 最少连接数(Least Connections):优先分配给当前连接数最少的后端服务器。
    • IP哈希(ip_hash):根据客户端IP地址的哈希值选择后端服务器,保证同一个客户端IP的请求会被定向到同一服务器上,提供会话持久性。
    • 一致性哈希(Consistent Hashing):通过第三方模块实现,提供更好的负载均衡和节点增减时的请求分布稳定性。

26. Rewrite全局变量是什么?

  • Rewrite全局变量:在Nginx的Rewrite模块中,全局变量是指可以在整个Nginx配置文件中使用的变量,它们通常用于在请求处理过程中捕获和替换URL。例如 $host 表示请求的主机名,$request_uri 表示原始的请求URI等。这些变量可以用于编写规则进行URL重写、重定向或者其他逻辑判断。

27. 正常限制访问频率(正常流量)

在Nginx中,正常的访问频率限制通常通过ngx_http_limit_req_module模块实现,该模块可以控制单位时间内来自客户端的请求速率。例如,如果你希望限制每个IP地址每秒只能发起一个请求,你可以这样配置:

http {
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;  # 创建一个大小为10MB的共享内存区域,限制每个IP地址每秒不超过1个请求

    server {
        location / {
            limit_req zone=req_limit;  # 应用上述区域的限流规则
        }
    }
}

在上述配置中,limit_req_zone指令定义了一个名为req_limit的限流区域,它基于每个IP地址($binary_remote_addr)进行跟踪,并设置了每秒不超过1个请求的速率限制。rate=1r/s表明了这一速率。

当实际访问速率超过限制时,limit_req指令会按照预设的限流策略进行处理,可以配合burst参数允许一定的突发请求,或者设置nodelay决定是否立即拒绝超出速率的请求。

这种限流方式适用于常态下的访问频率控制,目的是为了防止恶意爬虫、DoS/DDoS攻击或过于频繁的请求导致服务器负载过高。在正常流量范围内,合理设置限流阈值可以保障服务器稳定性和用户体验。

28. Nginx怎么判断别IP不可访问?

  • 禁止特定IP访问

    deny IP_ADDRESS;  # 禁止指定IP访问
    allow all;        # 允许除上述IP之外的所有IP访问
    

    在server或location上下文中,可以设置deny指令来拒绝特定IP地址的访问请求。在配置中首先明确拒绝目标IP,然后用allow指令放行其他所有IP地址。

29. Nginx怎么做的动静分离?

  • 动静分离配置
    location /static {
        alias /var/www/static;  # 静态资源目录
        expires 30d;  # 设置静态资源缓存过期时间
    }
    
    location / {
        proxy_pass http://backend;  # 动态请求转发到后端服务器集群
    }
    

通过不同的location块,Nginx可以分别配置静态资源和动态资源的处理方式。静态资源直接由Nginx服务器响应,而动态请求则转发到后端应用服务器集群处理。这样既提升了静态资源的访问速度,又避免了后端服务器因为处理静态资源而带来的额外负载。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值