一个实际的案例,系统使用了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 证书,暴露的源码)