文章目录
一、原理解释:
(1)动静分离
为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。
(2)正向代理和反向代理
1、正向代理:
- 解释:也就是传说中的代理,他的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。
- 结论:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理翻墙去访问(用户知道要访问真正的服务器)
2、反向代理:
- 解释:例用户访问 http://www.example.com/readme ,但www.example.com上并不存在readme页面,他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户,但用户并不知情,这里所提到的 www.example.com 这个域名对应的服务器就设置了反向代理功能。
- 结论:反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容 原本就是它自己的一样。(用户不知道要访问真正的服务器)
Nginx 实现负载均衡就是通过反向代理来实现的
二、实验示例:
角色 | IP地址 |
---|---|
Nginx | 192.168.220.131 |
Tomcat01 | 192.168.220.136 |
Tomcat02 | 192.168.220.137 |
实验环境描述:
- Nginx服务器做负载均衡和动静分离,服务器 Tomcat01,Tomcat02 做集群;
- 客户发送请求,对于动态资源交给集群中的多台 Tomcat 处理,静态资源则由自己处理即可,这样,对于高并发的访问请求和提高网站的响应速度有极大的帮助。
(一)部署负载均衡(反向代理)
第一步:搭建 Nginx
搭建nginx,之前博客有详细介绍。
第二步:部署两台 Tomcat
(1)配置 JAVA 环境
1、安装 jdk
rpm -ivh jdk-8u201-linux-x64.rpm
安装后的位置在:/usr/java/
2、配置环境变量
vim /etc/profile,在文件末尾添加以下代码:
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
使环境变量生效:
source /etc/profile
3、使用 java -version 命令检查是否已安装成功
(2)安装和启动 Tomcat
1、解压缩包到指定路径,/usr/local/
tar zxvf apache-tomcat-9.0.16.tar.gz -C /usr/local/
2、解压完成后,生成 apache-tomcat-9.0.16 文件夹,改名为 Tomcat
mv apache-tomcat-9.0.16/ tomcat
3、为了方便控制 tomcat的开启和关闭,我们可以创建一个软连接
ln -s /usr/local/tomcat/bin/startup.sh /usr/bin/
ln -s /usr/local/tomcat/bin/shutdown.sh /usr/bin/
4、用 startup.sh 脚本开启tomcat
第三步:Tomcat 中创建测试页面
(1)创建目录
mkdir -p /web/webapp1
vim /web/webapp1/index.jsp
添加以下内容:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("Welcome to test site, http://www.test1.com");%>
</body>
</html>
(2)指定站点
目录:/usr/local/tomcat/conf
vim server.xml
添加以下代码:
<Context docBase="/web/webapp1" path="" reloadable="false">
</Context>
(3)回到 bin/ 目录下,再重新启动一下 Tomcat
./shutdown.sh
./startup.sh
(4)浏览器访问一下网页,检查是否成功
(5)第二台 Tomcat 部署和第一台一模一样,但是为了页面显示区别,在 /web/webapp1/index.jsp 文件中,稍作修改,将 test1 改为 test2
注意:在企业网中,群集中的 Tomcat 网站内容是一模一样的,客户无论访问到哪个Tomcat,提供的网站都是一致的。但是这边,为了展示实验效果,站点内容不一样,是为了区分在客户端能够看出是哪个Tomcat 提供了服务回应。
第四步:修改 Nginx 配置文件,添加服务器池
(1)文件位置:/usr/local/nginx/conf/nginx.conf
1、添加服务池:
upstream tomcat-server {
server 192.168.220.136:8080 weight=1;
server 192.168.220.137:8080 weight=1;
}
2、在 location 段,添加以下代码,意为调用服务池(协议,端口等等)
proxy_pass http://tomcat-server;
(2)重启 nginx 服务
killall -1 nginx
第五步:客户端测试
这个架构中,nginx 只作为代理服务器而存在,我们作为用户访问网页,根本就不知道后面是哪一台具体提供服务的服务器,只需要将请求发送给 nginx 代理服务器,由 nginx 代理服务器,调用后台的Tomcat 给用户提供回应。
在客户机浏览器上访问 nginx 代理服务器:
至此,我们可以看到,从代理服务器,可以直接访问到群集Tomcat提供的服务。
(二)部署动静分离
对 java 文件请求转发到 Tomcat 处理
第一步:编辑 nginx 服务器的配置文件 nginx.conf
1、将动态页面交给 Tomcat处理:
在 server 段加入一个location段,代码如下:
location ~.*.jsp$ {
proxy_pass http://tomcat-server;
proxy_set_header Host $host;
}
同时需要注释掉另外一个 location 段中的:
# proxy_pass http://tomcat-server;
3、创建静态页面:
vim /usr/local/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>静态页面</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>静态页面</h1>
<p>这是一个静态页面</p>
</body>
4、为了展示效果,我们可以放两张图片进去(图片可以通过远程挂载的方式)
先创建目录名称,注意目录名称需要和 java 项目名称相同
1、创建目录:mkdir /usr/local/nginx/html/test
2、复制图片:cp lufei.jpg mingren.jpg /usr/local/nginx/html/test
第二步:配置 Tomcat,创建动态页面
(1)创建一个站点
mkdir /usr/local/tomcat/webapps/test
(2)创建动态网页,编辑
vim /usr/local/tomcat/webapps/test/index.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>动态页面</title>
</head>
<body>
<div>动态页面</div><br><img src="lufei.jpg"> //添加页面图片
</body>
</html>
(3)第二台 tomcat 配置和第一台一样,同样,为了体现实验效果,我在第二台 tomcat上添加一张和第一台不同的图片,但是,现实中群集中 tomcat 的网页内容都是一样的。
vim /usr/local/tomcat/webapps/test/index.jsp
<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>动态页面</title>
</head>
<body>
<div>动态页面</div><br><img src="mingren.jpg"> //添加页面图片
</body>
</html>
(4)这里 tomcat 的作用就是指路径,nginx 的作用是存放图片,以上这两张照片都不是存放在 tomcat中的。
第三步:客户端测试
部署好动静分离和负载均衡后的 Nginx ,不仅是作为代理服务器存在了,其自身也是要处理静态资源请求的,同时将动态资源请求转发给集群的多台 tomcat 处理,同时实现 动静分离 + 负载均衡。
(1)客户端浏览器访问 Nginx 服务器(http://192.168.220.131/)
由于这个请求是静态资源,所有直接由 nginx 自身处理。
(2)浏览器访问 http://192.168.220.131/test/index.jsp
由于这个请求是以 .jsp 为结尾的,是一个动态资源请求,所以是由 Nginx 转发给群集的tomcat处理,本群集中只有两台 tomcat 服务器,两台都提供了回应,即实现了负载均衡。