nginx使用upstream做负载均衡

打开nginx.conf,在http节点里添加:
upstream boot {
    server 127.0.0.1:8888 weight=1; #weight是权重的意思,权重越大,分配的概率越大
    server 127.0.0.1:8080 weight=1;
}
server {
   listen  80;
	server_name  dis;
	location / {
		proxy_pass http://boot;
	}
}

在hosts中添加:

127.0.0.1   dis
  • 然后访问 http://dis/ 会轮询访问 127.0.0.1:8888和127.0.0.1:8080
  • hosts在Windows下所在位置 C:\Windows\System32\drivers\etc

  • 为了不破坏 nginx.conf 可以新建一个 *.conf 文件
  • 这里我新建一个reverse-springboot.conf文件
  • reverse-springboot.conf配置如下,跟上面配置的一模一样
upstream boot {
    server 127.0.0.1:8888 weight=1; #weight是权重的意思,权重越大,分配的概率越大
    server 127.0.0.1:8080 weight=1;
}
server {
   listen  80;
	server_name  dis;
	location / {
		proxy_pass http://boot;
	}
}

然后在 nginx.conf 文件 http模块中将 reverse-springboot.conf 包含进去

http {
    ....
    include D:/nginx/conf/reverse-springboot.conf;
    ...
}

重启Nginx也能达到同样效果

ip_hash

上面的方式有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。(使用redis做session共享不存在此问题),貌似不可以加权重

获取服务端端口号注意点

获取项目服务端的端口号使用:request.getLocalPort()
nginx代理端口号是用:request.getServerPort(),但nginx中需要配置proxy_set_header Host $host:$server_port;

最终配置

upstream boot {
    server 127.0.0.1:8888 weight=1;
    server 127.0.0.1:8080 weight=1;
}
server {
   listen  8066;
	server_name  dis;
	location / {
		proxy_pass http://boot;
		proxy_set_header Host $host:$server_port;
		# 获取真实IP 
		proxy_set_header X-Real-IP $remote_addr;
		# 获取代理者的真实ip 
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}
}

posted @ 2025-04-09 11:51  程序员の奇妙冒险  阅读(23)  评论(0)    收藏  举报