Nginx 按域名缓存
2019-8-8 已更新到Nginx最新Stable version nginx-1.16.0
Nginx常用作反向代理服务器,同时起着缓存作用。
我们服务器上运行着成百上千的网站,而且经常需要清理缓存。Nginx默认的缓存文件是散列存放的,想针对性删除某个域名下的缓存就很困难,所以希望在生成缓存的时候能够 按域名 存储。
在网上找到一个类似的需求(已经找不到原文出处),改动Nginx源码(src/http/ngx_http_file_cache.c),过程如下:
static ngx_int_t
ngx_http_file_cache_name(ngx_http_request_t *r, ngx_path_t *path)
{
u_char *p;
ngx_http_cache_t *c;
// new
size_t pathlen;
c = r->cache;
// new
pathlen = path->name.len;
// new
ngx_http_file_cache_domain(r,path);
c->file.name.len = path->name.len + 1 + path->len
+ 2 * NGX_HTTP_CACHE_KEY_LEN;
c->file.name.data = ngx_pnalloc(r->pool, c->file.name.len + 1);
if (c->file.name.data == NULL) {
return NGX_ERROR;
}
ngx_memcpy(c->file.name.data, path->name.data, path->name.len);
p = c->file.name.data + path->name.len + 1 + path->len;
p = ngx_hex_dump(p, c->key, NGX_HTTP_CACHE_KEY_LEN);
*p = '\0';
ngx_create_hashed_filename(path, c->file.name.data, c->file.name.len);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"cache file: \"%s\"", c->file.name.data);
// new
path->name.len = pathlen;
return NGX_OK;
}
上一段代码中加入了一个新的函数ngx_http_file_cache_domain的调用。
先申明一下函数定义:
static ngx_int_t ngx_http_file_cache_domain(ngx_http_request_t *r,
ngx_path_t *path);
具体函数内容:
static ngx_int_t ngx_http_file_cache_domain(ngx_http_request_t *r,ngx_path_t *path)
{
ngx_http_cache_t *c;
u_char *pathname,*pos;
size_t i;
ngx_str_t *key,domain;
c = r->cache;
key = c->keys.elts;
domain.len = key[0].len;
domain.data = ngx_pstrdup(r->pool,& key[0]);
pos = (u_char *) ngx_strchr(domain.data,'/');
if(pos){
*pos = '\0';
domain.len = ngx_strlen(domain.data);
pathname = path->name.data;
i = path->name.len+1;
pathname[i-1] = '/';
ngx_memcpy(&pathname[i],domain.data,domain.len);
path->name.len = i + domain.len;
}
return NGX_OK;
}
修改之后编译安装即可,在Nginx1.4.7
和Nginx.1.6.3
中测试均起作用。修改后文件下载。
如果是Nginx 1.16.0
版本,请使用该文件:下载
附录:
Nginx 1.16.0 安装过程
yum -y install gcc gcc-c++ autoconf automake make zlib zlib-devel openssl openssl-devel pcre pcre-devel
groupadd nginx
useradd -M -g nginx -s /sbin/nologin nginx
tar zxvf nginx-1.16.0.tar.gz
cd nginx-1.16.0
./configure --prefix=/home/nginx --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
make && make install