首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx+Tomcat 动静分离实现负载均衡

Nginx+Tomcat 动静分离实现负载均衡

作者头像
木禾wen
修改2019-11-20 17:25:03
4860
修改2019-11-20 17:25:03
举报
文章被收录于专栏:信息化运维信息化运维

0.前期准备

用Debian环境。安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等。

1.一份Nginx.conf配置文件

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

基本配置这个文件,即可以实现负载了。但是里面的各种关系要理解就比较麻烦了。这篇博客,也不是教学篇,是记录一下,方便以后自己看了。

2.基础讲解

现在假使有一台电脑192.168.8.203这台电脑,上面部署了Tomcat,里面8080端口有J2EE的服务,通过浏览器可以正常浏览网页。现在有一个问题tomcat是一个比较全面的web容器,对静态网页的解决,应该是比较费资源的,特别是每次都要从磁盘读取静态页面,而后返回。

这中间会消耗Tomcat的资源,可能会使那些动态页面解析性能影响。秉承Linux哲学,一个软件只做一件事的准则。Tomcat就应该只解决JSP动态页面。这里就使用到以前理解的Nginx来进行反向代理商。第一步代理商,实现动静网页分离。这个很简单的。

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

修改nginx的配置文件 /etc/nginx/nginx.conf 默认有个配置文件的。其实大部分都差不多,关键还是server段的设置。这里我设置server段如上所示,其余段复制即可以了。

server段里面的解释如下:第35行为监听本机80端口。37-39行表示默认主页,这里的默认主页我是index.jsp 对应到我项目中是一个index。 这里根据需要可以改为

indexindex.jspindex.htmlindex.htmindex.php

具体可参考其余文章。 关键的第40行,这个是正则匹配,网上也有很多详情。这里匹配我项目中使用到的所有静态网页后缀。第41行是代理商地址。这里我代理商到我的web应使用中。expires 30d缓存为30天,这里的缓存是对应到前台页面,使用户的Cache-Control字段

第44行中那个正则是匹配无后缀的页面。我项目中jsp页面是无后缀的。这里可以根据需要进行修改。同样代理商到192.168.8.203:8080这里。到这里你可能会问,这有毛意思啊?当然不是这样了。简单的实现静动分离,我们可以把第41行进行修改,改为

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

root /var/lib/tomcat7/webapps/JieLiERP/WEB-INF

表示不代理商,直接从本地磁盘拿。通过查tomcat日志可以看到静态页面是没有访问到的。但这样又有一个问题。

这样的灵活性不好,对下面要讲到的内存缓存和集群部署来说都是不友好的,所以又有了下面的这种写法。再写一个server段。

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

这次监听808端口,而后上上面的代码41行即可以修改为 proxy_pass http://192.168.8.203:808了,到这里就实现了动静分离了。假如多台服务器,就修改对应的ip即可以了。假如发现连接不上的,要检查一下防火墙,权限等外部问题,这个配置是这样的。

假如单纯这样的话,我们会发现页面直接传输过于占使用带宽。对应web的优化,这里想到的是通过对页面进行gzip压缩,而后传到使用户那里,再解压,这样可以有效的减少带宽。这里就会使用到Nginx 的gzip板块了。默认的Nginx是集成有gzip板块的。只要在http段添加下面配置就可。

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

给个首页看看效果

不要在意请求数不一样,那两个请求是谷歌插件来的。不使用觉得我在骗你。

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

作为假使有很多人访问的网站来说,缓存一定是很重要的东西了。

一开始是想通过插件,让Nginx和Redis进行合成,而后Nginx用Redis来缓存的,但是发现配置起来很麻烦,还要自己下载插件,重新编译Nginx,比较麻烦,所以这里觉得使用Nginx自带的缓存也是不错的选择。

尽管效率比不上redis,但是有还是比没有好。Nginx默认的缓存是磁盘文件系统的缓存,而不是像Redis那样的内存级别的缓存。一开始我以为Nginx就只有这样。后来查了写资料,才知道是我太天真了,对Linux不是很理解导致的。Linux的一切皆文件。

原来我们可以把文件缓存到内存对应的Linux文件系统中。我说的可能比较难以了解,请自行搜索/dev/shm 这个文件目录。我们把文件缓存到这个文件目录里,其实就相当与内存的缓存了。只不过还是靠文件系统管理。所以比不上自己设置格式的Redis那样的内存缓存。

在http段进行基本配置

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

经过这两个的配置就基本能实现了,这里说几个注意项,也是困扰我很久的问题。上面第一段代码第6行,proxy_ignore_headers 假如web项目中的html的head头里面指定

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

这些不缓存的话,就要加上proxy_ignore_headers的配置项了。还有一点就是/dev/shm下面的文件系统权限默认只给root使用户,所以要chmod 777 -R /dev/shm 这样不是很安全的做法,假如实际上线可以给定某个使用户组,关于使用户组的设置是配置的第一行

userwww www;

上面第二段代码的第6行是添加一个header字段方便查看能否击中缓存。

我们rm -rf /dev/shm/JieLiERP/proxy_* 下面的所有文件(注意这里假如是进行屡次测试的话要nginx -s reload 重新读取配置或者重启服务,由于你rm -rf只是删除了缓存文件,但是缓存的结构信息还在nginx进程里面,结构还在,假如不重启的话,是会出现访问不到的)

所以要记得重启哦。下面是运行效果

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

第一次访问

第二次访问,在浏览器中Ctrl+Shift+R 强制刷新

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

到这里即可以看到效果了。我们查看一下/dev/shm这个里面

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

到这里已经快结束了。最后也是比较关键的一个技术点,就是集群,集群,集群。这个就要使用到upstream了,看到最开头的配置文件了吗,就是那个

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

上面那个就是集群组了。upstream是关键字,static 和 dynamic是两个服务器集群组的名称。以第一个为例,server 127.0.0.1:808 是服务器地址,后面的weight=1 是权重。有多个就写多个。

亲测试过,集群中的一个坏了,不影响系统运行。至于更多的轮询规则,可以参考网上更多的资料。这里不多说。至于怎样用呢? proxy_pass

http://192.168.8.203:808 改为 proxy_pass http://static; 这样就可实现均衡。

到这里就结束了。

把上面各个部分根据自己需求配置起来即可以实现单机房负载均衡了。 上面这种做法有一个缺点就是在前面的那一台nginx假如当机,后面所以机器就失去了被访问的能力了,所以需要在前面实现多个nginx多机房的负载。关于这个就是另外一个话题了。目前还没有研究。以后有机会再说了。

上面动态服务器组假如是那种需要保存使用户状态的话,会有问题,就是session问题,比方我在server1进行登录后,下一次动态服务器组进行轮询后可能分配到server2,就会造成要重新登录。

治标的办法是,配置轮询规则,根据使用户请求的IP进行Hash,而后分配对应的服务器。具体配置如下:

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

这样即可以实现一个使用户对应一个服务器节点。这样就不会有重复登录的问题。另一种治本的办法是,利使用缓存系统进行session的统一存储管理。具体的做法我还没有实验过,参考资料有相关的文章,可以理解一下。

Nginx添加SSL功能,同样的Nginx默认是有SSL板块功能,我们不使用额外安装,只要要简单的配置即可以了。首先我们先来生成少量必要的证书。制作的过程还是比较简单的。

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

下面就是配置Nginx了,我们可以把需要使用到的client.pem, client.pem, client.key,unsecure这三个文件放到Nginx的一个目录下,剩下的Nginx配置如下:

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

重启Nginx,我们即可以访问Https网站了。 但是他喵的出现这个

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

这个是没有什么问题,具体起因是这个CA证书要得到认可。所以我们上面自己生成的https证书,只是自己生成的,假如要变成下面这种,就需要花钱购买了,剩下的这个自己上网处理。

(尽管自己生成的证书可以使用,但是还是抵挡不了DNS欺骗,所以这种不安全证书,跟没有其实是一样的。不过据说这样可以阻止经营商劫持。)

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

添加一个,就是在我们输入http连接时自动跳转到安全的https连接。这个还是比较实使用的。方法还是有多种的,具体可以看参考资料里面的博客。我是用下面这一种,我觉得是比较简单的,代码改动比较少的。就是对80端口进行代理商转发。

Nginx+Tomcat 动静分离实现负载均衡
Nginx+Tomcat 动静分离实现负载均衡

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档