Skip to main content

1.Nginx面试题

nginx日志访问量前十的ip怎么统计?

#nginx
awk '{print $1}' /var/nginx/logs/access.log | sort | uniq -c | sort -nr -k1 | head -n 10

#apache
cat /var/log/httpd/access_log | awk '{print $1}' | uniq -c | sort -rn -k1 | head -n 10
  • awk '{print $1}' /var/nginx/logs/access.log:使用 AWK 命令从 Nginx 访问日志中提取第一个字段(默认使用空格分隔),即客户端的 IP 地址。
  • sort:对提取出来的 IP 地址进行排序。
  • uniq -c:对排序后的 IP 地址进行去重,并统计每个 IP 地址出现的次数。
  • sort -nr -k1:根据 IP 地址出现的次数对结果进行逆序排序。
  • head -n 10:取排序后的前 10 行,即出现次数最多的前 10 个 IP 地址。

Nginx服务器上的master和worker进程分别有什么作用?

  1. Master Process(主进程):
    • 启动和管理: 主进程负责启动和管理Nginx服务器。当启动Nginx服务时,主进程会读取配置文件,加载配置,然后启动工作进程。
    • 信号处理: 主进程接收并处理信号,例如重新加载配置、关闭服务器等。通过发送信号给主进程,你可以实现在不停止服务的情况下重新加载配置文件或者优雅地关闭Nginx。
  2. Worker Processes(工作进程):
    • 处理请求: 每个工作进程都是一个独立的进程,负责处理客户端的请求。当有请求到达时,主进程会将请求分配给一个可用的工作进程来处理。
    • 并发处理: 工作进程之间是并发运行的,每个工作进程都能处理多个请求。这使得Nginx能够有效地处理大量并发请求。
    • 独立性: 工作进程是相互独立的,一个工作进程的崩溃不会影响其他工作进程。这有助于提高Nginx的稳定性。

分离主进程和工作进程的设计使得Nginx能够更好地应对高并发的请求,提高服务器的性能和稳定性。主进程负责管理工作进程,而工作进程负责实际处理请求。

Nginx4层和7层的区别

四层负载均衡

  1. 基于 IP 和端口: 四层负载均衡主要根据传输层的信息,即源 IP 地址、目标 IP 地址、源端口和目标端口等。
  2. 速度: 由于关注的是传输层信息,处理速度相对较快。这使得四层负载均衡适用于需要快速分发流量的场景。
  3. 适用范围: 主要用于 TCP 和 UDP 协议的负载均衡,不太关心具体应用层协议。

七层负载均衡

  1. 基于应用层内容: 七层负载均衡不仅关注传输层信息,还深入到应用层内容,例如 HTTP 头部、URL 等。
  2. 高级功能: 具备更高级的功能,如内容缓存、SSL 终端、HTTP 功能调整等。这使得它能够更灵活地处理复杂的应用层场景。
  3. HTTP负载均衡: 在七层中,Nginx可以执行HTTP/HTTPS负载均衡,根据请求的URL、Cookie、HTTP头等信息进行分发。
  4. 适用范围: 适用于需要更深度控制和处理应用层内容的场景,例如Web服务的负载均衡、反向代理等。

nginx 和Apache的区别,为什么nginx轻量

架构设计

  • Apache: 使用多线程或多进程模型,每个连接通常由一个独立的线程或进程处理。这种模型在高并发情况下可能导致资源消耗较大。
  • Nginx: 采用事件驱动的异步架构,使用少量的固定的工作进程来处理多个连接。这种架构对于高并发场景更为高效,因为它能够处理大量的并发连接而不会消耗太多的系统资源。

内存使用效率

  • Apache: 每个连接通常需要一个独立的线程或进程,这可能导致内存使用效率较低,尤其在高并发情况下。
  • Nginx: 使用较少的内存,因为它的事件驱动模型允许处理大量并发连接而不需要为每个连接分配一个独立的线程或进程。

处理并发连接的能力

  • Apache: 处理并发连接时,线程或进程的创建和销毁可能导致较高的开销。
  • Nginx: 在处理成千上万个并发连接时,其资源消耗相对较低,因为它使用少量的工作进程,并且这些进程能够处理多个连接。

模块化性

  • Apache: 具有大量的模块,提供了丰富的功能,但有时可能导致较大的内存占用。
  • Nginx: 也支持模块化,但通常以更轻量的方式实现,并且在设计上更注重核心功能的高效性。

静态文件服务

  • Apache: 静态文件服务性能良好,但在处理大量并发请求时可能面临性能瓶颈。
  • Nginx: 在静态文件服务方面表现出色,能够高效地处理大量并发请求。

nginx有哪些负载模式

轮询(Round Robin): 请求按顺序分配给后端服务器,依次循环。

upstream backend {
server server1;
server server2;
server server3;
}

加权轮询(Weighted Round Robin): 每个服务器配置有一个权重,根据权重分配请求。权重高的服务器获取到的请求更多。

upstream backend {
server server1 weight=3;
server server2 weight=2;
server server3 weight=1;
}

IP Hash: 根据客户端的IP地址进行哈希计算,然后将请求分配给具有对应哈希值的后端服务器。这确保特定IP的请求总是被分配给相同的服务器,有助于保持会话一致性。

upstream backend {
ip_hash;
server server1;
server server2;
server server3;
}

Least Connections: 请求将被分配到当前连接数最少的服务器上。

upstream backend {
least_conn;
server server1;
server server2;
server server3;
}

Fair: 请求将被分配给当前活跃连接数最少的服务器,类似于Least Connections。

upstream backend {
fair;
server server1;
server server2;
server server3;
}

如何优化linux系统作为低延迟服务器

要将 Linux 系统优化为低延迟服务器,你可以采取一系列的操作和调整,包括调整内核参数、网络设置、文件系统配置等。以下是一些常见的优化方法:

内核参数调整:

  1. 调整内核参数:
    • 修改 /etc/sysctl.conf 文件来优化内核参数。例如:

      # 针对网络性能优化
      net.core.rmem_max = 16777216
      net.core.wmem_max = 16777216
      net.core.netdev_max_backlog = 30000
      net.ipv4.tcp_rmem = 4096 87380 16777216
      net.ipv4.tcp_wmem = 4096 87380 16777216
      net.ipv4.tcp_window_scaling = 1
      net.ipv4.tcp_timestamps = 1
    • 然后执行 sysctl -p 以应用更改。

  2. 禁用透明大页(Transparent Huge Pages):
    • 大页支持在某些工作负载下提高性能,但在低延迟要求的场景中可能带来额外的开销。可以通过修改内核参数或使用服务启动脚本来禁用透明大页。

      echo never > /sys/kernel/mm/transparent_hugepage/enabled

网络设置:

  1. 使用高性能网络协议栈:
    • 选择适当的网络协议栈,如 TCP BBR(Bottleneck Bandwidth and RTT)等,以提高网络性能。
  2. 调整网络堆栈参数:
    • /etc/sysctl.conf 中调整网络堆栈参数,如提高文件描述符限制、优化连接追踪表等。

文件系统配置:

  1. 使用 XFS 文件系统:
    • 对于需要处理大量小文件的场景,XFS 文件系统通常比较高效。
  2. SSD 或 NVMe 存储:
    • 使用高性能的固态硬盘(SSD)或非易失性内存(NVMe)来提高磁盘性能。

时钟和定时器:

  1. 使用高分辨率时钟:
    • 使用 clocksource=tscclocksource=hpet 等高分辨率时钟源。
  2. 减小时钟中断间隔:
    • 缩短时钟中断间隔以减小延迟。

应用程序层面:

  1. 使用高性能应用服务器:
    • 使用专门设计用于低延迟的应用服务器,例如 Nginx 或 OpenLiteSpeed。
  2. 禁用不必要的服务:
    • 禁用系统中不必要的服务和功能,减少资源占用。

负载均衡,你了解的常⽤软件有哪些?请写出⾄少三种以上,并评价各⾃的缺点。

  1. Nginx:
    • 优点:
      • 高性能,能够处理大量并发连接。
      • 轻量级,占用资源相对较少。
      • 支持反向代理和多种负载均衡算法。
    • 缺点:
      • 不能处理动态内容的负载均衡。
  2. HAProxy:
    • 优点:
      • 高性能,适用于大规模部署。
      • 强大的负载均衡算法和调度器。
      • 可以处理复杂的负载均衡需求,支持会话保持等。
    • 缺点:
      • 缺少对动态内容的处理能力。
      • 配置相对复杂。
  3. Apache Traffic Server:
    • 优点:
      • 高性能的反向代理和缓存服务器。
      • 支持多种负载均衡算法。
      • 可以处理动态和静态内容的负载均衡。
    • 缺点:
      • 相对较大的内存占用。
      • 配置相对复杂。

rewrite 规则中的 last、break、redirect、permanent 的含义

在Nginx的 rewrite指令中,lastbreakredirectpermanent是不同的标志,用于控制重写规则的执行流程和行为。

  • last

    • 使用 last标志会停止当前轮的处理,然后重新启动新的处理轮。这通常用于内部重定向。
    • 例如:rewrite ^/old-url$ /new-url last;
  • break

    • 使用 break标志会停止当前轮的处理,不会进行下一轮处理。可以用于终止所有后续的重写规则。
    • 例如:rewrite ^/break-url$ /final-url break;
  • redirect

    • 使用 redirect标志会发起一个临时重定向(HTTP 302)。
    • 例如:rewrite ^/redirect-url$ /target-url redirect;
  • permanent 使用 permanent标志会发起一个永久重定向(HTTP 301)。

    • 例如:rewrite ^/permanent-url$ /target-url permanent;

解释⼀下cookie和session的区别

  1. 存储位置:
    • Cookie: 存储在客户端,以文本文件形式保存在用户的浏览器中。
    • Session: 存储在服务器端,通常以服务器内存、数据库或其他持久化存储方式保存。
  2. 内容:
    • Cookie: 通常包含有关用户的信息,如标识符、首选项、跟踪信息等。存储在用户浏览器中,每次请求都会附带在HTTP头中。
    • Session: 存储在服务器端的数据,客户端通常只保存一个会话标识符(session ID),而具体的数据则存储在服务器端。
  3. 安全性:
    • Cookie: 不够安全,因为存储在客户端,可以被用户查看和修改。
    • Session: 相对较安全,因为数据存储在服务器端,用户无法直接查看或修改会话数据。
  4. 生命周期:
    • Cookie: 可以设置过期时间,可以是会话级别(浏览器关闭后失效)或持久性的(在指定的过期时间之前有效)。
    • Session: 通常在用户关闭浏览器或长时间不活动后失效。会话的生命周期由服务器管理。
  5. 存储容量:
    • Cookie: 有大小限制,每个域名下的Cookie总存储容量有限制。
    • Session: 通常不受存储容量的限制,但是服务器内存和数据库的大小可能会成为限制因素。
  6. 跨域:
    • Cookie: 可以通过设置Cookie的域属性来实现跨域。
    • Session: 在跨域情况下较难管理,通常需要通过其他机制(如Token)来处理。