在上一篇文章:使用SpringBoot和KindEditor完成图片批量上传和回显 ,结尾提到Nginx实现反向代理,更适用于实际项目应用。 这一篇就来说一下,如果简单实现Nginx的反向代理,以及高并发场景中常用的负载均衡。
当然Nginx作为一个优秀的Http服务器,能做的远不止于这些,还有动静分离、在线部署、健康监测等功能。这些功能用法以后有时间另起一篇来说。
官网地址:http://nginx.org/en/download.html
选择对应的操作系统版本下载,解压到本地。
这里我使用的是Windows版本的,注意以下几点:
启动成功后,可以在浏览器输入localhost:80检查,页面响应如下表示启动成功:
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/; #本地文件路径
}
}
2. 由于域名image.demo.com我们没有购买,所以需要修改本地的hosts文件,文件路径:C:\Windows\System32\drivers\etc。添加一行配置:127.0.0.1 image.demo.com,表示域名于IP之间的映射关系。
3. 接下来在浏览器中输入域名+日期路径+文件名:http://image.demo.com/2019/08/05/7403d70814b94380abb449e0233af8b3.jpg 就可以访问到我们本地的图片文件,但是文件路径已经改为虚拟的域名。
1. 负载均衡说明:意思就是将任务平均(或者按权重)分配到多个服务器上,从而提高服务器的吞吐量,稳定性以及并发处理能力。目前比较常用的模式是:Nginx代理服务器搭配多台Tomcat服务器,利用负载均衡策略实现tomcat集群的部署。
2. 打包项目:首先在项目配置文件application.yml中将项目端口号改为8081,然后在Controller类中写一个getMsg方法:
@RequestMapping("/getMsg")
@ResponseBody
//获取当前服务器端口号
public String getMsg() {
return "我是8081服务器";
}
然后將项目打成war包或jar包,打包完成后将其复制到新的文件路径 D:\software\tomcat 下重命名为8081.war:
重复上面步骤,分别修改端口号为8082、8083,修改Controller方法返回值后打包并重命名。
3. 启动服务器:我使用的是SpringBoot框架,内置了Tomcat服务器,所以只需要使用cmd窗口命令执行:java -jar 8081.war 就可以启动服务器。如果其他框架的,可以将war/jar包部署到第三方tomcat服务器中,保存到webapp文件夹中即可。
分别启动多台tomcat服务器,之后测试网站访问, 页面显示如下即表示启动部署成功。
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的缺点:
实际项目中,我们可以使用单点登录(SingleSignOn,SSO)实现用户信息共享。
如果你现在的项目并没有用到集群,而你只是想简单的demo一下Nginx的负载均衡,不想又为此创建一个项目再打包部署发布,那么你可以用以下方式代替上面的第2,3步:
1. 将多个Tomcat解压到同一个目录中,修改不同名字:
2. 分别修改 server.xml 配置文件中的端口号为:8081、8082、8083。index.jsp中修改title标签:
3. 启动Tomcat
在bin目录中运行startup.bat启动三台Tomcat,启动成功后在浏览器中访问 image.demo.com 出现如下页面表示配置成功。
1. down和backup属性
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属性
#准备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研究透彻还是很有必要的!