修改nginx代码在proxy_cache_path 添加suffix=$var 支持缓存文件后缀名。
配置实例:
proxy_cachepath ./cache levels=1:2 suffix=$server_name keys_zone=test:10m max_size=1g;
测试:
./cache/m/co/d0431adbaa72e1b38e0884b71c9d30be_www.test.com
diff --git a/src/http/ngx_http_cache.h b/src/http/ngx_http_cache.h
index f9e96640..1a1a6420 100644
--- a/src/http/ngx_http_cache.h
+++ b/src/http/ngx_http_cache.h
@@ -160,6 +160,8 @@ struct ngx_http_file_cache_s {
ngx_path_t *path;
+ ngx_http_complex_value_t suffix;
+
off_t max_size;
size_t bsize;
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index 3b2b68a2..808092de 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -933,6 +933,7 @@ static ngx_int_t
ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)
{
u_char *p;
+ ngx_str_t suffix;
ngx_http_cache_t *c;
c = r->cache;
@@ -941,8 +942,17 @@ ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)
return NGX_OK;
}
+ suffix.len = 0;
+ if (c->file_cache->suffix.value.len > 0) {
+ if (ngx_http_complex_value(r, &c->file_cache->suffix, &suffix)
+ != NGX_OK)
+ {
+ return NGX_ERROR;
+ }
+ }
+
c->file.name.len = path->name.len + 1 + path->len
- + 2 * NGX_HTTP_CACHE_KEY_LEN;
+ + 2 * NGX_HTTP_CACHE_KEY_LEN + suffix.len;
c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1);
if (c->file.name.data == NULL) {
@@ -953,6 +963,12 @@ ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)
p = c->file.name.data + path->name.len + 1 + path->len;
p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN);
+
+ if (suffix.len > 0) {
+ ngx_memcpy(p, suffix.data, suffix.len);
+ p += suffix.len;
+ }
+
*p = '\0';
ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len);
@@ -2308,7 +2324,7 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
u_char *last, *p;
time_t inactive;
ssize_t size;
- ngx_str_t s, name, *value;
+ ngx_str_t s, suffix, name, *value;
ngx_int_t loader_files, manager_files;
ngx_msec_t loader_sleep, manager_sleep, loader_threshold,
manager_threshold;
@@ -2316,6 +2332,8 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
ngx_array_t *caches;
ngx_http_file_cache_t *cache, **ce;
+ ngx_http_compile_complex_value_t ccv;
+
cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t));
if (cache == NULL) {
return NGX_CONF_ERROR;
@@ -2338,6 +2356,7 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
manager_sleep = 50;
manager_threshold = 200;
+ suffix.len = 0;
name.len = 0;
size = 0;
max_size = NGX_MAX_OFF_T_VALUE;
@@ -2393,6 +2412,14 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
return NGX_CONF_ERROR;
}
+ if (ngx_strncmp(value[i].data, "suffix=", 7) == 0) {
+
+ suffix.data = value[i].data + 7;
+ suffix.len = value[i].len - 7;
+
+ continue;
+ }
+
if (ngx_strncmp(value[i].data, "use_temp_path=", 14) == 0) {
if (ngx_strcmp(&value[i].data[14], "on") == 0) {
@@ -2599,6 +2626,21 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
cache->inactive = inactive;
cache->max_size = max_size;
+ // suffix
+ if (suffix.len > 0) {
+ ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
+
+ ccv.cf = cf;
+ ccv.value = &suffix;
+ ccv.complex_value = &cache->suffix;
+
+ if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "error suffix \"%V\"", &suffix);
+ return NGX_CONF_ERROR;
+ }
+ }
+
caches = (ngx_array_t *) (confp + cmd->offset);
ce = ngx_array_push(caches);
https://github.com/vislee/leevis.com/issues/162
转载请注明:爱开源 » nginx 缓存文件添加后缀名