我正在尝试使用 Nginx 为 Web 应用程序生成的缓存文件提供服务,并且发现了一个潜在问题;url-space 很宽,将超过 32000 个子目录的 Ext3 限制。
我想分解子目录,例如制作一个两级文件系统缓存。所以,我目前缓存文件的位置
/var/cache/www/arbitrary_directory_name/index.html
Run Code Online (Sandbox Code Playgroud)
我会把它存储在类似的地方
/var/cache/www/a/r/arbitrary_directory_name/index.html
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法获得try_files
,甚至rewrite
无法进行映射。我对这个主题的搜索使我相信我需要做这样的事情(大量缩写):
http {
map $request_uri $prefix {
/aa* a/a;
/ab* a/b;
/ac* a/c;
...
/zz* z/z;
}
location / {
try_files /var/cache/www/$prefix/$request_uri/index.html @fallback;
# or
# if (-f /var/cache/www/$prefix/$request_uri/index.html) {
# rewrite ^(.*)$ /var/cache/www/$prefix/$1/index.html;
# }
}
}
Run Code Online (Sandbox Code Playgroud)
但我无法获得/aa*
与传入的 uri 匹配的模式。没有*
,它将匹配一个确切的 uri,但我无法让它只匹配前两个字符。
Nginx 文档建议应该允许使用通配符,但我看不到让它们工作的方法。有没有办法做到这一点?我错过了一些简单的东西吗?还是我以错误的方式解决这个问题?
我怀疑只有特殊的主机名模式才支持 globs 。您需要使用正则表达式来实现这一点,因此您的地图应如下所示:
map $request_uri $prefix {
~^/aa(?<suffix>.*)$ /a/a/$suffix;
...
}
Run Code Online (Sandbox Code Playgroud)
更仔细地阅读 Nginx 文档会发现我想要的功能是 Rewrite 模块的一部分。我认为需要的是:
map $request_uri $prefix {
/aa* a/a;
/ab* a/b;
/ac* a/c;
...
/zz* z/z;
}
Run Code Online (Sandbox Code Playgroud)
很容易用这个实现:
if ($request_uri ~= "/(\w)(\w)(.*)") {
set $prefix $1/$2;
}
Run Code Online (Sandbox Code Playgroud)
然后 try_files 指令的工作方式如下:
location / {
root /var/www/cache;
try_files /$prefix$request_uri @fallback;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14975 次 |
最近记录: |