Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
$upstream_cache_status
Патч. Значения:
MISS
EXPIRED expired, запрос ушёл на бэкенд
UPDATING expired, использовался старый ответ из-за
proxy/fastcgi_cache_use_stale updating
STALE expired, использовался старый ответ из-за
proxy/fastcgi_cache_use_stale
HIT
--
Игорь Сысоев
http://sysoev.ru
Index: src/http/ngx_http_upstream.c
===================================================================
--- src/http/ngx_http_upstream.c (revision 2252)
+++ src/http/ngx_http_upstream.c (working copy)
@@ -14,6 +14,8 @@
ngx_http_upstream_t *u);
static ngx_int_t ngx_http_upstream_cache_send(ngx_http_request_t *r,
ngx_http_upstream_t *u);
+static ngx_int_t ngx_http_upstream_cache_status(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data);
#endif
static void ngx_http_upstream_resolve_handler(ngx_resolver_ctx_t *ctx);
@@ -316,6 +318,10 @@
ngx_http_upstream_response_length_variable, 0,
NGX_HTTP_VAR_NOHASH|NGX_HTTP_VAR_NOCACHEABLE, 0 },
+ { ngx_string("upstream_cache_status"), NULL,
+ ngx_http_upstream_cache_status, 0,
+ NGX_HTTP_VAR_NOHASH|NGX_HTTP_VAR_NOCACHEABLE, 0 },
+
{ ngx_null_string, NULL, NULL, 0, 0, 0 }
};
@@ -575,40 +581,57 @@
c->body_start = u->conf->buffer_size;
c->file_cache = u->conf->cache->data;
+ u->cache_status = NGX_HTTP_CACHE_MISS;
+
rc = ngx_http_file_cache_open(r);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http upstream cache: %i", rc);
- if (rc == NGX_HTTP_CACHE_UPDATING) {
+ switch (rc) {
+
+ case NGX_HTTP_CACHE_UPDATING:
+
if (u->conf->cache_use_stale & NGX_HTTP_UPSTREAM_FT_UPDATING) {
+ u->cache_status = rc;
rc = NGX_OK;
} else {
rc = NGX_HTTP_CACHE_STALE;
}
+
+ break;
+
+ case NGX_OK:
+ u->cache_status = NGX_HTTP_CACHE_HIT;
}
- if (rc == NGX_OK) {
+ switch (rc) {
+ case NGX_OK:
+
rc = ngx_http_upstream_cache_send(r, u);
if (rc != NGX_HTTP_UPSTREAM_INVALID_HEADER) {
return rc;
}
- } else if (rc == NGX_ERROR) {
+ break;
+ case NGX_ERROR:
+
return NGX_ERROR;
- } else if (rc == NGX_HTTP_CACHE_STALE) {
+ case NGX_HTTP_CACHE_STALE:
c->valid_sec = 0;
- u->stale_cache = 1;
u->buffer.start = NULL;
+ u->cache_status = NGX_HTTP_CACHE_EXPIRED;
- } else if (rc == NGX_DECLINED) {
+ break;
+ case NGX_DECLINED:
+
if ((size_t) (u->buffer.end - u->buffer.start) < u->conf->buffer_size)
{
u->buffer.start = NULL;
@@ -617,14 +640,20 @@
u->buffer.last = u->buffer.pos;
}
- } else if (rc == NGX_AGAIN) {
+ break;
+ case NGX_AGAIN:
+
u->cacheable = 0;
- } else {
+ break;
+ default:
+
/* cached NGX_HTTP_BAD_GATEWAY, NGX_HTTP_GATEWAY_TIME_OUT, etc. */
+ u->cache_status = NGX_HTTP_CACHE_HIT;
+
return rc;
}
@@ -640,6 +669,7 @@
ngx_int_t rc;
ngx_http_cache_t *c;
+ r->cached = 1;
c = r->cache;
/* TODO: cache stack */
@@ -1521,12 +1551,15 @@
#if (NGX_HTTP_CACHE)
- if (u->stale_cache && (u->conf->cache_use_stale & un->mask)) {
+ if (u->cache_status == NGX_HTTP_CACHE_EXPIRED
+ && (u->conf->cache_use_stale & un->mask))
+ {
ngx_int_t rc;
rc = u->reinit_request(r);
if (rc == NGX_OK) {
+ u->cache_status = NGX_HTTP_CACHE_STALE;
rc = ngx_http_upstream_cache_send(r, u);
}
@@ -2680,12 +2713,15 @@
#if (NGX_HTTP_CACHE)
- if (u->stale_cache && (u->conf->cache_use_stale & ft_type)) {
+ if (u->cache_status == NGX_HTTP_CACHE_EXPIRED
+ && (u->conf->cache_use_stale & ft_type))
+ {
ngx_int_t rc;
rc = u->reinit_request(r);
if (rc == NGX_OK) {
+ u->cache_status = NGX_HTTP_CACHE_STALE;
rc = ngx_http_upstream_cache_send(r, u);
}
@@ -3262,7 +3298,7 @@
#if (NGX_HTTP_CACHE)
- if (r->cached || r->upstream->cacheable) {
+ if (r->upstream->cacheable) {
r->headers_out.last_modified = ho;
r->headers_out.last_modified_time = ngx_http_parse_time(h->value.data,
h->value.len);
@@ -3713,6 +3749,33 @@
}
+#if (NGX_HTTP_CACHE)
+
+ngx_int_t
+ngx_http_upstream_cache_status(ngx_http_request_t *r,
+ ngx_http_variable_value_t *v, uintptr_t data)
+{
+ ngx_uint_t n;
+
+ if (r->upstream == NULL || r->upstream->cache_status == 0) {
+ v->not_found = 1;
+ return NGX_OK;
+ }
+
+ n = r->upstream->cache_status - 1;
+
+ v->valid = 1;
+ v->no_cacheable = 0;
+ v->not_found = 0;
+ v->len = ngx_http_cache_status[n].len;
+ v->data = ngx_http_cache_status[n].data;
+
+ return NGX_OK;
+}
+
+#endif
+
+
static char *
ngx_http_upstream(ngx_conf_t *cf, ngx_command_t *cmd, void *dummy)
{
Index: src/http/ngx_http_file_cache.c
===================================================================
--- src/http/ngx_http_file_cache.c (revision 2252)
+++ src/http/ngx_http_file_cache.c (working copy)
@@ -35,6 +35,15 @@
ngx_str_t *path);
+ngx_str_t ngx_http_cache_status[] = {
+ ngx_string("MISS"),
+ ngx_string("EXPIRED"),
+ ngx_string("STALE"),
+ ngx_string("UPDATING"),
+ ngx_string("HIT")
+};
+
+
static u_char ngx_http_file_cache_key[] = { LF, 'K', 'E', 'Y', ':', ' ' };
Index: src/http/ngx_http_upstream.h
===================================================================
--- src/http/ngx_http_upstream.h (revision 2252)
+++ src/http/ngx_http_upstream.h (working copy)
@@ -298,7 +298,7 @@
unsigned accel:1;
unsigned ssl:1;
#if (NGX_HTTP_CACHE)
- unsigned stale_cache:1;
+ unsigned cache_status:3;
#endif
unsigned buffering:1;
Index: src/http/ngx_http_cache.h
===================================================================
--- src/http/ngx_http_cache.h (revision 2252)
+++ src/http/ngx_http_cache.h (working copy)
@@ -13,8 +13,11 @@
#include <ngx_http.h>
-#define NGX_HTTP_CACHE_STALE 1
-#define NGX_HTTP_CACHE_UPDATING 2
+#define NGX_HTTP_CACHE_MISS 1
+#define NGX_HTTP_CACHE_EXPIRED 2
+#define NGX_HTTP_CACHE_STALE 3
+#define NGX_HTTP_CACHE_UPDATING 4
+#define NGX_HTTP_CACHE_HIT 5
#define NGX_HTTP_CACHE_KEY_LEN 16
@@ -124,11 +127,12 @@
void ngx_http_file_cache_free(ngx_http_request_t *r, ngx_temp_file_t *tf);
time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status);
-
char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
+extern ngx_str_t ngx_http_cache_status[];
+
#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */
|