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
相关产品推荐
相关产品推荐

