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

Posted 学无止境,一点一滴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+Tomcat实现动静分离和负载均衡相关的知识,希望对你有一定的参考价值。

一、什么是动静分离?

nginx动静分离简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是将动态请求和静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件放在独立的服务器上,独立出来用域名访问,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起部署,通过Nginx来分开。

二、为什么要动静分离?

Tomcat是一个比较全面的web容器,对静态网页的处理,应该是比较费资源的,特别是每次都要从磁盘读取静态页面,然后返回。这中间会消耗Tomcat的资源,可能会使那些动态页面解析性能受到影响。将静态资源和动态资源隔离开、能够有效的减轻Tomcat服务器的压力,提升网站整体性能。

三、动静分离的实现

查看系统、Nginx、Tomcat的版本号

cat /etc/redhat-release

rpm -qa |grep nginx

/usr/local/tomcat8-1/bin/version.sh

开始配置Nginx,这里Nginx我是用yum安装的,安装可以见另一篇博客https://www.cnblogs.com/opsprobe/p/10773582.html

通过在server段代码配置不同的location实现动静分离

vim /etc/nginx/conf.d/default.conf

写入以下配置

    location ~.*\\.(html|htm|css|js|gif|jpg|jpeg|bmp|png|ico|txt|eot|svg|ttf|woff|woff2)$ {
        root   /usr/local/tomcat8-1/webapps/;
        expires 30d;
    }

    location ~.*$ {
        proxy_pass http://tomcat;
    }

配置截图如下:

如果想把新的配置单独写出来也是可以的,比如,新建一个文件 vim /etc/nginx/conf.d/tomcat,将配置写入,在 /etc/nginx/conf.d/default.conf 用include引入,include /etc/nginx/conf.d/tomcat;

以截图中的行数对配置做简单的说明:

第8行,匹配项目中用到的所有静态文件后缀,这些静态文件Nginx直接处理,波浪线~表示匹配。

第9行,root,静态文件Nginx直接从本地磁盘读,然后响应给客户端。

第10行,index  index.html index.htm; 代表默认主页。

第11行,expires,定义用户浏览器缓存时间30天,静态页面不经常更新的话可以节省带宽缓解服务器压力,第一次访问下载新文件状态为200,以后直接访问本地缓存状态为304,直到受访问文件发生变化或者时间到期。

第14行,匹配其他请求,用来转发动态请求到后端应用服务器Tomcat。

第15行,proxy_pass,代表后端服务器组名,此组名必须为后端服务器站点组名,后面upstream{}模块处会有配置

 

server{};  server模块是接收外部请求的部分,配置文件里可以写多个server{}块,每个server{}块代表一个Web站点。

server_name;  代表外网访问域名。

location / {};  代表一个过滤器,用于制定不同请求的不同操作。

upstream{} 模块

负载均衡功能是将接收到的请求分配到后端的多台服务器上,Nginx里需要 upstream{} 模块来配合使用

打开另一个配置文件,vim /etc/nginx/nginx.conf(注意:不是 /etc/nginx/conf.d/default.conf 配置文件)

先修改nginx运行默认的用户

第一行 user nginx; 改为 user root;

再写入以下配置:

    upstream tomcat {
        ip_hash;
        server 127.0.0.1:8080 weight=1;
        server 127.0.0.1:8081 weight=1;
    }

配置截图如下:

第32行,upstream xxx{}; upstream模块是命名一个后端服务器组,组名自定义,我这里为“tomcat”,内部可以写多台服务器ip和port,还可以设置跳转规则及权重等等。

第33行,ip_hash,代表使用ip地址方式分配跳转后端服务器,同一ip请求每次都会访问同一台后端服务器,这样每个访客固定访问一个后端服务器,可以解决session的问题,一般用于登录会话。

第34、35行,server,代表后端Tomcat服务器地址和端口,这里Nginx的Tomcat在一台机器上,所以地址为127.0.0.1;weight,指定轮询权重,权重越高,处理的请求就越多,weight和访问比率成正比,用于后端服务器性能不均的情况。

注意:server_name 和 upstream{} 的组名可以不一致,server_name 是外网访问接收请求的域名,upstream{} 的组名是跳转后端服务器时站点访问的域名。

配置完毕后,重启Nginx,让其生效

systemctl restart nginx

部署项目进行测试动静是否分离

将打成war包的项目上传到tomcat的webapps目录下

启动Tomcat,在浏览器通过Nginx访问项目,Nginx的默认端口为80,Tomcat的默认端口为8080

Ctrl+F5刷新页面,查看Nginx和Tomcat的日志

查看Nginx的日志:

tail -n 0 -f /var/log/nginx/access.log

查看Tomcat的日志:

tail -n 0 -f /usr/local/tomcat8-1/logs/localhost_access_log.2019-12-01.txt

可以看到静态请求和动态请求成功分离了

四、负载均衡

确保项目可以正常访问后,复制tomcat8-1,重命名为tomcat8-2,注意:是将部署在tomcat8-1下的项目一起复制的

cp -a /usr/local/tomcat8-1/ /usr/local/tomcat8-2

# 更改tomcat8-2的两处端口,避免与tomcat8-1冲突

vim /usr/local/tomcat8-2/conf/server.xml

第一处:

第二处:

启动tomcat8-2

/usr/local/tomcat8-2/bin/startup.sh

注意:这里为了验证负载均衡效果,需要注释掉 /etc/nginx/nginx.conf 配置文件里的 ip_hash;一行

保存退出,重启Nginx

在浏览器访问项目

Ctrl+F5刷新页面,查看两个Tomcat的日志

用tail命令查看Tomcat的日志,可以看到两个Tomcat都会响应请求 

Nginx+Tomcat的负载功能就配置完成了,这只是简单设置了一下,生产环境中还有很多详细的调整,比如,反向代理,防盗链,压缩,缓存策略等等,后续再逐渐增加。


本文参考自:

(1)https://www.cnblogs.com/taiyonghai/p/6728707.html

(2)https://www.cnblogs.com/taiyonghai/p/5610112.html

(3)https://www.cnblogs.com/jiangyang/p/8485046.html

 

以上是关于Nginx+Tomcat实现动静分离和负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

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

Nginx+Tomcat负载均衡及动静分离

Nginx+Tomcat实现负载均衡动静分离集群部署

Linux运维web篇 nginx+tomcat实现动静分离和负载均衡

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

Nginx+Tomcat的负载均衡与动静分离集群