Changeset 5951:610832763648 in nginx


Ignore:
Timestamp:
12/22/14 09:59:09 (5 years ago)
Author:
Valentin Bartenev <vbart@…>
Branch:
default
Phase:
public
Message:

Upstream: added variables support to proxy_cache and friends.

Location:
src/http
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/http/modules/ngx_http_fastcgi_module.c

    r5949 r5951  
    99#include <ngx_core.h>
    1010#include <ngx_http.h>
     11
     12
     13typedef struct {
     14    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */
     15} ngx_http_fastcgi_main_conf_t;
    1116
    1217
     
    156161
    157162static ngx_int_t ngx_http_fastcgi_add_variables(ngx_conf_t *cf);
     163static void *ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf);
    158164static void *ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf);
    159165static char *ngx_http_fastcgi_merge_loc_conf(ngx_conf_t *cf,
     
    369375      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
    370376      ngx_http_file_cache_set_slot,
    371       0,
    372       0,
     377      NGX_HTTP_MAIN_CONF_OFFSET,
     378      offsetof(ngx_http_fastcgi_main_conf_t, caches),
    373379      &ngx_http_fastcgi_module },
    374380
     
    537543    NULL,                                  /* postconfiguration */
    538544
    539     NULL,                                  /* create main configuration */
     545    ngx_http_fastcgi_create_main_conf,     /* create main configuration */
    540546    NULL,                                  /* init main configuration */
    541547
     
    636642ngx_http_fastcgi_handler(ngx_http_request_t *r)
    637643{
    638     ngx_int_t                     rc;
    639     ngx_http_upstream_t          *u;
    640     ngx_http_fastcgi_ctx_t       *f;
    641     ngx_http_fastcgi_loc_conf_t  *flcf;
     644    ngx_int_t                      rc;
     645    ngx_http_upstream_t           *u;
     646    ngx_http_fastcgi_ctx_t        *f;
     647    ngx_http_fastcgi_loc_conf_t   *flcf;
     648#if (NGX_HTTP_CACHE)
     649    ngx_http_fastcgi_main_conf_t  *fmcf;
     650#endif
    642651
    643652    if (ngx_http_upstream_create(r) != NGX_OK) {
     
    668677
    669678#if (NGX_HTTP_CACHE)
     679    fmcf = ngx_http_get_module_main_conf(r, ngx_http_fastcgi_module);
     680
     681    u->caches = &fmcf->caches;
    670682    u->create_key = ngx_http_fastcgi_create_key;
    671683#endif
     684
    672685    u->create_request = ngx_http_fastcgi_create_request;
    673686    u->reinit_request = ngx_http_fastcgi_reinit_request;
     
    23382351
    23392352static void *
     2353ngx_http_fastcgi_create_main_conf(ngx_conf_t *cf)
     2354{
     2355    ngx_http_fastcgi_main_conf_t  *conf;
     2356
     2357    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_fastcgi_main_conf_t));
     2358    if (conf == NULL) {
     2359        return NULL;
     2360    }
     2361
     2362#if (NGX_HTTP_CACHE)
     2363    if (ngx_array_init(&conf->caches, cf->pool, 4,
     2364                       sizeof(ngx_http_file_cache_t *))
     2365        != NGX_OK)
     2366    {
     2367        return NULL;
     2368    }
     2369#endif
     2370
     2371    return conf;
     2372}
     2373
     2374
     2375static void *
    23402376ngx_http_fastcgi_create_loc_conf(ngx_conf_t *cf)
    23412377{
     
    26182654
    26192655        conf->upstream.cache_zone = prev->upstream.cache_zone;
     2656        conf->upstream.cache_value = prev->upstream.cache_value;
    26202657    }
    26212658
     
    32733310    ngx_http_fastcgi_loc_conf_t *flcf = conf;
    32743311
    3275     ngx_str_t  *value;
     3312    ngx_str_t                         *value;
     3313    ngx_http_complex_value_t           cv;
     3314    ngx_http_compile_complex_value_t   ccv;
    32763315
    32773316    value = cf->args->elts;
     
    32913330
    32923331    flcf->upstream.cache = 1;
     3332
     3333    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
     3334
     3335    ccv.cf = cf;
     3336    ccv.value = &value[1];
     3337    ccv.complex_value = &cv;
     3338
     3339    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
     3340        return NGX_CONF_ERROR;
     3341    }
     3342
     3343    if (cv.lengths != NULL) {
     3344
     3345        flcf->upstream.cache_value = ngx_palloc(cf->pool,
     3346                                             sizeof(ngx_http_complex_value_t));
     3347        if (flcf->upstream.cache_value == NULL) {
     3348            return NGX_CONF_ERROR;
     3349        }
     3350
     3351        *flcf->upstream.cache_value = cv;
     3352
     3353        return NGX_CONF_OK;
     3354    }
    32933355
    32943356    flcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,
  • src/http/modules/ngx_http_proxy_module.c

    r5949 r5951  
    99#include <ngx_core.h>
    1010#include <ngx_http.h>
     11
     12
     13typedef struct {
     14    ngx_array_t                    caches;  /* ngx_http_file_cache_t * */
     15} ngx_http_proxy_main_conf_t;
    1116
    1217
     
    152157
    153158static ngx_int_t ngx_http_proxy_add_variables(ngx_conf_t *cf);
     159static void *ngx_http_proxy_create_main_conf(ngx_conf_t *cf);
    154160static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf);
    155161static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf,
     
    439445      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
    440446      ngx_http_file_cache_set_slot,
    441       0,
    442       0,
     447      NGX_HTTP_MAIN_CONF_OFFSET,
     448      offsetof(ngx_http_proxy_main_conf_t, caches),
    443449      &ngx_http_proxy_module },
    444450
     
    681687    NULL,                                  /* postconfiguration */
    682688
    683     NULL,                                  /* create main configuration */
     689    ngx_http_proxy_create_main_conf,       /* create main configuration */
    684690    NULL,                                  /* init main configuration */
    685691
     
    793799ngx_http_proxy_handler(ngx_http_request_t *r)
    794800{
    795     ngx_int_t                   rc;
    796     ngx_http_upstream_t        *u;
    797     ngx_http_proxy_ctx_t       *ctx;
    798     ngx_http_proxy_loc_conf_t  *plcf;
     801    ngx_int_t                    rc;
     802    ngx_http_upstream_t         *u;
     803    ngx_http_proxy_ctx_t        *ctx;
     804    ngx_http_proxy_loc_conf_t   *plcf;
     805#if (NGX_HTTP_CACHE)
     806    ngx_http_proxy_main_conf_t  *pmcf;
     807#endif
    799808
    800809    if (ngx_http_upstream_create(r) != NGX_OK) {
     
    831840
    832841#if (NGX_HTTP_CACHE)
     842    pmcf = ngx_http_get_module_main_conf(r, ngx_http_proxy_module);
     843
     844    u->caches = &pmcf->caches;
    833845    u->create_key = ngx_http_proxy_create_key;
    834846#endif
     847
    835848    u->create_request = ngx_http_proxy_create_request;
    836849    u->reinit_request = ngx_http_proxy_reinit_request;
     
    24912504
    24922505    return NGX_OK;
     2506}
     2507
     2508
     2509static void *
     2510ngx_http_proxy_create_main_conf(ngx_conf_t *cf)
     2511{
     2512    ngx_http_proxy_main_conf_t  *conf;
     2513
     2514    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_main_conf_t));
     2515    if (conf == NULL) {
     2516        return NULL;
     2517    }
     2518
     2519#if (NGX_HTTP_CACHE)
     2520    if (ngx_array_init(&conf->caches, cf->pool, 4,
     2521                       sizeof(ngx_http_file_cache_t *))
     2522        != NGX_OK)
     2523    {
     2524        return NULL;
     2525    }
     2526#endif
     2527
     2528    return conf;
    24932529}
    24942530
     
    28092845
    28102846        conf->upstream.cache_zone = prev->upstream.cache_zone;
     2847        conf->upstream.cache_value = prev->upstream.cache_value;
    28112848    }
    28122849
     
    38613898    ngx_http_proxy_loc_conf_t *plcf = conf;
    38623899
    3863     ngx_str_t  *value;
     3900    ngx_str_t                         *value;
     3901    ngx_http_complex_value_t           cv;
     3902    ngx_http_compile_complex_value_t   ccv;
    38643903
    38653904    value = cf->args->elts;
     
    38793918
    38803919    plcf->upstream.cache = 1;
     3920
     3921    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
     3922
     3923    ccv.cf = cf;
     3924    ccv.value = &value[1];
     3925    ccv.complex_value = &cv;
     3926
     3927    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
     3928        return NGX_CONF_ERROR;
     3929    }
     3930
     3931    if (cv.lengths != NULL) {
     3932
     3933        plcf->upstream.cache_value = ngx_palloc(cf->pool,
     3934                                             sizeof(ngx_http_complex_value_t));
     3935        if (plcf->upstream.cache_value == NULL) {
     3936            return NGX_CONF_ERROR;
     3937        }
     3938
     3939        *plcf->upstream.cache_value = cv;
     3940
     3941        return NGX_CONF_OK;
     3942    }
    38813943
    38823944    plcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,
  • src/http/modules/ngx_http_scgi_module.c

    r5949 r5951  
    1010#include <ngx_core.h>
    1111#include <ngx_http.h>
     12
     13
     14typedef struct {
     15    ngx_array_t                caches;  /* ngx_http_file_cache_t * */
     16} ngx_http_scgi_main_conf_t;
    1217
    1318
     
    4853static void ngx_http_scgi_finalize_request(ngx_http_request_t *r, ngx_int_t rc);
    4954
     55static void *ngx_http_scgi_create_main_conf(ngx_conf_t *cf);
    5056static void *ngx_http_scgi_create_loc_conf(ngx_conf_t *cf);
    5157static char *ngx_http_scgi_merge_loc_conf(ngx_conf_t *cf, void *parent,
     
    225231      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
    226232      ngx_http_file_cache_set_slot,
    227       0,
    228       0,
     233      NGX_HTTP_MAIN_CONF_OFFSET,
     234      offsetof(ngx_http_scgi_main_conf_t, caches),
    229235      &ngx_http_scgi_module },
    230236
     
    379385    NULL,                                  /* postconfiguration */
    380386
    381     NULL,                                  /* create main configuration */
     387    ngx_http_scgi_create_main_conf,        /* create main configuration */
    382388    NULL,                                  /* init main configuration */
    383389
     
    441447ngx_http_scgi_handler(ngx_http_request_t *r)
    442448{
    443     ngx_int_t                  rc;
    444     ngx_http_status_t         *status;
    445     ngx_http_upstream_t       *u;
    446     ngx_http_scgi_loc_conf_t  *scf;
     449    ngx_int_t                   rc;
     450    ngx_http_status_t          *status;
     451    ngx_http_upstream_t        *u;
     452    ngx_http_scgi_loc_conf_t   *scf;
     453#if (NGX_HTTP_CACHE)
     454    ngx_http_scgi_main_conf_t  *smcf;
     455#endif
    447456
    448457    if (ngx_http_upstream_create(r) != NGX_OK) {
     
    473482
    474483#if (NGX_HTTP_CACHE)
     484    smcf = ngx_http_get_module_main_conf(r, ngx_http_scgi_module);
     485
     486    u->caches = &smcf->caches;
    475487    u->create_key = ngx_http_scgi_create_key;
    476488#endif
     489
    477490    u->create_request = ngx_http_scgi_create_request;
    478491    u->reinit_request = ngx_http_scgi_reinit_request;
     
    11141127
    11151128static void *
     1129ngx_http_scgi_create_main_conf(ngx_conf_t *cf)
     1130{
     1131    ngx_http_scgi_main_conf_t  *conf;
     1132
     1133    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_scgi_main_conf_t));
     1134    if (conf == NULL) {
     1135        return NULL;
     1136    }
     1137
     1138#if (NGX_HTTP_CACHE)
     1139    if (ngx_array_init(&conf->caches, cf->pool, 4,
     1140                       sizeof(ngx_http_file_cache_t *))
     1141        != NGX_OK)
     1142    {
     1143        return NULL;
     1144    }
     1145#endif
     1146
     1147    return conf;
     1148}
     1149
     1150
     1151static void *
    11161152ngx_http_scgi_create_loc_conf(ngx_conf_t *cf)
    11171153{
     
    13701406
    13711407        conf->upstream.cache_zone = prev->upstream.cache_zone;
     1408        conf->upstream.cache_value = prev->upstream.cache_value;
    13721409    }
    13731410
     
    18261863    ngx_http_scgi_loc_conf_t *scf = conf;
    18271864
    1828     ngx_str_t  *value;
     1865    ngx_str_t                         *value;
     1866    ngx_http_complex_value_t           cv;
     1867    ngx_http_compile_complex_value_t   ccv;
    18291868
    18301869    value = cf->args->elts;
     
    18441883
    18451884    scf->upstream.cache = 1;
     1885
     1886    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
     1887
     1888    ccv.cf = cf;
     1889    ccv.value = &value[1];
     1890    ccv.complex_value = &cv;
     1891
     1892    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
     1893        return NGX_CONF_ERROR;
     1894    }
     1895
     1896    if (cv.lengths != NULL) {
     1897
     1898        scf->upstream.cache_value = ngx_palloc(cf->pool,
     1899                                             sizeof(ngx_http_complex_value_t));
     1900        if (scf->upstream.cache_value == NULL) {
     1901            return NGX_CONF_ERROR;
     1902        }
     1903
     1904        *scf->upstream.cache_value = cv;
     1905
     1906        return NGX_CONF_OK;
     1907    }
    18461908
    18471909    scf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,
  • src/http/modules/ngx_http_uwsgi_module.c

    r5949 r5951  
    1111#include <ngx_core.h>
    1212#include <ngx_http.h>
     13
     14
     15typedef struct {
     16    ngx_array_t                caches;  /* ngx_http_file_cache_t * */
     17} ngx_http_uwsgi_main_conf_t;
    1318
    1419
     
    6772    ngx_int_t rc);
    6873
     74static void *ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf);
    6975static void *ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf);
    7076static char *ngx_http_uwsgi_merge_loc_conf(ngx_conf_t *cf, void *parent,
     
    285291      NGX_HTTP_MAIN_CONF|NGX_CONF_2MORE,
    286292      ngx_http_file_cache_set_slot,
    287       0,
    288       0,
     293      NGX_HTTP_MAIN_CONF_OFFSET,
     294      offsetof(ngx_http_uwsgi_main_conf_t, caches),
    289295      &ngx_http_uwsgi_module },
    290296
     
    534540    NULL,                                  /* postconfiguration */
    535541
    536     NULL,                                  /* create main configuration */
     542    ngx_http_uwsgi_create_main_conf,       /* create main configuration */
    537543    NULL,                                  /* init main configuration */
    538544
     
    595601ngx_http_uwsgi_handler(ngx_http_request_t *r)
    596602{
    597     ngx_int_t                   rc;
    598     ngx_http_status_t          *status;
    599     ngx_http_upstream_t        *u;
    600     ngx_http_uwsgi_loc_conf_t  *uwcf;
     603    ngx_int_t                    rc;
     604    ngx_http_status_t           *status;
     605    ngx_http_upstream_t         *u;
     606    ngx_http_uwsgi_loc_conf_t   *uwcf;
     607#if (NGX_HTTP_CACHE)
     608    ngx_http_uwsgi_main_conf_t  *uwmcf;
     609#endif
    601610
    602611    if (ngx_http_upstream_create(r) != NGX_OK) {
     
    641650
    642651#if (NGX_HTTP_CACHE)
     652    uwmcf = ngx_http_get_module_main_conf(r, ngx_http_uwsgi_module);
     653
     654    u->caches = &uwmcf->caches;
    643655    u->create_key = ngx_http_uwsgi_create_key;
    644656#endif
     657
    645658    u->create_request = ngx_http_uwsgi_create_request;
    646659    u->reinit_request = ngx_http_uwsgi_reinit_request;
     
    13171330
    13181331static void *
     1332ngx_http_uwsgi_create_main_conf(ngx_conf_t *cf)
     1333{
     1334    ngx_http_uwsgi_main_conf_t  *conf;
     1335
     1336    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_uwsgi_main_conf_t));
     1337    if (conf == NULL) {
     1338        return NULL;
     1339    }
     1340
     1341#if (NGX_HTTP_CACHE)
     1342    if (ngx_array_init(&conf->caches, cf->pool, 4,
     1343                       sizeof(ngx_http_file_cache_t *))
     1344        != NGX_OK)
     1345    {
     1346        return NULL;
     1347    }
     1348#endif
     1349
     1350    return conf;
     1351}
     1352
     1353
     1354static void *
    13191355ngx_http_uwsgi_create_loc_conf(ngx_conf_t *cf)
    13201356{
     
    15841620
    15851621        conf->upstream.cache_zone = prev->upstream.cache_zone;
     1622        conf->upstream.cache_value = prev->upstream.cache_value;
    15861623    }
    15871624
     
    21152152    ngx_http_uwsgi_loc_conf_t *uwcf = conf;
    21162153
    2117     ngx_str_t  *value;
     2154    ngx_str_t                         *value;
     2155    ngx_http_complex_value_t           cv;
     2156    ngx_http_compile_complex_value_t   ccv;
    21182157
    21192158    value = cf->args->elts;
     
    21332172
    21342173    uwcf->upstream.cache = 1;
     2174
     2175    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
     2176
     2177    ccv.cf = cf;
     2178    ccv.value = &value[1];
     2179    ccv.complex_value = &cv;
     2180
     2181    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
     2182        return NGX_CONF_ERROR;
     2183    }
     2184
     2185    if (cv.lengths != NULL) {
     2186
     2187        uwcf->upstream.cache_value = ngx_palloc(cf->pool,
     2188                                             sizeof(ngx_http_complex_value_t));
     2189        if (uwcf->upstream.cache_value == NULL) {
     2190            return NGX_CONF_ERROR;
     2191        }
     2192
     2193        *uwcf->upstream.cache_value = cv;
     2194
     2195        return NGX_CONF_OK;
     2196    }
    21352197
    21362198    uwcf->upstream.cache_zone = ngx_shared_memory_add(cf, &value[1], 0,
  • src/http/ngx_http_file_cache.c

    r5935 r5951  
    20332033ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
    20342034{
     2035    char  *confp = conf;
     2036
    20352037    off_t                   max_size;
    20362038    u_char                 *last, *p;
     
    20412043    ngx_msec_t              loader_sleep, loader_threshold;
    20422044    ngx_uint_t              i, n;
    2043     ngx_http_file_cache_t  *cache;
     2045    ngx_array_t            *caches;
     2046    ngx_http_file_cache_t  *cache, **ce;
    20442047
    20452048    cache = ngx_pcalloc(cf->pool, sizeof(ngx_http_file_cache_t));
     
    22532256    cache->max_size = max_size;
    22542257
     2258    caches = (ngx_array_t *) (confp + cmd->offset);
     2259
     2260    ce = ngx_array_push(caches);
     2261    if (ce == NULL) {
     2262        return NGX_CONF_ERROR;
     2263    }
     2264
     2265    *ce = cache;
     2266
    22552267    return NGX_CONF_OK;
    22562268}
  • src/http/ngx_http_upstream.c

    r5950 r5951  
    1414static ngx_int_t ngx_http_upstream_cache(ngx_http_request_t *r,
    1515    ngx_http_upstream_t *u);
     16static ngx_int_t ngx_http_upstream_cache_get(ngx_http_request_t *r,
     17    ngx_http_upstream_t *u, ngx_http_file_cache_t **cache);
    1618static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,
    1719    ngx_http_upstream_t *u);
     
    724726ngx_http_upstream_cache(ngx_http_request_t *r, ngx_http_upstream_t *u)
    725727{
    726     ngx_int_t          rc;
    727     ngx_http_cache_t  *c;
     728    ngx_int_t               rc;
     729    ngx_http_cache_t       *c;
     730    ngx_http_file_cache_t  *cache;
    728731
    729732    c = r->cache;
     
    733736        if (!(r->method & u->conf->cache_methods)) {
    734737            return NGX_DECLINED;
     738        }
     739
     740        rc = ngx_http_upstream_cache_get(r, u, &cache);
     741
     742        if (rc != NGX_OK) {
     743            return rc;
    735744        }
    736745
     
    768777        c->body_start = u->conf->buffer_size;
    769778        c->min_uses = u->conf->cache_min_uses;
    770         c->file_cache = u->conf->cache_zone->data;
     779        c->file_cache = cache;
    771780
    772781        switch (ngx_http_test_predicates(r, u->conf->cache_bypass)) {
     
    871880
    872881    return NGX_DECLINED;
     882}
     883
     884
     885static ngx_int_t
     886ngx_http_upstream_cache_get(ngx_http_request_t *r, ngx_http_upstream_t *u,
     887    ngx_http_file_cache_t **cache)
     888{
     889    ngx_str_t               *name, val;
     890    ngx_uint_t               i;
     891    ngx_http_file_cache_t  **caches;
     892
     893    if (u->conf->cache_zone) {
     894        *cache = u->conf->cache_zone->data;
     895        return NGX_OK;
     896    }
     897
     898    if (ngx_http_complex_value(r, u->conf->cache_value, &val) != NGX_OK) {
     899        return NGX_ERROR;
     900    }
     901
     902    if (val.len == 0
     903        || (val.len == 3 && ngx_strncmp(val.data, "off", 3) == 0))
     904    {
     905        return NGX_DECLINED;
     906    }
     907
     908    caches = u->caches->elts;
     909
     910    for (i = 0; i < u->caches->nelts; i++) {
     911        name = &caches[i]->shm_zone->shm.name;
     912
     913        if (name->len == val.len
     914            && ngx_strncmp(name->data, val.data, val.len) == 0)
     915        {
     916            *cache = caches[i];
     917            return NGX_OK;
     918        }
     919    }
     920
     921    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
     922                  "cache \"%V\" not found", &val);
     923
     924    return NGX_ERROR;
    873925}
    874926
  • src/http/ngx_http_upstream.h

    r5949 r5951  
    177177#if (NGX_HTTP_CACHE)
    178178    ngx_shm_zone_t                  *cache_zone;
     179    ngx_http_complex_value_t        *cache_value;
    179180
    180181    ngx_uint_t                       cache_min_uses;
     
    301302
    302303    ngx_http_upstream_conf_t        *conf;
     304#if (NGX_HTTP_CACHE)
     305    ngx_array_t                     *caches;
     306#endif
    303307
    304308    ngx_http_upstream_headers_in_t   headers_in;
Note: See TracChangeset for help on using the changeset viewer.