Nginx作为高性能服务器,除了搭建普通的web服务,也经常用作反向代理或微服务网关。

为了实现服务高可用,通常会启动多个服务实例,这样某个实例挂掉并不影响整体的可用性,Nginx可以在多个实例中实现负载均衡,并提供了多种负载均衡策略。
本人手头只有一台服务器,所以就在本机多端口开启多个实例,并在这些实例中实现负载均衡。
在http配置:
upstream backser {
server localhost:7100;
server localhost:7200;
server localhost:7300;
}
server {
listen 8000;
server_name backserver;
location / {
root html;
index index.html index.htm;
proxy_pass http://backser;
}
}
启动服务端:
# 启动三个Java实例
java -jar app.jar --server.port=7100
java -jar app.jar --server.port=7200
java -jar app.jar --server.port=7300
# 启动nginx
start nginx
默认情况Nginx会把请求轮流派发给各个实例,实现最简单的负载均衡。
这种轮询策略可以加入权重,进行负载微调和故障转移:
upstream backser {
server localhost:7100 weight=1 fail_timeout=3s max_fails=2;
server localhost:7200 weight=2 fail_timeout=3s max_fails=2;
server localhost:7300 weight=3 fail_timeout=3s max_fails=2;
}
另一种使用较多的是ip_hash策略,能将来自同一IP的客户端请求派发给同一个服务实例,在分布式环境中,可以解决session不共享的问题。
upstream backser {
server localhost:7100 fail_timeout=3s max_fails=2;
server localhost:7200 fail_timeout=3s max_fails=2;
server localhost:7300 fail_timeout=3s max_fails=2;
ip_hash;
}
加载修改后的配置:
nginx -s reload
然后同一个客户端请求会发现只有一个实例在响应。

本文介绍了如何利用Nginx作为反向代理,在一台服务器上通过多端口启动服务实例实现负载均衡。详细讲解了轮询和ip_hash两种负载均衡策略,轮询策略可通过权重调整和故障转移,而ip_hash策略则能保持同一IP请求始终由同一实例处理,解决session一致性问题。

被折叠的 条评论
为什么被折叠?



