后端面试必备:Nginx中的stub_status和sub_filter指令详解

Nginx面试题 - Nginx中的stub_status和sub_filter指令各自的作用是什么?

回答重点

Nginx中的stub_status指令sub_filter指令各自有着不同的用途:

  1. stub_status指令:这个指令用于启用一个简单的内置状态页面,该页面提供有关Nginx的一些基本运行状态信息,比如当前的活动连接数、已处理的总请求数等。
  2. sub_filter指令:这个指令用于在Nginx代理服务器中的响应内容中指定字符串替换操作。可以替换响应体中出现的某些特定字符串,这在重写HTML内容或者调整一些返回内容时非常有用。

一、stub_status指令

1.1 stub_status指令的作用

stub_status是Nginx的一个内置模块指令,用于提供基本的Nginx状态信息。当启用该指令后,Nginx会暴露一个简单的状态页面,显示当前服务器的活动连接数、请求处理统计等基本信息。

1.2 配置示例

server {
    listen 80;
    server_name localhost;
    
    location /nginx_status {
        stub_status;
        allow 127.0.0.1;  # 只允许本地访问
        deny all;         # 禁止其他所有IP访问
    }
}

1.3 输出信息解读

访问配置的URL(如http://localhost/nginx_status)会返回类似以下信息:

Active connections: 291 
server accepts handled requests
 16630948 16630948 31070465 
Reading: 6 Writing: 179 Waiting: 106 

各项含义:

  • Active connections: 当前活跃连接数
  • accepts: 已接受的客户端连接总数
  • handled: 已处理的连接总数
  • requests: 客户端请求总数
  • Reading: Nginx正在读取请求头的连接数
  • Writing: Nginx正在向客户端写入响应的连接数
  • Waiting: 保持活跃的空闲客户端连接数

1.4 监控流程图

允许访问
拒绝访问
客户端请求状态页面
Nginx检查访问权限
收集当前状态数据
返回403错误
生成状态页面
返回给客户端

二、sub_filter指令

2.1 sub_filter指令的作用

sub_filter是Nginx的ngx_http_sub_module模块提供的指令,用于在响应内容中替换字符串。它可以在Nginx将响应发送给客户端之前,修改响应体中的特定内容。

2.2 配置示例

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_pass http://backend;
        sub_filter '原字符串' '替换字符串';
        sub_filter_once off;  # 替换所有匹配项而不仅是第一个
        sub_filter_types text/html;  # 只对HTML内容进行替换
    }
}

2.3 常用参数

  • sub_filter_once: 设置为on时只替换第一个匹配项,off则替换所有
  • sub_filter_types: 指定哪些MIME类型的响应会被处理,默认为text/html

2.4 内容替换流程图

客户端请求
Nginx接收请求
代理到后端服务器
获取响应内容
内容类型匹配?
执行字符串替换
直接返回响应
返回修改后的响应

三、stub_status与sub_filter的比较

特性 stub_status sub_filter
功能 提供Nginx状态信息 修改响应内容
模块 内置模块 ngx_http_sub_module
使用场景 监控和调试 内容修改和适配
配置位置 location块内 location块内
是否需要编译 默认包含 可能需要单独编译

四、结合使用示例

server {
    listen 80;
    server_name monitor.example.com;
    
    # 状态监控页面
    location /nginx_status {
        stub_status;
        allow 192.168.1.0/24;
        deny all;
        
        # 修改状态页面的显示格式
        sub_filter 'Active connections' '活跃连接数';
        sub_filter 'Reading' '读取中';
        sub_filter 'Writing' '写入中';
        sub_filter 'Waiting' '等待中';
    }
    
    # 其他代理配置
    location / {
        proxy_pass http://backend;
        sub_filter 'http://backend' 'https://example.com';
        sub_filter_once off;
    }
}

五、总结

stub_statussub_filter是Nginx中两个功能不同但都非常有用的指令:

  1. stub_status:为管理员提供了一种简单的方式来监控Nginx服务器的基本状态,对于性能调优和故障排查非常有帮助。

  2. sub_filter:提供了一种轻量级的响应内容修改机制,可以用于URL重写、内容替换等各种场景,而无需修改后端应用代码。

理解并合理使用这两个指令,可以大大增强Nginx服务器的可观察性和灵活性。

你可能感兴趣的:(#,Nginx面试题,面试,nginx,java,运维,后端)