annotate xml/en/docs/http/load_balancing.xml @ 3011:55d49eb065ac

Fixed example in the js_periodic directive.
author Yaroslav Zhuravlev <yar@nginx.com>
date Thu, 14 Sep 2023 16:38:00 +0100
parents 4cafd82e5007
children 2be49a02a2e3
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"
2134
4cafd82e5007 Added info about gRPC to various modules.
Yaroslav Zhuravlev <yar@nginx.com>
parents: 1527
diff changeset
12 rev="5">
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 <para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
294 Last but not least,
1527
f9a138e5ab14 Updated links to nginx.com website.
Valentin Bartenev <vbart@nginx.com>
parents: 1194
diff changeset
295 <link url="https://www.nginx.com/products/application-load-balancing/">
1165
0a441212ef0f A link to nginx.com application load balancing product page fixed.
Maxim Konovalov <maxim@nginx.com>
parents: 1076
diff changeset
296 application load balancing</link>,
1527
f9a138e5ab14 Updated links to nginx.com website.
Valentin Bartenev <vbart@nginx.com>
parents: 1194
diff changeset
297 <link url="https://www.nginx.com/products/application-health-checks/">
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
298 application health checks</link>,
1527
f9a138e5ab14 Updated links to nginx.com website.
Valentin Bartenev <vbart@nginx.com>
parents: 1194
diff changeset
299 <link url="https://www.nginx.com/products/live-activity-monitoring/">
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
300 activity monitoring</link> and
1527
f9a138e5ab14 Updated links to nginx.com website.
Valentin Bartenev <vbart@nginx.com>
parents: 1194
diff changeset
301 <link url="https://www.nginx.com/products/on-the-fly-reconfiguration/">
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
302 on-the-fly reconfiguration</link> of server groups are available
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
303 as part of our paid NGINX Plus subscriptions.
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
304 </para>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
305
1177
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
306 <para>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
307 The following articles describe load balancing with NGINX Plus
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
308 in more detail:
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
309 <list type="bullet" compact="no">
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
310
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
311 <listitem>
1527
f9a138e5ab14 Updated links to nginx.com website.
Valentin Bartenev <vbart@nginx.com>
parents: 1194
diff changeset
312 <link url="https://www.nginx.com/blog/load-balancing-with-nginx-plus/">
1177
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
313 Load Balancing with NGINX and NGINX Plus</link>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
314 </listitem>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
315
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
316 <listitem>
1527
f9a138e5ab14 Updated links to nginx.com website.
Valentin Bartenev <vbart@nginx.com>
parents: 1194
diff changeset
317 <link url="https://www.nginx.com/blog/load-balancing-with-nginx-plus-part2/">
1177
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
318 Load Balancing with NGINX and NGINX Plus part 2</link>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
319 </listitem>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
320
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
321 </list>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
322 </para>
e33858baaecd Links to the nginx reference docs and lb blogposts added.
Maxim Konovalov <maxim@nginx.com>
parents: 1165
diff changeset
323
1076
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
324 </section>
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
325
5f41c6582a4b [mq]: p
Ruslan Ermilov <ru@nginx.com>
parents:
diff changeset
326 </article>