Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_limit_zone_module.c @ 3240:39f82eb3d0f2 stable-0.7
merge r2973, r2974, r3184, r3192, r3186, r3187:
various limit_req and limit_conn fixes:
*) fix client write event handling in ngx_http_limit_req_module
*) make limit_req to conform to the leaky bucket algorithm
*) limit_req_log_level
*) limit_conn_log_level
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 26 Oct 2009 16:30:34 +0000 |
parents | 2efa8d2fcde1 |
children | 3544987fef85 97995d63aa36 |
comparison
equal
deleted
inserted
replaced
3239:8254055b6693 | 3240:39f82eb3d0f2 |
---|---|
31 | 31 |
32 | 32 |
33 typedef struct { | 33 typedef struct { |
34 ngx_shm_zone_t *shm_zone; | 34 ngx_shm_zone_t *shm_zone; |
35 ngx_uint_t conn; | 35 ngx_uint_t conn; |
36 ngx_uint_t log_level; | |
36 } ngx_http_limit_zone_conf_t; | 37 } ngx_http_limit_zone_conf_t; |
37 | 38 |
38 | 39 |
39 static void ngx_http_limit_zone_cleanup(void *data); | 40 static void ngx_http_limit_zone_cleanup(void *data); |
40 | 41 |
46 static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, | 47 static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, |
47 void *conf); | 48 void *conf); |
48 static ngx_int_t ngx_http_limit_zone_init(ngx_conf_t *cf); | 49 static ngx_int_t ngx_http_limit_zone_init(ngx_conf_t *cf); |
49 | 50 |
50 | 51 |
52 static ngx_conf_enum_t ngx_http_limit_conn_log_levels[] = { | |
53 { ngx_string("info"), NGX_LOG_INFO }, | |
54 { ngx_string("notice"), NGX_LOG_NOTICE }, | |
55 { ngx_string("warn"), NGX_LOG_WARN }, | |
56 { ngx_string("error"), NGX_LOG_ERR }, | |
57 { ngx_null_string, 0 } | |
58 }; | |
59 | |
60 | |
51 static ngx_command_t ngx_http_limit_zone_commands[] = { | 61 static ngx_command_t ngx_http_limit_zone_commands[] = { |
52 | 62 |
53 { ngx_string("limit_zone"), | 63 { ngx_string("limit_zone"), |
54 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3, | 64 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE3, |
55 ngx_http_limit_zone, | 65 ngx_http_limit_zone, |
61 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, | 71 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2, |
62 ngx_http_limit_conn, | 72 ngx_http_limit_conn, |
63 NGX_HTTP_LOC_CONF_OFFSET, | 73 NGX_HTTP_LOC_CONF_OFFSET, |
64 0, | 74 0, |
65 NULL }, | 75 NULL }, |
76 | |
77 { ngx_string("limit_conn_log_level"), | |
78 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, | |
79 ngx_conf_set_enum_slot, | |
80 NGX_HTTP_LOC_CONF_OFFSET, | |
81 offsetof(ngx_http_limit_zone_conf_t, log_level), | |
82 &ngx_http_limit_conn_log_levels }, | |
66 | 83 |
67 ngx_null_command | 84 ngx_null_command |
68 }; | 85 }; |
69 | 86 |
70 | 87 |
187 goto done; | 204 goto done; |
188 } | 205 } |
189 | 206 |
190 ngx_shmtx_unlock(&shpool->mutex); | 207 ngx_shmtx_unlock(&shpool->mutex); |
191 | 208 |
192 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, | 209 ngx_log_error(lzcf->log_level, r->connection->log, 0, |
193 "limiting connections by zone \"%V\"", | 210 "limiting connections by zone \"%V\"", |
194 &lzcf->shm_zone->shm.name); | 211 &lzcf->shm_zone->shm.name); |
195 | 212 |
196 return NGX_HTTP_SERVICE_UNAVAILABLE; | 213 return NGX_HTTP_SERVICE_UNAVAILABLE; |
197 } | 214 } |
389 * | 406 * |
390 * conf->shm_zone = NULL; | 407 * conf->shm_zone = NULL; |
391 * conf->conn = 0; | 408 * conf->conn = 0; |
392 */ | 409 */ |
393 | 410 |
411 conf->log_level = NGX_CONF_UNSET_UINT; | |
412 | |
394 return conf; | 413 return conf; |
395 } | 414 } |
396 | 415 |
397 | 416 |
398 static char * | 417 static char * |
402 ngx_http_limit_zone_conf_t *conf = child; | 421 ngx_http_limit_zone_conf_t *conf = child; |
403 | 422 |
404 if (conf->shm_zone == NULL) { | 423 if (conf->shm_zone == NULL) { |
405 *conf = *prev; | 424 *conf = *prev; |
406 } | 425 } |
426 | |
427 ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR); | |
407 | 428 |
408 return NGX_CONF_OK; | 429 return NGX_CONF_OK; |
409 } | 430 } |
410 | 431 |
411 | 432 |