Mercurial > hg > nginx
annotate src/stream/ngx_stream.h @ 6153:4f6efabcb09b
The "reuseport" option of the "listen" directive.
When configured, an individual listen socket on a given address is
created for each worker process. This allows to reduce in-kernel lock
contention on configurations with high accept rates, resulting in better
performance. As of now it works on Linux and DragonFly BSD.
Note that on Linux incoming connection requests are currently tied up
to a specific listen socket, and if some sockets are closed, connection
requests will be reset, see https://lwn.net/Articles/542629/. With
nginx, this may happen if the number of worker processes is reduced.
There is no such problem on DragonFly BSD.
Based on previous work by Sepherosa Ziehau and Yingqi Lu.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 20 May 2015 15:51:56 +0300 |
parents | 187aa751ad62 |
children | f654addf0eea |
rev | line source |
---|---|
6115 | 1 |
2 /* | |
3 * Copyright (C) Roman Arutyunyan | |
4 * Copyright (C) Nginx, Inc. | |
5 */ | |
6 | |
7 | |
8 #ifndef _NGX_STREAM_H_INCLUDED_ | |
9 #define _NGX_STREAM_H_INCLUDED_ | |
10 | |
11 | |
12 #include <ngx_config.h> | |
13 #include <ngx_core.h> | |
14 | |
15 #if (NGX_STREAM_SSL) | |
16 #include <ngx_stream_ssl_module.h> | |
17 #endif | |
18 | |
19 | |
20 typedef struct ngx_stream_session_s ngx_stream_session_t; | |
21 | |
22 | |
23 #include <ngx_stream_upstream.h> | |
24 #include <ngx_stream_upstream_round_robin.h> | |
25 | |
26 | |
27 typedef struct { | |
28 void **main_conf; | |
29 void **srv_conf; | |
30 } ngx_stream_conf_ctx_t; | |
31 | |
32 | |
33 typedef struct { | |
34 u_char sockaddr[NGX_SOCKADDRLEN]; | |
35 socklen_t socklen; | |
36 | |
37 /* server ctx */ | |
38 ngx_stream_conf_ctx_t *ctx; | |
39 | |
40 unsigned bind:1; | |
41 unsigned wildcard:1; | |
42 #if (NGX_STREAM_SSL) | |
43 unsigned ssl:1; | |
44 #endif | |
45 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) | |
46 unsigned ipv6only:1; | |
47 #endif | |
6153
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6129
diff
changeset
|
48 #if (NGX_HAVE_REUSEPORT) |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6129
diff
changeset
|
49 unsigned reuseport:1; |
4f6efabcb09b
The "reuseport" option of the "listen" directive.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6129
diff
changeset
|
50 #endif |
6115 | 51 unsigned so_keepalive:2; |
52 #if (NGX_HAVE_KEEPALIVE_TUNABLE) | |
53 int tcp_keepidle; | |
54 int tcp_keepintvl; | |
55 int tcp_keepcnt; | |
56 #endif | |
57 } ngx_stream_listen_t; | |
58 | |
59 | |
60 typedef struct { | |
61 ngx_stream_conf_ctx_t *ctx; | |
62 ngx_str_t addr_text; | |
63 #if (NGX_STREAM_SSL) | |
64 ngx_uint_t ssl; /* unsigned ssl:1; */ | |
65 #endif | |
66 } ngx_stream_addr_conf_t; | |
67 | |
68 typedef struct { | |
69 in_addr_t addr; | |
70 ngx_stream_addr_conf_t conf; | |
71 } ngx_stream_in_addr_t; | |
72 | |
73 | |
74 #if (NGX_HAVE_INET6) | |
75 | |
76 typedef struct { | |
77 struct in6_addr addr6; | |
78 ngx_stream_addr_conf_t conf; | |
79 } ngx_stream_in6_addr_t; | |
80 | |
81 #endif | |
82 | |
83 | |
84 typedef struct { | |
85 /* ngx_stream_in_addr_t or ngx_stream_in6_addr_t */ | |
86 void *addrs; | |
87 ngx_uint_t naddrs; | |
88 } ngx_stream_port_t; | |
89 | |
90 | |
91 typedef struct { | |
92 int family; | |
93 in_port_t port; | |
94 ngx_array_t addrs; /* array of ngx_stream_conf_addr_t */ | |
95 } ngx_stream_conf_port_t; | |
96 | |
97 | |
98 typedef struct { | |
99 struct sockaddr *sockaddr; | |
100 socklen_t socklen; | |
101 | |
102 ngx_stream_conf_ctx_t *ctx; | |
103 | |
104 unsigned bind:1; | |
105 unsigned wildcard:1; | |
106 #if (NGX_STREAM_SSL) | |
107 unsigned ssl:1; | |
108 #endif | |
109 #if (NGX_HAVE_INET6 && defined IPV6_V6ONLY) | |
110 unsigned ipv6only:1; | |
111 #endif | |
112 unsigned so_keepalive:2; | |
113 #if (NGX_HAVE_KEEPALIVE_TUNABLE) | |
114 int tcp_keepidle; | |
115 int tcp_keepintvl; | |
116 int tcp_keepcnt; | |
117 #endif | |
118 } ngx_stream_conf_addr_t; | |
119 | |
120 | |
121 typedef struct { | |
122 ngx_array_t servers; /* ngx_stream_core_srv_conf_t */ | |
123 ngx_array_t listen; /* ngx_stream_listen_t */ | |
124 } ngx_stream_core_main_conf_t; | |
125 | |
126 | |
127 typedef void (*ngx_stream_handler_pt)(ngx_stream_session_t *s); | |
128 | |
129 | |
130 typedef struct { | |
131 ngx_stream_handler_pt handler; | |
132 ngx_stream_conf_ctx_t *ctx; | |
133 u_char *file_name; | |
134 ngx_int_t line; | |
135 ngx_log_t *error_log; | |
136 } ngx_stream_core_srv_conf_t; | |
137 | |
138 | |
139 struct ngx_stream_session_s { | |
140 uint32_t signature; /* "STRM" */ | |
141 | |
142 ngx_connection_t *connection; | |
143 | |
144 off_t received; | |
145 | |
146 ngx_log_handler_pt log_handler; | |
147 | |
148 void **ctx; | |
149 void **main_conf; | |
150 void **srv_conf; | |
151 | |
152 ngx_stream_upstream_t *upstream; | |
153 }; | |
154 | |
155 | |
156 typedef struct { | |
157 void *(*create_main_conf)(ngx_conf_t *cf); | |
158 char *(*init_main_conf)(ngx_conf_t *cf, void *conf); | |
159 | |
160 void *(*create_srv_conf)(ngx_conf_t *cf); | |
161 char *(*merge_srv_conf)(ngx_conf_t *cf, void *prev, | |
162 void *conf); | |
163 } ngx_stream_module_t; | |
164 | |
165 | |
166 #define NGX_STREAM_MODULE 0x4d525453 /* "STRM" */ | |
167 | |
168 #define NGX_STREAM_MAIN_CONF 0x02000000 | |
169 #define NGX_STREAM_SRV_CONF 0x04000000 | |
170 #define NGX_STREAM_UPS_CONF 0x08000000 | |
171 | |
172 | |
173 #define NGX_STREAM_MAIN_CONF_OFFSET offsetof(ngx_stream_conf_ctx_t, main_conf) | |
174 #define NGX_STREAM_SRV_CONF_OFFSET offsetof(ngx_stream_conf_ctx_t, srv_conf) | |
175 | |
176 | |
177 #define ngx_stream_get_module_ctx(s, module) (s)->ctx[module.ctx_index] | |
178 #define ngx_stream_set_ctx(s, c, module) s->ctx[module.ctx_index] = c; | |
179 #define ngx_stream_delete_ctx(s, module) s->ctx[module.ctx_index] = NULL; | |
180 | |
181 | |
182 #define ngx_stream_get_module_main_conf(s, module) \ | |
183 (s)->main_conf[module.ctx_index] | |
184 #define ngx_stream_get_module_srv_conf(s, module) \ | |
185 (s)->srv_conf[module.ctx_index] | |
186 | |
187 #define ngx_stream_conf_get_module_main_conf(cf, module) \ | |
188 ((ngx_stream_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index] | |
189 #define ngx_stream_conf_get_module_srv_conf(cf, module) \ | |
190 ((ngx_stream_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index] | |
191 | |
192 #define ngx_stream_cycle_get_module_main_conf(cycle, module) \ | |
193 (cycle->conf_ctx[ngx_stream_module.index] ? \ | |
194 ((ngx_stream_conf_ctx_t *) cycle->conf_ctx[ngx_stream_module.index]) \ | |
195 ->main_conf[module.ctx_index]: \ | |
196 NULL) | |
197 | |
198 | |
199 void ngx_stream_init_connection(ngx_connection_t *c); | |
200 void ngx_stream_close_connection(ngx_connection_t *c); | |
201 | |
202 | |
203 extern ngx_module_t ngx_stream_module; | |
204 extern ngx_uint_t ngx_stream_max_module; | |
205 extern ngx_module_t ngx_stream_core_module; | |
206 | |
207 | |
208 #endif /* _NGX_STREAM_H_INCLUDED_ */ |