SpringBoot中使用Nginx实现反向代理及负载均衡

前提场景:

在上一篇文章:使用SpringBoot和KindEditor完成图片批量上传和回显 ,结尾提到Nginx实现反向代理,更适用于实际项目应用。 这一篇就来说一下,如果简单实现Nginx的反向代理,以及高并发场景中常用的负载均衡

当然Nginx作为一个优秀的Http服务器,能做的远不止于这些,还有动静分离、在线部署、健康监测等功能。这些功能用法以后有时间另起一篇来说。


一、下载

官网地址:http://nginx.org/en/download.html

SpringBoot中使用Nginx实现反向代理及负载均衡_第1张图片

选择对应的操作系统版本下载,解压到本地。


二、启用Nginx

这里我使用的是Windows版本的,注意以下几点:

  1. 解压/安装目录不要放在c盘,不要有中文路径
  2. Nginx启动会占用80端口,注意端口冲突
  3. Nginx只能启动一次,如果多次启动,会破坏第一次正常启动的Nginx,任务管理器中查看Nginx启用情况
  4. 第一次使用右键->超级管理员身份运行,目的获取权限
  5. 每次启动Nginx都会启动两个线程,守护线程:防止主进程意外关闭(占用内存比较小);主线程:nginx主要服务项(占用内存比较大)。所以如果手动关闭,需要先关守护线程再关主线程。

SpringBoot中使用Nginx实现反向代理及负载均衡_第2张图片

Nginx命令(在安装根目录使用cmd窗口运行): 

  1. 启动  start nginx;
  2. 关闭  nginx -s stop;
  3. 重启  nginx -s reload;(先启动才能重启)

启动成功后,可以在浏览器输入localhost:80检查,页面响应如下表示启动成功:

SpringBoot中使用Nginx实现反向代理及负载均衡_第3张图片


三、配置反向代理

1. 首先找到配置文件:/conf/nginx.conf,添加图片服务器代理。其中server_name对应的是浏览器访问的虚拟路径,root对应的是本地文件夹路径,保存后记得用命令重启Nginx。

#1.图片服务器
	server {
		listen 80;  #监听端口号80
		server_name image.demo.com; #虚拟访问域名

		location / {
			root  D:/demo/upload-demo/src/main/webapp/image/;  #本地文件路径
		}
	}
SpringBoot中使用Nginx实现反向代理及负载均衡_第4张图片 图片文件夹路径

 

2. 由于域名image.demo.com我们没有购买,所以需要修改本地的hosts文件,文件路径:C:\Windows\System32\drivers\etc。添加一行配置:127.0.0.1   image.demo.com,表示域名于IP之间的映射关系。

SpringBoot中使用Nginx实现反向代理及负载均衡_第5张图片

3. 接下来在浏览器中输入域名+日期路径+文件名:http://image.demo.com/2019/08/05/7403d70814b94380abb449e0233af8b3.jpg 就可以访问到我们本地的图片文件,但是文件路径已经改为虚拟的域名。

SpringBoot中使用Nginx实现反向代理及负载均衡_第6张图片

 


四、负载均衡

1. 负载均衡说明:意思就是将任务平均(或者按权重)分配到多个服务器上,从而提高服务器的吞吐量,稳定性以及并发处理能力。目前比较常用的模式是:Nginx代理服务器搭配多台Tomcat服务器,利用负载均衡策略实现tomcat集群的部署。

SpringBoot中使用Nginx实现反向代理及负载均衡_第7张图片

 

2. 打包项目:首先在项目配置文件application.yml中将项目端口号改为8081,然后在Controller类中写一个getMsg方法:

@RequestMapping("/getMsg")
	@ResponseBody
	//获取当前服务器端口号
	public String getMsg() {
		return "我是8081服务器";
	}

 然后將项目打成war包或jar包,打包完成后将其复制到新的文件路径 D:\software\tomcat 下重命名为8081.war:

SpringBoot中使用Nginx实现反向代理及负载均衡_第8张图片

重复上面步骤,分别修改端口号为8082、8083,修改Controller方法返回值后打包并重命名。

3. 启动服务器:我使用的是SpringBoot框架,内置了Tomcat服务器,所以只需要使用cmd窗口命令执行:java -jar 8081.war 就可以启动服务器。如果其他框架的,可以将war/jar包部署到第三方tomcat服务器中,保存到webapp文件夹中即可。

SpringBoot中使用Nginx实现反向代理及负载均衡_第9张图片

分别启动多台tomcat服务器,之后测试网站访问, 页面显示如下即表示启动部署成功。

SpringBoot中使用Nginx实现反向代理及负载均衡_第10张图片

注意:关闭tomcat服务器要在命令窗口ctrl + c,不要直接关闭命令窗口,容易有关闭不成功造成端口冲突。

4. nginx.conf的配置文件中添加Tomcat集群映射:

    server {
		listen 80;  #监听端口号80
		server_name image.demo.com; #虚拟访问域名

		location / {
			#root  D:/demo/upload-demo/src/main/webapp/image/;  #本地文件路径
			proxy_pass 	 http://imageWindows; #映射Tomcat集群
		}
	}

	#准备tomcat_windows 集群 默认:轮询策略
	upstream imageWindows{
		server localhost:8081;
		server localhost:8082;
		server localhost:8083;
	}

配置完成后重启Nginx,此时在浏览器中多次访问域名:image.demo.com,可以发现Nginx将任务按顺序,轮询分配给三台Tomcat服务器做处理,至此,配置成功。

5. 权重策略

实际项目中,可能不同物理机性能不同,根据物理机情况,人为规定访问顺序,按照权重方式进行访问,让性能好的物理机多处理任务,这种方式就称为权重策略。在upstream的server后分别添加weight关键字,表示标识权重比。下面表示10次访问中,8081服务器会分配到5次任务,8082分到3次,8083分到2次.

#准备tomcat_windows 集群 权重策略
	upstream imageWindows{
		server localhost:8081 weight=5;
		server localhost:8082 weight=3;
		server localhost:8083 weight=2;
	}

6. ip_hash策略

根据用户的IP地址进行hash运算之后将值与tomcat服务器进行绑定,这样可以解决服务端session数据共享问题。

#准备tomcat_windows 集群
	upstream imageWindows{
        ip_hash; #启动ip_hash策略
		server localhost:8081 weight=5;
		server localhost:8082 weight=3;
		server localhost:8083 weight=2;
	}

 ip_hash的缺点:

  • 可能会导致负载不均现象
  • 如果某台tomcat服务器宕机,则可能影响用户的使用

实际项目中,我们可以使用单点登录(SingleSignOn,SSO)实现用户信息共享。


五、简单演示(demo)

如果你现在的项目并没有用到集群,而你只是想简单的demo一下Nginx的负载均衡,不想又为此创建一个项目再打包部署发布,那么你可以用以下方式代替上面的第2,3步:

1. 将多个Tomcat解压到同一个目录中,修改不同名字:

SpringBoot中使用Nginx实现反向代理及负载均衡_第11张图片

2. 分别修改 server.xml 配置文件中的端口号为:8081、8082、8083。index.jsp中修改title标签:

SpringBoot中使用Nginx实现反向代理及负载均衡_第12张图片

SpringBoot中使用Nginx实现反向代理及负载均衡_第13张图片

3. 启动Tomcat

在bin目录中运行startup.bat启动三台Tomcat,启动成功后在浏览器中访问 image.demo.com 出现如下页面表示配置成功。

SpringBoot中使用Nginx实现反向代理及负载均衡_第14张图片


六、Nginx其他属性用法

1. down和backup属性

  • down:标识故障机,如果后台监控发现其中某台服务器发生宕机现象,则可以修改nginx的配制文件,将宕机的服务器改为down,这样nginx就不会再次访问该故障机。
  • backup:备用机机制,正常情况下该服务器不会为用户提供服务.当服务器遇忙或者全部服务器宕机时,备用机才会生效。

#准备tomcat_windows 集群
	upstream imageWindows{
		server localhost:8081 down;
		server localhost:8082;
		server localhost:8083 backup;
	}

   使用上面配置,现在访问页面,只有8082服务器会工作。手动 Ctrl + C 关闭8082服务器,再次访问页面,8083服务器接管开始工作。再次开启8082服务器,访问页面可以看到,现在又回到8082工作。

2. max_fails和fail_timeout属性

  • max_fails=1  访问服务器最大的失败次数1次,之后nginx不会再次访问故障机。
  • fail_timeout=60s  如果服务器访问不成功,则在60秒内,不会再次访问故障机.直到下一个周期。
#准备tomcat_windows 集群
	upstream imageWindows{
		server localhost:8081 max_fails=1 fail_timeout=60s;
		server localhost:8082 max_fails=1 fail_timeout=60s;
		server localhost:8083 max_fails=1 fail_timeout=60s;
	}

3. 定义超时时间 2S

    server {
		listen 80;  #监听端口号80
		server_name image.demo.com; #虚拟访问域名

		location / {
			#root  D:/demo/upload-demo/src/main/webapp/image/;  #本地文件路径
			proxy_pass 	 http://imageWindows;
			proxy_connect_timeout       2;   #服务器链接超时时间
			proxy_read_timeout          2;   #读取服务器资源超时时间
			proxy_send_timeout          2;   #向服务器发送资源的超时时间
		}
	}

七、总结

反向代理和负载均衡是Nginx的强项,工作中使用的比较多。但是Nginx作为一个http服务器,其处理静态页面,动静分离,以及开头所说到的功能都很出色。另外,在高并发分布式系统架构中,Nginx也占据了很重要的位置。所有多花点时间,将Nginx研究透彻还是很有必要的!

你可能感兴趣的:(SpringBoot中使用Nginx实现反向代理及负载均衡)