• nginx 配置location 最好使用最小范围匹配


    一个实际的案例,系统使用了nginx 进行minio 静态资源的proxy,同时基于nginx 的rewrite
    比如http://<domain>/apps/<s3_bucket> ,实际代理的是minio 的http://minioip:port/s3_bucket
    但是因为nginx 同时也配置了一个规则(正则的),同时正则的配置有点范围过大,所以造成请求
    资源访问不正确

    参考nginx 配置

    • nginx proxy minio
     
    location /apps/ {
               if_modified_since off;
               etag off;
               add_header Cache-Control no-store;
               add_header Cache-Control must-revalidate;
               default_type text/html;
               index index.html index.htm;
               rewrite ^/apps/([a-z-A-Z0-9]+)$ /apps/$1/ permanent;
               rewrite ^/apps/([a-z-A-Z0-9]+)/$ /$1/index.html break;
               rewrite ^/apps/(.*) /$1 break;
               proxy_set_header Host $http_host;
               proxy_set_header X-Forwarded-For $remote_addr;
               client_body_buffer_size 10M;
               client_max_body_size 10G;
               proxy_buffers 1024 4k;
               proxy_read_timeout 300;
               proxy_next_upstream error timeout http_404;
               proxy_pass http://minio_prod;
    }
    • 系统原有包含的一个nginx location 配置
      因为有一个系统需要配置匹配规则,同时就写了一个正则
     
    location ~* /static/ {
                proxy_pass http://127.0.0.1:8082;
                proxy_set_header   Host $host;
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Host $server_name;
    }
    • minio 数据桶的一个目录

    问题说明

    因为正则匹配优先比不带修饰符的高,所以资源就走偏了,造成本该请求s3 桶数据的到了以前配置的地方了,页面显示就出现
    问题了

    解决方法

    解决方法很多,对于正则匹配添加前缀开头匹配,参考配置

     
    location ~* ^/static/ {
                proxy_pass http://127.0.0.1:8082;
                proxy_set_header   Host $host;
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Host $server_name;
    }

    说明

    对于nginx 的配置还是应该仔细思考使用那种配置模式,同时使用使用最小原则,好处很明显
    解决问题的同时,不会造成复杂的匹配扩大,造成业务问题,而且还有可能会造成安全问题(比如静态的root
    不小心暴露了tls 证书,暴露的源码)

  • 相关阅读:
    嵌入式框架Zorb Framework搭建五:事件的实现
    C#网络编程系列文章(五)之Socket实现异步UDP服务器
    C#SocketAsyncEventArgs实现高效能多并发TCPSocket通信 (服务器实现)
    C#中的ManagementClass类
    Etcd v3备份与恢复
    kubernetes调度重平衡工具 Descheduler
    K8S – 优化dns解析时间
    kubernetes备份和恢复
    Coredns部署更新
    认识Kubernetes Descheduler
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/14189063.html
Copyright © 2020-2023  润新知