annotate src/http/modules/ngx_http_limit_conn_module.c @ 7653:8409f9df6219

SSL: client certificate validation with OCSP (ticket #1534). OCSP validation for client certificates is enabled by the "ssl_ocsp" directive. OCSP responder can be optionally specified by "ssl_ocsp_responder". When session is reused, peer chain is not available for validation. If the verified chain contains certificates from the peer chain not available at the server, validation will fail.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 22 May 2020 17:30:12 +0300
parents b45f052483b8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
1
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
2 /*
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
3 * Copyright (C) Igor Sysoev
4412
d620f497c50f Copyright updated.
Maxim Konovalov <maxim@nginx.com>
parents: 4380
diff changeset
4 * Copyright (C) Nginx, Inc.
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
5 */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
6
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
7
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
8 #include <ngx_config.h>
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
9 #include <ngx_core.h>
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
10 #include <ngx_http.h>
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
11
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
12
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
13 #define NGX_HTTP_LIMIT_CONN_PASSED 1
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
14 #define NGX_HTTP_LIMIT_CONN_REJECTED 2
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
15 #define NGX_HTTP_LIMIT_CONN_REJECTED_DRY_RUN 3
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
16
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
17
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
18 typedef struct {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
19 u_char color;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
20 u_char len;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
21 u_short conn;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
22 u_char data[1];
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
23 } ngx_http_limit_conn_node_t;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
24
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
25
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
26 typedef struct {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
27 ngx_shm_zone_t *shm_zone;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
28 ngx_rbtree_node_t *node;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
29 } ngx_http_limit_conn_cleanup_t;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
30
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
31
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
32 typedef struct {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
33 ngx_rbtree_t rbtree;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
34 ngx_rbtree_node_t sentinel;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
35 } ngx_http_limit_conn_shctx_t;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
36
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
37
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
38 typedef struct {
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
39 ngx_http_limit_conn_shctx_t *sh;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
40 ngx_slab_pool_t *shpool;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
41 ngx_http_complex_value_t key;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
42 } ngx_http_limit_conn_ctx_t;
987
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
43
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
44
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
45 typedef struct {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
46 ngx_shm_zone_t *shm_zone;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
47 ngx_uint_t conn;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
48 } ngx_http_limit_conn_limit_t;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
49
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
50
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
51 typedef struct {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
52 ngx_array_t limits;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
53 ngx_uint_t log_level;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
54 ngx_uint_t status_code;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
55 ngx_flag_t dry_run;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
56 } ngx_http_limit_conn_conf_t;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
57
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
58
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
59 static ngx_rbtree_node_t *ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree,
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
60 ngx_str_t *key, uint32_t hash);
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
61 static void ngx_http_limit_conn_cleanup(void *data);
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
62 static ngx_inline void ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
63
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
64 static ngx_int_t ngx_http_limit_conn_status_variable(ngx_http_request_t *r,
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
65 ngx_http_variable_value_t *v, uintptr_t data);
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
66 static void *ngx_http_limit_conn_create_conf(ngx_conf_t *cf);
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
67 static char *ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent,
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
68 void *child);
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
69 static char *ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
70 void *conf);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
71 static char *ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd,
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
72 void *conf);
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
73 static ngx_int_t ngx_http_limit_conn_add_variables(ngx_conf_t *cf);
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
74 static ngx_int_t ngx_http_limit_conn_init(ngx_conf_t *cf);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
75
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
76
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
77 static ngx_conf_enum_t ngx_http_limit_conn_log_levels[] = {
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
78 { ngx_string("info"), NGX_LOG_INFO },
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
79 { ngx_string("notice"), NGX_LOG_NOTICE },
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
80 { ngx_string("warn"), NGX_LOG_WARN },
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
81 { ngx_string("error"), NGX_LOG_ERR },
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
82 { ngx_null_string, 0 }
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
83 };
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
84
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
85
5117
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
86 static ngx_conf_num_bounds_t ngx_http_limit_conn_status_bounds = {
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
87 ngx_conf_check_num_bounds, 400, 599
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
88 };
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
89
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
90
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
91 static ngx_command_t ngx_http_limit_conn_commands[] = {
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
92
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
93 { ngx_string("limit_conn_zone"),
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
94 NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE2,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
95 ngx_http_limit_conn_zone,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
96 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
97 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
98 NULL },
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
99
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
100 { ngx_string("limit_conn"),
987
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
101 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
102 ngx_http_limit_conn,
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
103 NGX_HTTP_LOC_CONF_OFFSET,
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
104 0,
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
105 NULL },
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
106
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
107 { ngx_string("limit_conn_log_level"),
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
108 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
109 ngx_conf_set_enum_slot,
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
110 NGX_HTTP_LOC_CONF_OFFSET,
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
111 offsetof(ngx_http_limit_conn_conf_t, log_level),
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
112 &ngx_http_limit_conn_log_levels },
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
113
5117
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
114 { ngx_string("limit_conn_status"),
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
115 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
116 ngx_conf_set_num_slot,
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
117 NGX_HTTP_LOC_CONF_OFFSET,
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
118 offsetof(ngx_http_limit_conn_conf_t, status_code),
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
119 &ngx_http_limit_conn_status_bounds },
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
120
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
121 { ngx_string("limit_conn_dry_run"),
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
122 NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
123 ngx_conf_set_flag_slot,
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
124 NGX_HTTP_LOC_CONF_OFFSET,
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
125 offsetof(ngx_http_limit_conn_conf_t, dry_run),
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
126 NULL },
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
127
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
128 ngx_null_command
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
129 };
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
130
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
131
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
132 static ngx_http_module_t ngx_http_limit_conn_module_ctx = {
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
133 ngx_http_limit_conn_add_variables, /* preconfiguration */
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
134 ngx_http_limit_conn_init, /* postconfiguration */
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
135
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
136 NULL, /* create main configuration */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
137 NULL, /* init main configuration */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
138
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
139 NULL, /* create server configuration */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
140 NULL, /* merge server configuration */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
141
4499
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4497
diff changeset
142 ngx_http_limit_conn_create_conf, /* create location configuration */
778ef9c3fd2d Fixed spelling in single-line comments.
Ruslan Ermilov <ru@nginx.com>
parents: 4497
diff changeset
143 ngx_http_limit_conn_merge_conf /* merge location configuration */
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
144 };
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
145
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
146
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
147 ngx_module_t ngx_http_limit_conn_module = {
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
148 NGX_MODULE_V1,
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
149 &ngx_http_limit_conn_module_ctx, /* module context */
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
150 ngx_http_limit_conn_commands, /* module directives */
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
151 NGX_HTTP_MODULE, /* module type */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
152 NULL, /* init master */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
153 NULL, /* init module */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
154 NULL, /* init process */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
155 NULL, /* init thread */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
156 NULL, /* exit thread */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
157 NULL, /* exit process */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
158 NULL, /* exit master */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
159 NGX_MODULE_V1_PADDING
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
160 };
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
161
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
162
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
163 static ngx_http_variable_t ngx_http_limit_conn_vars[] = {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
164
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
165 { ngx_string("limit_conn_status"), NULL,
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
166 ngx_http_limit_conn_status_variable, 0, NGX_HTTP_VAR_NOCACHEABLE, 0 },
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
167
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
168 ngx_http_null_variable
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
169 };
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
170
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
171
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
172 static ngx_str_t ngx_http_limit_conn_status[] = {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
173 ngx_string("PASSED"),
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
174 ngx_string("REJECTED"),
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
175 ngx_string("REJECTED_DRY_RUN")
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
176 };
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
177
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
178
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
179 static ngx_int_t
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
180 ngx_http_limit_conn_handler(ngx_http_request_t *r)
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
181 {
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
182 size_t n;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
183 uint32_t hash;
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
184 ngx_str_t key;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
185 ngx_uint_t i;
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
186 ngx_rbtree_node_t *node;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
187 ngx_pool_cleanup_t *cln;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
188 ngx_http_limit_conn_ctx_t *ctx;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
189 ngx_http_limit_conn_node_t *lc;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
190 ngx_http_limit_conn_conf_t *lccf;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
191 ngx_http_limit_conn_limit_t *limits;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
192 ngx_http_limit_conn_cleanup_t *lccln;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
193
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
194 if (r->main->limit_conn_status) {
984
dd128232e6ba count connection once per request
Igor Sysoev <igor@sysoev.ru>
parents: 981
diff changeset
195 return NGX_DECLINED;
dd128232e6ba count connection once per request
Igor Sysoev <igor@sysoev.ru>
parents: 981
diff changeset
196 }
dd128232e6ba count connection once per request
Igor Sysoev <igor@sysoev.ru>
parents: 981
diff changeset
197
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
198 lccf = ngx_http_get_module_loc_conf(r, ngx_http_limit_conn_module);
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
199 limits = lccf->limits.elts;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
200
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
201 for (i = 0; i < lccf->limits.nelts; i++) {
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
202 ctx = limits[i].shm_zone->data;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
203
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
204 if (ngx_http_complex_value(r, &ctx->key, &key) != NGX_OK) {
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
205 return NGX_HTTP_INTERNAL_SERVER_ERROR;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
206 }
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
207
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
208 if (key.len == 0) {
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
209 continue;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
210 }
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
211
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
212 if (key.len > 255) {
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
213 ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
214 "the value of the \"%V\" key "
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
215 "is more than 255 bytes: \"%V\"",
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
216 &ctx->key.value, &key);
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
217 continue;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
218 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
219
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
220 r->main->limit_conn_status = NGX_HTTP_LIMIT_CONN_PASSED;
4458
2d4ff8bd5649 Limit conn: returned to the old behavior of using the first actual limit on
Valentin Bartenev <vbart@nginx.com>
parents: 4412
diff changeset
221
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
222 hash = ngx_crc32_short(key.data, key.len);
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
223
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
224 ngx_shmtx_lock(&ctx->shpool->mutex);
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
225
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
226 node = ngx_http_limit_conn_lookup(&ctx->sh->rbtree, &key, hash);
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
227
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
228 if (node == NULL) {
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
229
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
230 n = offsetof(ngx_rbtree_node_t, color)
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
231 + offsetof(ngx_http_limit_conn_node_t, data)
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
232 + key.len;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
233
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
234 node = ngx_slab_alloc_locked(ctx->shpool, n);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
235
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
236 if (node == NULL) {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
237 ngx_shmtx_unlock(&ctx->shpool->mutex);
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
238 ngx_http_limit_conn_cleanup_all(r->pool);
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
239
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
240 if (lccf->dry_run) {
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
241 r->main->limit_conn_status =
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
242 NGX_HTTP_LIMIT_CONN_REJECTED_DRY_RUN;
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
243 return NGX_DECLINED;
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
244 }
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
245
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
246 r->main->limit_conn_status = NGX_HTTP_LIMIT_CONN_REJECTED;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
247
5117
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
248 return lccf->status_code;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
249 }
2373
f4603d71f532 log 503 error reason
Igor Sysoev <igor@sysoev.ru>
parents: 2372
diff changeset
250
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
251 lc = (ngx_http_limit_conn_node_t *) &node->color;
1012
11ffb8e4753f stop rbtree search early if equal hash was found
Igor Sysoev <igor@sysoev.ru>
parents: 1011
diff changeset
252
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
253 node->key = hash;
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
254 lc->len = (u_char) key.len;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
255 lc->conn = 1;
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
256 ngx_memcpy(lc->data, key.data, key.len);
1012
11ffb8e4753f stop rbtree search early if equal hash was found
Igor Sysoev <igor@sysoev.ru>
parents: 1011
diff changeset
257
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
258 ngx_rbtree_insert(&ctx->sh->rbtree, node);
1012
11ffb8e4753f stop rbtree search early if equal hash was found
Igor Sysoev <igor@sysoev.ru>
parents: 1011
diff changeset
259
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
260 } else {
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
261
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
262 lc = (ngx_http_limit_conn_node_t *) &node->color;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
263
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
264 if ((ngx_uint_t) lc->conn >= limits[i].conn) {
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
265
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
266 ngx_shmtx_unlock(&ctx->shpool->mutex);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
267
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
268 ngx_log_error(lccf->log_level, r->connection->log, 0,
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
269 "limiting connections%s by zone \"%V\"",
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
270 lccf->dry_run ? ", dry run," : "",
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
271 &limits[i].shm_zone->shm.name);
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
272
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
273 ngx_http_limit_conn_cleanup_all(r->pool);
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
274
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
275 if (lccf->dry_run) {
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
276 r->main->limit_conn_status =
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
277 NGX_HTTP_LIMIT_CONN_REJECTED_DRY_RUN;
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
278 return NGX_DECLINED;
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
279 }
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
280
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
281 r->main->limit_conn_status = NGX_HTTP_LIMIT_CONN_REJECTED;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
282
5117
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
283 return lccf->status_code;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
284 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
285
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
286 lc->conn++;
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
287 }
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
288
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
289 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5861
diff changeset
290 "limit conn: %08Xi %d", node->key, lc->conn);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
291
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
292 ngx_shmtx_unlock(&ctx->shpool->mutex);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
293
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
294 cln = ngx_pool_cleanup_add(r->pool,
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
295 sizeof(ngx_http_limit_conn_cleanup_t));
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
296 if (cln == NULL) {
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
297 return NGX_HTTP_INTERNAL_SERVER_ERROR;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
298 }
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
299
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
300 cln->handler = ngx_http_limit_conn_cleanup;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
301 lccln = cln->data;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
302
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
303 lccln->shm_zone = limits[i].shm_zone;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
304 lccln->node = node;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
305 }
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
306
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
307 return NGX_DECLINED;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
308 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
309
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
310
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
311 static void
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
312 ngx_http_limit_conn_rbtree_insert_value(ngx_rbtree_node_t *temp,
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
313 ngx_rbtree_node_t *node, ngx_rbtree_node_t *sentinel)
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
314 {
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
315 ngx_rbtree_node_t **p;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
316 ngx_http_limit_conn_node_t *lcn, *lcnt;
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
317
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
318 for ( ;; ) {
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
319
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
320 if (node->key < temp->key) {
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
321
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
322 p = &temp->left;
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
323
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
324 } else if (node->key > temp->key) {
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
325
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
326 p = &temp->right;
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
327
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
328 } else { /* node->key == temp->key */
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
329
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
330 lcn = (ngx_http_limit_conn_node_t *) &node->color;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
331 lcnt = (ngx_http_limit_conn_node_t *) &temp->color;
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
332
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
333 p = (ngx_memn2cmp(lcn->data, lcnt->data, lcn->len, lcnt->len) < 0)
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
334 ? &temp->left : &temp->right;
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
335 }
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
336
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
337 if (*p == sentinel) {
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
338 break;
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
339 }
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
340
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
341 temp = *p;
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
342 }
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
343
1743
4fc402c3ec73 optimize rbtree initialization and insert
Igor Sysoev <igor@sysoev.ru>
parents: 1406
diff changeset
344 *p = node;
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
345 node->parent = temp;
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
346 node->left = sentinel;
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
347 node->right = sentinel;
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
348 ngx_rbt_red(node);
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
349 }
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
350
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
351
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
352 static ngx_rbtree_node_t *
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
353 ngx_http_limit_conn_lookup(ngx_rbtree_t *rbtree, ngx_str_t *key, uint32_t hash)
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
354 {
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
355 ngx_int_t rc;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
356 ngx_rbtree_node_t *node, *sentinel;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
357 ngx_http_limit_conn_node_t *lcn;
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
358
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
359 node = rbtree->root;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
360 sentinel = rbtree->sentinel;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
361
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
362 while (node != sentinel) {
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
363
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
364 if (hash < node->key) {
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
365 node = node->left;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
366 continue;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
367 }
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
368
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
369 if (hash > node->key) {
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
370 node = node->right;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
371 continue;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
372 }
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
373
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
374 /* hash == node->key */
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
375
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4458
diff changeset
376 lcn = (ngx_http_limit_conn_node_t *) &node->color;
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
377
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
378 rc = ngx_memn2cmp(key->data, lcn->data, key->len, (size_t) lcn->len);
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
379
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4458
diff changeset
380 if (rc == 0) {
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4458
diff changeset
381 return node;
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4458
diff changeset
382 }
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
383
4497
95ab6658654a Fix of rbtree lookup on hash collisions.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4458
diff changeset
384 node = (rc < 0) ? node->left : node->right;
4270
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
385 }
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
386
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
387 return NULL;
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
388 }
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
389
3544987fef85 Limit zone: rbtree lookup moved to a separate function.
Valentin Bartenev <vbart@nginx.com>
parents: 3186
diff changeset
390
1026
38be15c1379a fix duplicate rbtree keys case
Igor Sysoev <igor@sysoev.ru>
parents: 1012
diff changeset
391 static void
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
392 ngx_http_limit_conn_cleanup(void *data)
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
393 {
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
394 ngx_http_limit_conn_cleanup_t *lccln = data;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
395
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
396 ngx_rbtree_node_t *node;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
397 ngx_http_limit_conn_ctx_t *ctx;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
398 ngx_http_limit_conn_node_t *lc;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
399
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
400 ctx = lccln->shm_zone->data;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
401 node = lccln->node;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
402 lc = (ngx_http_limit_conn_node_t *) &node->color;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
403
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
404 ngx_shmtx_lock(&ctx->shpool->mutex);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
405
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
406 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, lccln->shm_zone->shm.log, 0,
6480
f01ab2dbcfdc Fixed logging.
Sergey Kandaurov <pluknet@nginx.com>
parents: 5861
diff changeset
407 "limit conn cleanup: %08Xi %d", node->key, lc->conn);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
408
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
409 lc->conn--;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
410
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
411 if (lc->conn == 0) {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
412 ngx_rbtree_delete(&ctx->sh->rbtree, node);
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
413 ngx_slab_free_locked(ctx->shpool, node);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
414 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
415
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
416 ngx_shmtx_unlock(&ctx->shpool->mutex);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
417 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
418
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
419
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
420 static ngx_inline void
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
421 ngx_http_limit_conn_cleanup_all(ngx_pool_t *pool)
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
422 {
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
423 ngx_pool_cleanup_t *cln;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
424
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
425 cln = pool->cleanup;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
426
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
427 while (cln && cln->handler == ngx_http_limit_conn_cleanup) {
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
428 ngx_http_limit_conn_cleanup(cln->data);
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
429 cln = cln->next;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
430 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
431
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
432 pool->cleanup = cln;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
433 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
434
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
435
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
436 static ngx_int_t
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
437 ngx_http_limit_conn_init_zone(ngx_shm_zone_t *shm_zone, void *data)
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
438 {
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
439 ngx_http_limit_conn_ctx_t *octx = data;
993
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
440
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2373
diff changeset
441 size_t len;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
442 ngx_http_limit_conn_ctx_t *ctx;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
443
993
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
444 ctx = shm_zone->data;
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
445
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
446 if (octx) {
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
447 if (ctx->key.value.len != octx->key.value.len
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
448 || ngx_strncmp(ctx->key.value.data, octx->key.value.data,
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
449 ctx->key.value.len)
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
450 != 0)
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
451 {
993
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
452 ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
453 "limit_conn_zone \"%V\" uses the \"%V\" key "
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
454 "while previously it used the \"%V\" key",
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
455 &shm_zone->shm.name, &ctx->key.value,
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
456 &octx->key.value);
993
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
457 return NGX_ERROR;
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
458 }
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
459
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
460 ctx->sh = octx->sh;
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
461 ctx->shpool = octx->shpool;
993
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
462
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
463 return NGX_OK;
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
464 }
1b9a4d92173f pass the inherited shm_zone data
Igor Sysoev <igor@sysoev.ru>
parents: 987
diff changeset
465
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
466 ctx->shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
467
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
468 if (shm_zone->shm.exists) {
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
469 ctx->sh = ctx->shpool->data;
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
470
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
471 return NGX_OK;
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
472 }
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
473
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
474 ctx->sh = ngx_slab_alloc(ctx->shpool, sizeof(ngx_http_limit_conn_shctx_t));
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
475 if (ctx->sh == NULL) {
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
476 return NGX_ERROR;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
477 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
478
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
479 ctx->shpool->data = ctx->sh;
2720
b3b8c66bd520 support attaching to an existent Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2716
diff changeset
480
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
481 ngx_rbtree_init(&ctx->sh->rbtree, &ctx->sh->sentinel,
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
482 ngx_http_limit_conn_rbtree_insert_value);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
483
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
484 len = sizeof(" in limit_conn_zone \"\"") + shm_zone->shm.name.len;
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2373
diff changeset
485
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
486 ctx->shpool->log_ctx = ngx_slab_alloc(ctx->shpool, len);
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
487 if (ctx->shpool->log_ctx == NULL) {
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2373
diff changeset
488 return NGX_ERROR;
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2373
diff changeset
489 }
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2373
diff changeset
490
7596
b45f052483b8 Limit conn: added shared context.
Roman Arutyunyan <arut@nginx.com>
parents: 7595
diff changeset
491 ngx_sprintf(ctx->shpool->log_ctx, " in limit_conn_zone \"%V\"%Z",
2716
d5896f6608e8 move zone name from ngx_shm_zone_t to ngx_shm_t to use Win32 shared memory
Igor Sysoev <igor@sysoev.ru>
parents: 2612
diff changeset
492 &shm_zone->shm.name);
2611
2bce3f6416c6 improve ngx_slab_alloc() error logging
Igor Sysoev <igor@sysoev.ru>
parents: 2373
diff changeset
493
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
494 return NGX_OK;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
495 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
496
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
497
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
498 static ngx_int_t
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
499 ngx_http_limit_conn_status_variable(ngx_http_request_t *r,
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
500 ngx_http_variable_value_t *v, uintptr_t data)
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
501 {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
502 if (r->main->limit_conn_status == 0) {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
503 v->not_found = 1;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
504 return NGX_OK;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
505 }
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
506
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
507 v->valid = 1;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
508 v->no_cacheable = 0;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
509 v->not_found = 0;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
510 v->len = ngx_http_limit_conn_status[r->main->limit_conn_status - 1].len;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
511 v->data = ngx_http_limit_conn_status[r->main->limit_conn_status - 1].data;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
512
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
513 return NGX_OK;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
514 }
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
515
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
516
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
517 static void *
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
518 ngx_http_limit_conn_create_conf(ngx_conf_t *cf)
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
519 {
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
520 ngx_http_limit_conn_conf_t *conf;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
521
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
522 conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_conf_t));
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
523 if (conf == NULL) {
2912
c7d57b539248 return NULL instead of NGX_CONF_ERROR on a create conf failure
Igor Sysoev <igor@sysoev.ru>
parents: 2720
diff changeset
524 return NULL;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
525 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
526
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
527 /*
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
528 * set by ngx_pcalloc():
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
529 *
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
530 * conf->limits.elts = NULL;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
531 */
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
532
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
533 conf->log_level = NGX_CONF_UNSET_UINT;
5117
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
534 conf->status_code = NGX_CONF_UNSET_UINT;
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
535 conf->dry_run = NGX_CONF_UNSET;
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
536
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
537 return conf;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
538 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
539
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
540
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
541 static char *
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
542 ngx_http_limit_conn_merge_conf(ngx_conf_t *cf, void *parent, void *child)
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
543 {
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
544 ngx_http_limit_conn_conf_t *prev = parent;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
545 ngx_http_limit_conn_conf_t *conf = child;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
546
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
547 if (conf->limits.elts == NULL) {
4380
7697412a0921 Fixed limit_conn_log_level/limit_req_log_level inheritance.
Valentin Bartenev <vbart@nginx.com>
parents: 4280
diff changeset
548 conf->limits = prev->limits;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
549 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
550
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
551 ngx_conf_merge_uint_value(conf->log_level, prev->log_level, NGX_LOG_ERR);
5117
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
552 ngx_conf_merge_uint_value(conf->status_code, prev->status_code,
00e4459739ed The limit_req_status and limit_conn_status directives.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4972
diff changeset
553 NGX_HTTP_SERVICE_UNAVAILABLE);
3186
23d567eabc5d limit_conn_log_level
Igor Sysoev <igor@sysoev.ru>
parents: 2912
diff changeset
554
7594
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
555 ngx_conf_merge_value(conf->dry_run, prev->dry_run, 0);
359b0ea2b067 Limit conn: limit_conn_dry_run directive.
Roman Arutyunyan <arut@nginx.com>
parents: 6480
diff changeset
556
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
557 return NGX_CONF_OK;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
558 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
559
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
560
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
561 static char *
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
562 ngx_http_limit_conn_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
563 {
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
564 u_char *p;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
565 ssize_t size;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
566 ngx_str_t *value, name, s;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
567 ngx_uint_t i;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
568 ngx_shm_zone_t *shm_zone;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
569 ngx_http_limit_conn_ctx_t *ctx;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
570 ngx_http_compile_complex_value_t ccv;
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
571
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
572 value = cf->args->elts;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
573
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
574 ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_conn_ctx_t));
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
575 if (ctx == NULL) {
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
576 return NGX_CONF_ERROR;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
577 }
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
578
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
579 ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
580
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
581 ccv.cf = cf;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
582 ccv.value = &value[1];
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
583 ccv.complex_value = &ctx->key;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
584
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
585 if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
586 return NGX_CONF_ERROR;
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
587 }
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
588
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
589 size = 0;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
590 name.len = 0;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
591
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
592 for (i = 2; i < cf->args->nelts; i++) {
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
593
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
594 if (ngx_strncmp(value[i].data, "zone=", 5) == 0) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
595
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
596 name.data = value[i].data + 5;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
597
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
598 p = (u_char *) ngx_strchr(name.data, ':');
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
599
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
600 if (p == NULL) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
601 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
602 "invalid zone size \"%V\"", &value[i]);
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
603 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
604 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
605
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
606 name.len = p - name.data;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
607
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
608 s.data = p + 1;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
609 s.len = value[i].data + value[i].len - s.data;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
610
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
611 size = ngx_parse_size(&s);
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
612
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
613 if (size == NGX_ERROR) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
614 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
615 "invalid zone size \"%V\"", &value[i]);
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
616 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
617 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
618
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
619 if (size < (ssize_t) (8 * ngx_pagesize)) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
620 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
621 "zone \"%V\" is too small", &value[i]);
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
622 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
623 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
624
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
625 continue;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
626 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
627
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
628 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
629 "invalid parameter \"%V\"", &value[i]);
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
630 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
631 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
632
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
633 if (name.len == 0) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
634 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
635 "\"%V\" must have \"zone\" parameter",
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
636 &cmd->name);
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
637 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
638 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
639
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
640 shm_zone = ngx_shared_memory_add(cf, &name, size,
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
641 &ngx_http_limit_conn_module);
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
642 if (shm_zone == NULL) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
643 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
644 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
645
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
646 if (shm_zone->data) {
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
647 ctx = shm_zone->data;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
648
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
649 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
5860
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
650 "%V \"%V\" is already bound to key \"%V\"",
c9787372f16d Limit conn: use complex value in limit_conn_zone (ticket #121).
Valentin Bartenev <vbart@nginx.com>
parents: 5859
diff changeset
651 &cmd->name, &name, &ctx->key.value);
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
652 return NGX_CONF_ERROR;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
653 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
654
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
655 shm_zone->init = ngx_http_limit_conn_init_zone;
4272
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
656 shm_zone->data = ctx;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
657
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
658 return NGX_CONF_OK;
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
659 }
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
660
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
661
260d591cb6a3 Limit zone: added the "limit_conn_zone" directive.
Valentin Bartenev <vbart@nginx.com>
parents: 4271
diff changeset
662 static char *
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
663 ngx_http_limit_conn(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
664 {
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
665 ngx_shm_zone_t *shm_zone;
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
666 ngx_http_limit_conn_conf_t *lccf = conf;
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
667 ngx_http_limit_conn_limit_t *limit, *limits;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
668
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
669 ngx_str_t *value;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
670 ngx_int_t n;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
671 ngx_uint_t i;
2372
7148efbdd798 test duplicate limit_conn
Igor Sysoev <igor@sysoev.ru>
parents: 1743
diff changeset
672
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
673 value = cf->args->elts;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
674
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
675 shm_zone = ngx_shared_memory_add(cf, &value[1], 0,
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
676 &ngx_http_limit_conn_module);
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
677 if (shm_zone == NULL) {
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
678 return NGX_CONF_ERROR;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
679 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
680
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
681 limits = lccf->limits.elts;
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
682
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
683 if (limits == NULL) {
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
684 if (ngx_array_init(&lccf->limits, cf->pool, 1,
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
685 sizeof(ngx_http_limit_conn_limit_t))
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
686 != NGX_OK)
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
687 {
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
688 return NGX_CONF_ERROR;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
689 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
690 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
691
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
692 for (i = 0; i < lccf->limits.nelts; i++) {
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
693 if (shm_zone == limits[i].shm_zone) {
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
694 return "is duplicate";
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
695 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
696 }
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
697
987
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
698 n = ngx_atoi(value[2].data, value[2].len);
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
699 if (n <= 0) {
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
700 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
987
14e68f471d02 new syntax
Igor Sysoev <igor@sysoev.ru>
parents: 984
diff changeset
701 "invalid number of connections \"%V\"", &value[2]);
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
702 return NGX_CONF_ERROR;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
703 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
704
1011
19118c44303f test length of variable and number of connections
Igor Sysoev <igor@sysoev.ru>
parents: 1002
diff changeset
705 if (n > 65535) {
19118c44303f test length of variable and number of connections
Igor Sysoev <igor@sysoev.ru>
parents: 1002
diff changeset
706 ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
19118c44303f test length of variable and number of connections
Igor Sysoev <igor@sysoev.ru>
parents: 1002
diff changeset
707 "connection limit must be less 65536");
19118c44303f test length of variable and number of connections
Igor Sysoev <igor@sysoev.ru>
parents: 1002
diff changeset
708 return NGX_CONF_ERROR;
19118c44303f test length of variable and number of connections
Igor Sysoev <igor@sysoev.ru>
parents: 1002
diff changeset
709 }
19118c44303f test length of variable and number of connections
Igor Sysoev <igor@sysoev.ru>
parents: 1002
diff changeset
710
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
711 limit = ngx_array_push(&lccf->limits);
4811
21d1e3bcb356 Added three missing checks for NULL after ngx_array_push() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 4756
diff changeset
712 if (limit == NULL) {
21d1e3bcb356 Added three missing checks for NULL after ngx_array_push() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 4756
diff changeset
713 return NGX_CONF_ERROR;
21d1e3bcb356 Added three missing checks for NULL after ngx_array_push() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 4756
diff changeset
714 }
21d1e3bcb356 Added three missing checks for NULL after ngx_array_push() calls.
Valentin Bartenev <vbart@nginx.com>
parents: 4756
diff changeset
715
4271
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
716 limit->conn = n;
b86cceba426a Limit zone: support for multiple "limit_conn" limits.
Valentin Bartenev <vbart@nginx.com>
parents: 4270
diff changeset
717 limit->shm_zone = shm_zone;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
718
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
719 return NGX_CONF_OK;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
720 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
721
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
722
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
723 static ngx_int_t
7595
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
724 ngx_http_limit_conn_add_variables(ngx_conf_t *cf)
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
725 {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
726 ngx_http_variable_t *var, *v;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
727
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
728 for (v = ngx_http_limit_conn_vars; v->name.len; v++) {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
729 var = ngx_http_add_variable(cf, &v->name, v->flags);
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
730 if (var == NULL) {
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
731 return NGX_ERROR;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
732 }
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
733
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
734 var->get_handler = v->get_handler;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
735 var->data = v->data;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
736 }
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
737
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
738 return NGX_OK;
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
739 }
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
740
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
741
9606d93aa586 Limit conn: $limit_conn_status variable.
Roman Arutyunyan <arut@nginx.com>
parents: 7594
diff changeset
742 static ngx_int_t
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
743 ngx_http_limit_conn_init(ngx_conf_t *cf)
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
744 {
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
745 ngx_http_handler_pt *h;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
746 ngx_http_core_main_conf_t *cmcf;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
747
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
748 cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
749
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
750 h = ngx_array_push(&cmcf->phases[NGX_HTTP_PREACCESS_PHASE].handlers);
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
751 if (h == NULL) {
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
752 return NGX_ERROR;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
753 }
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
754
4280
91874133fb27 Renamed ngx_http_limit_zone_module to ngx_http_limit_conn_module.
Valentin Bartenev <vbart@nginx.com>
parents: 4272
diff changeset
755 *h = ngx_http_limit_conn_handler;
980
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
756
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
757 return NGX_OK;
7cb910b4a58a ngx_http_limit_zone_module
Igor Sysoev <igor@sysoev.ru>
parents:
diff changeset
758 }