annotate xml/en/docs/http/load_balancing.xml @ 3090:27532d42102b default tip

Documented the "rate" parameter of the "error_log" directive.
author Maxim Dounin <mdounin@mdounin.ru>
date Sun, 16 Jun 2024 06:55:30 +0300
parents 2be49a02a2e3
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
1 <?xml version="1.0"?>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
2
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
3 <!--
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
4 Copyright (C) Nginx, Inc.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
5 -->
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
6
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
7 <!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
8
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
9 <article name="Using nginx as HTTP load balancer"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
10 link="/en/docs/http/load_balancing.html"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
11 lang="en"
3046
2be49a02a2e3 Free nginx: various marketing links removed.
Maxim Dounin <mdounin@mdounin.ru>
parents: 2134
diff changeset
12 rev="6">
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
13
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
14 <section name="Introduction">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
15
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
16 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
17 Load balancing across multiple application instances is a commonly used
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
18 technique for optimizing resource utilization, maximizing throughput,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
19 reducing latency, and ensuring fault-tolerant configurations.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
20 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
21
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
22 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
23 It is possible to use nginx as a very efficient HTTP load balancer to
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
24 distribute traffic to several application servers and to improve
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
25 performance, scalability and reliability of web applications with nginx.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
26 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
27
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
28 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
29
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
30
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
31 <section id="nginx_load_balancing_methods"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
32 name="Load balancing methods">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
33
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
34 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
35 The following load balancing mechanisms (or methods) are supported in
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
36 nginx:
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
37 <list type="bullet" compact="no">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
38
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
39 <listitem>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
40 round-robin — requests to the application servers are distributed
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
41 in a round-robin fashion,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
42 </listitem>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
43
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
44 <listitem>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
45 least-connected — next request is assigned to the server with the
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
46 least number of active connections,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
47 </listitem>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
48
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
49 <listitem>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
50 ip-hash — a hash-function is used to determine what server should
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
51 be selected for the next request (based on the client’s IP address).
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
52 </listitem>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
53
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
54 </list>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
55 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
56
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
57 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
58
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
59
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
60 <section id="nginx_load_balancing_configuration"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
61 name="Default load balancing configuration">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
62
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
63 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
64 The simplest configuration for load balancing with nginx may look
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
65 like the following:
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
66 <programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
67 http {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
68 upstream myapp1 {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
69 server srv1.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
70 server srv2.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
71 server srv3.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
72 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
73
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
74 server {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
75 listen 80;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
76
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
77 location / {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
78 proxy_pass http://myapp1;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
79 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
80 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
81 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
82 </programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
83 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
84
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
85 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
86 In the example above, there are 3 instances of the same application
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
87 running on srv1-srv3.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
88 When the load balancing method is not specifically configured,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
89 it defaults to round-robin.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
90 All requests are
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
91 <link doc="ngx_http_proxy_module.xml" id="proxy_pass">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
92 proxied</link> to the server group myapp1, and nginx applies HTTP load
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
93 balancing to distribute the requests.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
94 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
95
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
96 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
97 Reverse proxy implementation in nginx includes load balancing for HTTP,
2134
4cafd82e5007 Added info about gRPC to various modules.
Yaroslav Zhuravlev <yar@nginx.com>
parents: 1527
diff changeset
98 HTTPS, FastCGI, uwsgi, SCGI, memcached, and gRPC.
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
99 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
100
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
101 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
102 To configure load balancing for HTTPS instead of HTTP, just use “https”
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
103 as the protocol.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
104 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
105
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
106 <para>
2134
4cafd82e5007 Added info about gRPC to various modules.
Yaroslav Zhuravlev <yar@nginx.com>
parents: 1527
diff changeset
107 When setting up load balancing for FastCGI, uwsgi, SCGI, memcached, or gRPC, use
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
108 <link doc="ngx_http_fastcgi_module.xml" id="fastcgi_pass"/>,
1194
9264fdb6c833 Added links to uwsgi.
Ruslan Ermilov <ru@nginx.com>
parents: 1181
diff changeset
109 <link doc="ngx_http_uwsgi_module.xml" id="uwsgi_pass"/>,
2134
4cafd82e5007 Added info about gRPC to various modules.
Yaroslav Zhuravlev <yar@nginx.com>
parents: 1527
diff changeset
110 <link doc="ngx_http_scgi_module.xml" id="scgi_pass"/>,
4cafd82e5007 Added info about gRPC to various modules.
Yaroslav Zhuravlev <yar@nginx.com>
parents: 1527
diff changeset
111 <link doc="ngx_http_memcached_module.xml" id="memcached_pass"/>, and
4cafd82e5007 Added info about gRPC to various modules.
Yaroslav Zhuravlev <yar@nginx.com>
parents: 1527
diff changeset
112 <link doc="ngx_http_grpc_module.xml" id="grpc_pass"/>
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
113 directives respectively.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
114 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
115
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
116 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
117
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
118
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
119 <section id="nginx_load_balancing_with_least_connected"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
120 name="Least connected load balancing">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
121
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
122 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
123 Another load balancing discipline is least-connected.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
124 Least-connected allows controlling the load on application
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
125 instances more fairly in a situation when some of the requests
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
126 take longer to complete.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
127 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
128
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
129 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
130 With the least-connected load balancing, nginx will try not to overload a
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
131 busy application server with excessive requests, distributing the new
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
132 requests to a less busy server instead.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
133 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
134
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
135 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
136 Least-connected load balancing in nginx is activated when the
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
137 <link doc="ngx_http_upstream_module.xml" id="least_conn">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
138 least_conn</link> directive is used as part of the server group configuration:
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
139 <programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
140 upstream myapp1 {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
141 least_conn;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
142 server srv1.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
143 server srv2.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
144 server srv3.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
145 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
146 </programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
147 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
148
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
149 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
150
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
151
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
152 <section id="nginx_load_balancing_with_ip_hash"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
153 name="Session persistence">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
154
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
155 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
156 Please note that with round-robin or least-connected load
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
157 balancing, each subsequent client’s request can be potentially
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
158 distributed to a different server.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
159 There is no guarantee that the same client will be always
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
160 directed to the same server.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
161 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
162
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
163 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
164 If there is the need to tie a client to a particular application server —
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
165 in other words, make the client’s session “sticky” or “persistent” in
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
166 terms of always trying to select a particular server — the ip-hash load
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
167 balancing mechanism can be used.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
168 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
169
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
170 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
171 With ip-hash, the client’s IP address is used as a hashing key to
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
172 determine what server in a server group should be selected for the
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
173 client’s requests.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
174 This method ensures that the requests from the same client
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
175 will always be directed to the same server
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
176 except when this server is unavailable.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
177 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
178
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
179 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
180 To configure ip-hash load balancing, just add the
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
181 <link doc="ngx_http_upstream_module.xml" id="ip_hash"/>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
182 directive to the server (upstream) group configuration:
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
183 <programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
184 upstream myapp1 {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
185 ip_hash;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
186 server srv1.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
187 server srv2.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
188 server srv3.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
189 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
190 </programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
191 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
192
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
193 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
194
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
195
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
196 <section id="nginx_weighted_load_balancing"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
197 name="Weighted load balancing">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
198
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
199 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
200 It is also possible to influence nginx load balancing algorithms even
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
201 further by using server weights.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
202 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
203
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
204 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
205 In the examples above, the server weights are not configured which means
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
206 that all specified servers are treated as equally qualified for a
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
207 particular load balancing method.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
208 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
209
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
210 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
211 With the round-robin in particular it also means a more or less equal
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
212 distribution of requests across the servers — provided there are enough
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
213 requests, and when the requests are processed in a uniform manner and
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
214 completed fast enough.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
215 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
216
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
217 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
218 When the
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
219 <link doc="ngx_http_upstream_module.xml" id="server">weight</link>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
220 parameter is specified for a server, the weight is accounted as part
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
221 of the load balancing decision.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
222 <programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
223 upstream myapp1 {
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
224 server srv1.example.com weight=3;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
225 server srv2.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
226 server srv3.example.com;
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
227 }
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
228 </programlisting>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
229 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
230
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
231 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
232 With this configuration, every 5 new requests will be distributed across
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
233 the application instances as the following: 3 requests will be directed
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
234 to srv1, one request will go to srv2, and another one — to srv3.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
235 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
236
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
237 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
238 It is similarly possible to use weights with the least-connected and
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
239 ip-hash load balancing in the recent versions of nginx.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
240 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
241
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
242 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
243
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
244
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
245 <section id="nginx_load_balancing_health_checks"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
246 name="Health checks">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
247
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
248 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
249 Reverse proxy implementation in nginx includes in-band (or passive)
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
250 server health checks.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
251 If the response from a particular server fails with an error,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
252 nginx will mark this server as failed, and will try to
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
253 avoid selecting this server for subsequent inbound requests for a while.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
254 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
255
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
256 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
257 The
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
258 <link doc="ngx_http_upstream_module.xml" id="server">max_fails</link>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
259 directive sets the number of consecutive unsuccessful attempts to
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
260 communicate with the server that should happen during
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
261 <link doc="ngx_http_upstream_module.xml" id="server">fail_timeout</link>.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
262 By default,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
263 <link doc="ngx_http_upstream_module.xml" id="server">max_fails</link>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
264 is set to 1.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
265 When it is set to 0, health checks are disabled for this server.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
266 The
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
267 <link doc="ngx_http_upstream_module.xml" id="server">fail_timeout</link>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
268 parameter also defines how long the server will be marked as failed.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
269 After
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
270 <link doc="ngx_http_upstream_module.xml" id="server">fail_timeout</link>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
271 interval following the server failure, nginx will start to gracefully
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
272 probe the server with the live client’s requests.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
273 If the probes have been successful, the server is marked as a live one.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
274 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
275
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
276 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
277
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
278
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
279 <section id="nginx_load_balancing_additional_information"
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
280 name="Further reading">
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
281
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
282 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
283 In addition, there are more directives and parameters that control server
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
284 load balancing in nginx, e.g.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
285 <link doc="ngx_http_proxy_module.xml" id="proxy_next_upstream"/>,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
286 <link doc="ngx_http_upstream_module.xml" id="server">backup</link>,
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
287 <link doc="ngx_http_upstream_module.xml" id="server">down</link>, and
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
288 <link doc="ngx_http_upstream_module.xml" id="keepalive"/>.
1177
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
289 For more information please check our
1178
52747e115aba A relative URL instead of absolute one used.
Maxim Konovalov <maxim@nginx.com>
parents: 1177
diff changeset
290 <link url="..">reference documentation</link>.
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
291 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
292
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
293 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
294
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
295 </article>