Mercurial > hg > nginx-quic
annotate src/http/ngx_http_upstream_round_robin.h @ 8311:f790816a0e87
HTTP/2: removed http2_idle_timeout and http2_max_requests.
Instead, keepalive_timeout and keepalive_requests are now used. This
is expected to simplify HTTP/2 code and usage. This also matches
directives used by upstream module for all protocols.
In case of default settings, this effectively changes maximum number
of requests per connection from 1000 to 100. This looks acceptable,
especially given that HTTP/2 code now properly supports lingering close.
Further, this changes default keepalive timeout in HTTP/2 from 300 seconds
to 75 seconds. This also looks acceptable, and larger than PING interval
used by Firefox (network.http.spdy.ping-threshold defaults to 58s),
the only browser to use PINGs.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 11 Feb 2021 21:52:23 +0300 |
parents | 90cc7194e993 |
children |
rev | line source |
---|---|
884 | 1 |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4412 | 4 * Copyright (C) Nginx, Inc. |
884 | 5 */ |
6 | |
7 | |
8 #ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ | |
9 #define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ | |
10 | |
11 | |
12 #include <ngx_config.h> | |
13 #include <ngx_core.h> | |
14 #include <ngx_http.h> | |
15 | |
16 | |
6100
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
17 typedef struct ngx_http_upstream_rr_peer_s ngx_http_upstream_rr_peer_t; |
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
18 |
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
19 struct ngx_http_upstream_rr_peer_s { |
884 | 20 struct sockaddr *sockaddr; |
21 socklen_t socklen; | |
22 ngx_str_t name; | |
5717
efc84a5723b3
Upstream: generic hash module.
Roman Arutyunyan <arut@nginx.com>
parents:
5136
diff
changeset
|
23 ngx_str_t server; |
884 | 24 |
1344
8f5b5641966c
fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents:
1284
diff
changeset
|
25 ngx_int_t current_weight; |
4621
c90801720a0c
Upstream: smooth weighted round-robin balancing.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4412
diff
changeset
|
26 ngx_int_t effective_weight; |
1344
8f5b5641966c
fair upstream weight balancer
Igor Sysoev <igor@sysoev.ru>
parents:
1284
diff
changeset
|
27 ngx_int_t weight; |
884 | 28 |
6099
6ff0ebd6fbf4
Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents:
6038
diff
changeset
|
29 ngx_uint_t conns; |
6705 | 30 ngx_uint_t max_conns; |
6099
6ff0ebd6fbf4
Upstream: track the number of active connections to upstreams.
Ruslan Ermilov <ru@nginx.com>
parents:
6038
diff
changeset
|
31 |
884 | 32 ngx_uint_t fails; |
33 time_t accessed; | |
4207
4fc91bae6f83
Better recheck of dead upstream servers.
Maxim Dounin <mdounin@mdounin.ru>
parents:
3264
diff
changeset
|
34 time_t checked; |
884 | 35 |
36 ngx_uint_t max_fails; | |
37 time_t fail_timeout; | |
6708
4080f94a996f
Modules compatibility: slow start fields.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6705
diff
changeset
|
38 ngx_msec_t slow_start; |
4080f94a996f
Modules compatibility: slow start fields.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6705
diff
changeset
|
39 ngx_msec_t start_time; |
884 | 40 |
6713
63b8b157b776
Modules compatibility: down flag promoted to a bitmask.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6712
diff
changeset
|
41 ngx_uint_t down; |
884 | 42 |
6735
e38e9c50a40e
Modules compatibility: compatibility with NGX_HTTP_SSL.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6715
diff
changeset
|
43 #if (NGX_HTTP_SSL || NGX_COMPAT) |
6103
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
44 void *ssl_session; |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
45 int ssl_session_len; |
884 | 46 #endif |
6100
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
47 |
6103
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
48 #if (NGX_HTTP_UPSTREAM_ZONE) |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
49 ngx_atomic_t lock; |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
50 #endif |
6701
d69964eb8335
Upstream: style, ngx_http_upstream_rr_peer_t.next moved.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6198
diff
changeset
|
51 |
d69964eb8335
Upstream: style, ngx_http_upstream_rr_peer_t.next moved.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6198
diff
changeset
|
52 ngx_http_upstream_rr_peer_t *next; |
6715
d200a0fd00b7
Introduced the NGX_COMPAT macro.
Ruslan Ermilov <ru@nginx.com>
parents:
6713
diff
changeset
|
53 |
d200a0fd00b7
Introduced the NGX_COMPAT macro.
Ruslan Ermilov <ru@nginx.com>
parents:
6713
diff
changeset
|
54 NGX_COMPAT_BEGIN(32) |
d200a0fd00b7
Introduced the NGX_COMPAT macro.
Ruslan Ermilov <ru@nginx.com>
parents:
6713
diff
changeset
|
55 NGX_COMPAT_END |
6100
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
56 }; |
884 | 57 |
58 | |
1378 | 59 typedef struct ngx_http_upstream_rr_peers_s ngx_http_upstream_rr_peers_t; |
60 | |
61 struct ngx_http_upstream_rr_peers_s { | |
884 | 62 ngx_uint_t number; |
63 | |
6103
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
64 #if (NGX_HTTP_UPSTREAM_ZONE) |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
65 ngx_slab_pool_t *shpool; |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
66 ngx_atomic_t rwlock; |
6198
311d232ad803
Upstream: fixed shared upstreams on win32.
Ruslan Ermilov <ru@nginx.com>
parents:
6103
diff
changeset
|
67 ngx_http_upstream_rr_peers_t *zone_next; |
6103
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
68 #endif |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
69 |
4655
382c523d253a
Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4621
diff
changeset
|
70 ngx_uint_t total_weight; |
8249
90cc7194e993
Upstream: excluded down servers from the next_upstream tries.
Ruslan Ermilov <ru@nginx.com>
parents:
6735
diff
changeset
|
71 ngx_uint_t tries; |
4655
382c523d253a
Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4621
diff
changeset
|
72 |
382c523d253a
Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4621
diff
changeset
|
73 unsigned single:1; |
382c523d253a
Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4621
diff
changeset
|
74 unsigned weighted:1; |
382c523d253a
Upstream: weights support in ip_hash balancer.
Maxim Dounin <mdounin@mdounin.ru>
parents:
4621
diff
changeset
|
75 |
884 | 76 ngx_str_t *name; |
77 | |
1378 | 78 ngx_http_upstream_rr_peers_t *next; |
79 | |
6100
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
80 ngx_http_upstream_rr_peer_t *peer; |
1378 | 81 }; |
884 | 82 |
83 | |
6103
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
84 #if (NGX_HTTP_UPSTREAM_ZONE) |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
85 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
86 #define ngx_http_upstream_rr_peers_rlock(peers) \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
87 \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
88 if (peers->shpool) { \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
89 ngx_rwlock_rlock(&peers->rwlock); \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
90 } |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
91 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
92 #define ngx_http_upstream_rr_peers_wlock(peers) \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
93 \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
94 if (peers->shpool) { \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
95 ngx_rwlock_wlock(&peers->rwlock); \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
96 } |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
97 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
98 #define ngx_http_upstream_rr_peers_unlock(peers) \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
99 \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
100 if (peers->shpool) { \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
101 ngx_rwlock_unlock(&peers->rwlock); \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
102 } |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
103 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
104 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
105 #define ngx_http_upstream_rr_peer_lock(peers, peer) \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
106 \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
107 if (peers->shpool) { \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
108 ngx_rwlock_wlock(&peer->lock); \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
109 } |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
110 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
111 #define ngx_http_upstream_rr_peer_unlock(peers, peer) \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
112 \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
113 if (peers->shpool) { \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
114 ngx_rwlock_unlock(&peer->lock); \ |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
115 } |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
116 |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
117 #else |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
118 |
6102 | 119 #define ngx_http_upstream_rr_peers_rlock(peers) |
120 #define ngx_http_upstream_rr_peers_wlock(peers) | |
121 #define ngx_http_upstream_rr_peers_unlock(peers) | |
122 #define ngx_http_upstream_rr_peer_lock(peers, peer) | |
123 #define ngx_http_upstream_rr_peer_unlock(peers, peer) | |
124 | |
6103
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
125 #endif |
79ddb0bdb273
Upstream: the "zone" directive.
Ruslan Ermilov <ru@nginx.com>
parents:
6102
diff
changeset
|
126 |
6102 | 127 |
884 | 128 typedef struct { |
6712
fd5c2781460b
Modules compatibility: upstream config field.
Maxim Dounin <mdounin@mdounin.ru>
parents:
6708
diff
changeset
|
129 ngx_uint_t config; |
884 | 130 ngx_http_upstream_rr_peers_t *peers; |
6100
c44459611d91
Upstream: store peers as a linked list.
Ruslan Ermilov <ru@nginx.com>
parents:
6099
diff
changeset
|
131 ngx_http_upstream_rr_peer_t *current; |
954
f16424aa5d89
style fix: remove trailing spaces
Igor Sysoev <igor@sysoev.ru>
parents:
884
diff
changeset
|
132 uintptr_t *tried; |
884 | 133 uintptr_t data; |
134 } ngx_http_upstream_rr_peer_data_t; | |
135 | |
136 | |
137 ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf, | |
138 ngx_http_upstream_srv_conf_t *us); | |
139 ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r, | |
140 ngx_http_upstream_srv_conf_t *us); | |
1658 | 141 ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r, |
142 ngx_http_upstream_resolved_t *ur); | |
884 | 143 ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc, |
144 void *data); | |
145 void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc, | |
146 void *data, ngx_uint_t state); | |
147 | |
148 #if (NGX_HTTP_SSL) | |
1284
be2b895d31e0
fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents:
954
diff
changeset
|
149 ngx_int_t |
be2b895d31e0
fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents:
954
diff
changeset
|
150 ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc, |
be2b895d31e0
fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents:
954
diff
changeset
|
151 void *data); |
be2b895d31e0
fix segfault when session was freed twice
Igor Sysoev <igor@sysoev.ru>
parents:
954
diff
changeset
|
152 void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc, |
884 | 153 void *data); |
154 #endif | |
155 | |
156 | |
157 #endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */ |