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.7Nginx.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

标签: Nginx, 缓存, 域名, 反向代理, proxy_cache

添加新评论