Nginx 反向代理与负载均衡

本文最后更新于:2024年3月18日 凌晨

Nginx 反向代理与负载均衡

反向代理

  • /api/**代理到localhost:8080/**上。
1
2
3
4
5
6
7
8
9
10
11
12
server {
location /api/ {
proxy_pass http://localhost:8080/;
proxy_cookie_path / /api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
}
}
  • proxy_cookie_path:修改cookie里域名。
  • proxy_connect_timeout:nginx跟后端服务器连接超时时间(代理连接超时)
  • proxy_send_timeout:后端服务器数据回传时间(代理发送超时)
  • proxy_read_timeout:连接成功后,后端服务器响应时间(代理接收超时)

负载均衡

  • 负载均衡主要分为硬件负载均衡和软件负载均衡,硬件负载均衡是使用专门的软件和硬件相结合的设备,设备商会提供完整成熟的解决方案,比如F5,在数据的稳定性以及安全性来说非常可靠,但是相比软件而言造价会更加昂贵,软件的负载均衡以Nginx这类软件为主,实现的一种消息队列分发机制。
  • 简单来说所谓的负载均衡就是把很多请求进行分流,将他们分配到不同的服务器去处理,比如我有3个服务器,分别为A,B,C,然后使用Nginx进行负载均衡,使用轮询策略,此时如果收到了9个请求,那么会均匀的将这9个请求分发给A,B,Cf服务器,每一个服务器处理3个请求,这样的话我们可以利用多台机器集群的特性减少单个服务器的压力。

负载均衡策略

NGINX开源支持四种负载平衡方法,而NGINX Plus又增加了两种方法。

Round Robin

对所有的请求进行轮询发送请求,默认的分配方式。

1
2
3
4
upstream server {
server www.panchengming.com;
server www.panchengming2.com;
}

注意:上面的域名也可以用IP替代。

Least Connections

以最少的活动连接数将请求发送到服务器,同样要考虑服务器权重。

1
2
3
4
5
upstream server {
least_conn;
server www.panchengming.com;
server www.panchengming2.com;
}

IP Hash

发送请求的服务器由客户机IP地址决定,在这种情况下,使用IPv4地址的前三个字节或整个IPv6地址来计算散列值,该方法保证来自相同地址的请求到达相同的服务器,除非该服务器不可用。

1
2
3
4
5
upstream server {
ip_hash;
server www.panchengming.com;
server www.panchengming2.com;
}

Generic Hash

请求发送到的服务器由用户定义的键决定,该键可以是文本字符串,变量或组合。

1
2
3
4
5
upstream server {
hash $request_uri consistent;
server www.panchengming.com;
server www.panchengming2.com;
}

Least Time (NGINX Plus only)

对于每个请求,NGINX Plus选择具有最低平均延迟和最低活动连接数的服务器,其中最低平均延迟是根据包含least_time指令的下列参数计算的:

  • header:从服务器接收第一个字节的时间。
  • last_byte:从服务器接收完整响应的时间。
  • last_byte inflight:从服务器接收完整响应的时间。
1
2
3
4
5
upstream server {
least_time header;
server www.panchengming.com;
server www.panchengming2.com;
}

Random

  • 每个请求将被传递到随机选择的服务器,如果指定了两个参数,首先,NGINX根据服务器权重随机选择两个服务器,然后使用指定的方法选择其中一个。

  • least_conn:活动连接的最少数量。

  • least_time=header (NGINX Plus):从服务器接收响应标头的最短平均时间($upstream_header_time)

  • least_time=last_byte (NGINX Plus):从服务器接收完整响应的最短平均时间($upstream_response_time)

1
2
3
4
5
upstream server {
random two least_time=last_byte;
server www.panchengming.com;
server www.panchengming2.com;
}

fair(第三方)

  • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1
2
3
4
5
upstream backserver {
fair;
server 192.168.0.14;
server 192.168.0.15;
}

url_hash(第三方)

  • 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
1
2
3
4
5
6
7
upstream images6.static.com {
server 11.11.11.11:80;
server 11.11.21.12:80;
server 11.11.21.13:80;
server 11.11.21.14:80;
hash $request_uri;
}

weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

1
2
3
4
5
6
upstream tomcat {
ip_hash;
server 192.168.12.209:8081 weight=1;
server 192.168.12.209:8082 weight=2;
server 192.168.12.209:8083 weight=3;
}

配置文件实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
upstream tomcat {
ip_hash;
server 192.168.12.209:8081 weight=1;
server 192.168.12.209:8082 weight=2;
server 192.168.12.209:8083 weight=3;
}

server {
listen 80;
server_name project.lushan.com;
#charset koi8-r;
#access_log logs/host.access.log main;

location / {
index index.html index.htm;
proxy_pass http://tomcat;
proxy_cookie_path /project /;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3;
proxy_send_timeout 30;
proxy_read_timeout 30;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!