You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx中/myapp/readiness访问日志关闭配置失效的解决办法

Nginx配置问题:为/myapp/readiness路径关闭access_log

问题描述

我配置了以下两个location块(还有其他块):

location ~ ^/myapp {
  try_files $uri /myapp/index.html;
}

# 关闭就绪性健康检查的日志
location /myapp/readiness {
    access_log off;
    log_not_found off;
}

最后一个/myapp/readiness的location块并未生效,我考虑将其以条件判断的方式嵌套到第一个块中,示例如下:

location ~ ^/myapp {
  try_files $uri /myapp/index.html;
  if (location /myapp/readiness) {
    access_log off;
    log_not_found off;
  }
}

请问这种方式是否可行?或者应该如何配置才能仅为/myapp/readiness路径关闭access_log?

补充:完整nginx.conf文件如下:

server {
    listen       8080;
    server_name  localhost;

    root /usr/share/nginx/html;
    index /myapp/index.html;

    ssl_protocols TLSv1.2;

    gzip on;
    gzip_min_length 1000;
    gzip_comp_level 9;
    gzip_buffers 16 8k;
    gzip_http_version 1.0;
    gzip_proxied any;

    gzip_types
      text/css
      text/plain
      text/javascript
      application/javascript
      application/json
      application/x-javascript
      application/xml
      application/xml+rss
      application/xhtml+xml
      application/x-font-ttf
      application/x-font-opentype
      application/vnd.ms-fontobject
      image/svg+xml
      image/x-icon
      application/rss+xml
      application/atom_xml;

    gzip_vary on;
    gunzip on;

    location / {
      return 301 myapp/;
    }

    location ~ ^/myapp/mio-bff {
      rewrite ^/myapp/mio-bff(.*)$ $1 break;
      proxy_pass http://mio-bff.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/myapp-admin-web {
      rewrite ^/myapp/myapp-admin-web(.*)$ $1/ break;
      proxy_pass http://myapp-admin-web.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/mio-reports-bff {
      rewrite ^/myapp/mio-reports-bff(.*)$ $1/ break;
      proxy_pass http://mio-reports.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/notifications-bff {
      rewrite ^/myapp/notifications-bff(.*)$ $1/ break;
      proxy_pass http://notifications-bff.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/compensacion-bff {
      rewrite ^/myapp/compensacion-bff(.*)$ $1/ break;
      proxy_pass http://compensacion-bff.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/mievolucion-bff {
      rewrite ^/myapp/mievolucion-bff(.*)$ $1/ break;
      proxy_pass http://mievolucion-bff.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/requests-bff {
      rewrite ^/myapp/requests-bff(.*)$ $1/ break;
      proxy_pass http://requests-bff.cl-myapp:80;
      proxy_redirect off;
    }

    location ~ ^/myapp/credentials-bff {
      rewrite ^/myapp/credentials-bff(.*?)/?$ $1/ break;
      proxy_pass http://credentials-web-bff.cl-myapp:5000;
      proxy_redirect off;
    }

    location ~ ^/myapp/containerstatics {
      rewrite ^/myapp/containerstatics/(.*)$ /statics/$1 break;

      proxy_pass https://XXX.blob.core.windows.net;
      proxy_redirect off;
    }

    location ~ ^/myapp/containerdynamics {
      rewrite ^/myapp/containerdynamics/(.*)$ /dynamics/$1 break;

      proxy_pass https://XXX.blob.core.windows.net;
      proxy_redirect off;
    }

    location ~ ^/myapp/containerdocuments {
      rewrite ^/myapp/containerdocuments/(.*)$ /documents/$1 break;

      proxy_pass https://XXX.blob.core.windows.net;
      proxy_redirect off;
    }

    location ~ ^/myapp/containerdocsprod {
      rewrite ^/myapp/containerdocsprod/(.*)$ /myappdocsprod/$1 break;

      proxy_pass https://XXX.blob.core.windows.net;
      proxy_redirect off;
    }

    location ~* \.(?:css|js)$ {
      try_files $uri =404;
      access_log off;
      expires 30d;
      add_header Cache-Control public;
      tcp_nodelay off;
      open_file_cache max=3000 inactive=120s;
      open_file_cache_valid 45s;
      open_file_cache_min_uses 2;
      open_file_cache_errors off;
    }

    location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|woff)$ {
      try_files $uri =404;
      expires 365d;
      access_log off;
      add_header Vary Accept-Encoding;
    }

    location ~ ^/myapp {
      try_files $uri /myapp/index.html;
    }

    # 关闭就绪性健康检查的日志
    location /myapp/readiness {
        access_log off;
        log_not_found off;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # 引入MIME类型
    include /etc/nginx/mime.types;

    # 不验证客户端SSL证书
    ssl_verify_client off;
}

解决方案

1. 原有配置失效原因

Nginx的location匹配遵循严格的优先级规则:

  • 精确匹配(=前缀)优先级最高
  • 正则匹配(~或~*前缀)优先级高于普通前缀匹配
  • 同优先级的正则匹配按配置文件中的先后顺序匹配

你原来的location /myapp/readiness是普通前缀匹配,而location ~ ^/myapp是正则匹配,优先级更高,所以请求/myapp/readiness时会先命中正则匹配块,后续的前缀匹配块根本不会被执行,导致关闭日志的配置无效。

2. 嵌套if的方式不可行

Nginx的if指令不支持if (location /xxx)这种语法,这样写会直接导致Nginx启动失败,这个思路行不通。

3. 正确配置方法

方法一:使用精确匹配(推荐)

将/myapp/readiness改为精确匹配的location,放在所有/myapp相关的location之前(精确匹配优先级最高,位置其实不影响,但放在前面更直观):

# 先配置精确匹配的就绪检查路径
location = /myapp/readiness {
    access_log off;
    log_not_found off;
    # 健康检查一般需要返回成功状态,可根据实际需求添加:
    # return 200 "OK";
}

# 保留原有/myapp相关的正则匹配块
location ~ ^/myapp/mio-bff {
  rewrite ^/myapp/mio-bff(.*)$ $1 break;
  proxy_pass http://mio-bff.cl-myapp:80;
  proxy_redirect off;
}

# ... 其他/myapp/xxx的正则块 ...

# 最后是通用的/myapp正则匹配块
location ~ ^/myapp {
  try_files $uri /myapp/index.html;
}

精确匹配优先级最高,所有/myapp/readiness请求都会优先命中这个块,从而实现关闭日志的需求。

方法二:在通用/myapp块中用变量判断

如果不想调整location顺序,也可以在~ ^/myapp块中通过$uri变量判断路径,再关闭日志:

location ~ ^/myapp {
  if ($uri = /myapp/readiness) {
    access_log off;
    log_not_found off;
    return 200 "OK"; # 必须添加return,否则会继续执行后面的try_files
  }
  try_files $uri /myapp/index.html;
}

注意:Nginx的if被很多开发者称为“邪恶的if”,在部分场景下会出现意外行为,因此优先推荐方法一。

内容的提问来源于stack exchange,提问作者pmiranda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 08:25:24