程序=指令+数据
程序=算法+数据结构
编程方式:
以算法为中心,数据结构服务于算法:过程式编程
以数据为中心,代码服务于数据:对象式编程
对象:属性,方法
类别:实例化--对象,对象互操作
过程式编程:C ,bash , Python
对象式编程:Java , C++ ,kotlin,Ruby ,Pthon,.....
###################################################################3333
nginx反代动态到Tomcat
tomcat是纯Java代码实现的
tomcat每一个组件都是由”类“实现的,因为java是面向对象的语言
一个server相当于一个tomcat组件
tomcat要作为server运行是一个c/s架构
connector:连接器,专门用来监听套接字也就是端口号,用来接收用户请求
engine 引擎,engine只提供了容器环境,能运行jsp代码,不能接收用户的请求
用户发请求到connector,connector接收到用户的请求分析请求,然后发送给engine引擎,engine加载好要用的页面,在发送给connector,然后connector在发送给用户
connector连接器不能直接和engine引擎产生关联关系,
而且一个connector连接器只能属于一个engine引擎
而一个engine引擎可以拥有多个connector连接器
我们可以用一个办法将connector连接器和engine引擎建立起连接
一个service内可以有多个引擎,但是一个connector连接器只能属于一个engine引擎,同时一个engine引擎可以拥有多个connector连接器,于是一个service内的engine到底和哪个connector有关系,就是通过service定义的
所有的jsp代码只能放在engine引擎中
而一个engine引擎就代表了一个httpd服务实例,当然我们这儿是tomcat,我们只是一个类比,而一个httpd里面可以有多个虚拟主机,我们这儿的虚拟主机不是定义在service,而是定义在nginx,在nginx可以定义一到多个host,一个host代表一个虚拟主机。而一个host可以有多个context
context兼具能定义路径别名的作用,同时还肩负了为站点定义站点属性的功能
一个context是一个应用程序
################################################################333
要想所有tomcat要安装jdk
jdk有两种安装方法
Oracle jdk 安装方法
openjdk 安装方法
1.6
1.7
1.8
tomcat 安装
ASF:tomcat 安装方法
os :vendor:tomcat ,系统提供的rpm包
安装openjdk
查看java 的openjdk的支持版本
yum list all java*
安装jdk包支持开发
yum install java-1.8.0-openjdk-devel -y
查看版本
java -version
用yum 安装tomcat
yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp -y
启动服务
systemctl start tomcat
浏览器测试
配置文件目录
/etc/tomcat/
查找类库文件
ls -ld /usr/share/tomcat/lib
####################################################################
安装Oracle jdk
安装下载的包
rpm -ivh jdk-8u144-linux-x64.rpm
oracle jdk的目录
ls /usr/java/jdk1.8.0_144/
声明变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest/
export PATH=$JAVA_HOME/bin:$PATH
重读
[root@zhouyafei ~]# exec bash
查看
[root@zhouyafei ~]# echo $JAVA_HOME
/usr/java/latest/
查看版本
java -version
用tar安装tomcat
下载tomcat安装包
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
解压到 /usr/local
tar xf apache-tomcat-8.5.32.tar.gz -C /usr/local/
将8.5.3版本链接到tomcat,建议不要改名字,方便以后升级
ln -sv apache-tomcat-8.5.32 tomcat
查看
ls /usr/local/tomcat/
创建用户
useradd tomcat
更改tomcat目录的属组
chown -R :tomcat /usr/local/tomcat/
在tomcat目录下temp和logs,work目录,必须用普通用户可读可写
chown -R tomcat logs/ temp/ work/
给conf目录属组加读执行权限
chmod g+rx /usr/local/tomcat/conf/
给conf目录下的所有属组文件读权限
chmod g+r /usr/local/tomcat/conf/*
su - tomcat 切换到tomcat用户
查看启动目录
cd /usr/local/tomcat/bin/
su - root 切换到root用户
声明变量
vim /etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH #导出PATH环境变量是$CATAINA_BASE/bin并补上PATH自身
执行脚本
su - tomcat 切换到tomcat用户
. /etc/profile.d/tomcat.sh
启动服务
catalina.sh start
查看端口
8009和8080
浏览器测试
注: catalina.sh 停止服务
/usr/local/tomcat/目录的结构
bin:脚本,启动时用到的类
conf:配置文件目录
lib:库文件,tomcat的类库
其中jiasper.jar:这个文件是将jsp文件转为servlet的Java代码
logs:日志文件路径
Catalina开头的日志是,tomcat自身的应用程序日志
其他名称,以数字结尾的日志是特定虚拟主机放的访问日志
temp :临时目录
用来创建保存临时文件
webapps:外部应用程序,也是网页文档的根目录
ROOT:别名,URL的根,用来存放应用程序文件的主站
dosc:文档,读这个目录可以知道tomcat怎么维护,用那些特性,如何去配置集群
examples: 示例,读这个目录可以知道jsp文件怎么写
host-manager :主机管理器或者叫虚拟主机管理器
manager:应用程序管理器
work:工作目录,用来存放编译好的文件
index:代表index.jsp文件
这个index.jsp会先被转为纯Java代码index_jsp.java
而java文件要被编译后惨运行叫类文件index_jsp.class
work/
└── Catalina
└── localhost 虚拟主机
├── docs
├── examples
├── host-manager
├── manager
└── ROOT
└── org
└── apache
└── jsp
├── index_jsp.class 类文件
└── index_jsp.java 源码文件
####################################################################333333
以 rpm包为实例
server.xml 定义自身server是这么运行的
应用程序的属性信息
web.xml: 定义应用程序该怎么部署
每个webapp只有部署后才能访问,存放的位置是WEB-INF,如果没有web.xml目录,可以 到全局webapps提供默认部署相关的配置
context.xml:定义了context背后的一些信息
我们可以通过开发人员,拿到一个应用程序
解压
unzip javaee-bbs-1.3.zip
进入到解压的应用程序的WebRoot目录
cd javaee-1.3/bbs/WebRoot/
可以看见一个WEB-INF目录
ls WEB-INF/
在 WEB-INF/目录下有一个web.xml文件,它描述了当前应用程序该如何被类装在机所装载,就是说该如何部署,如果没有web.xml文件,我们可以去etc下ls /etc/tomcat/web.xml 默认的web.xml文件配置
tomcat-users.xml:用户认证的账号和密码文件;角色(role),用户(User);此文件在tomcat启动时被装入内存;
context.xml:每个webapp都可以使用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
logging.properties:日志系统相关的配置;
tomcat.conf 或 /etc/sysconfig/tomcat: 定义tomcat相关java进程的资源配置等信息
tomcat配置文件
主配置文件vim /etc/tomcat/server.xml
Tomcat的核心组件:server.xml 定义自身server是这么运行的
...
...
...
...
每一个组件都由一个java“类”实现,这些组件大体可以分为以下几个类型
顶级组件:server:代表一个运行的tomcat实例;
服务类组件:service:
连接器组件:http,https,ajp(apache,jserv,protocol)
容器类组件:Engine,host,context
被嵌套类组件:valve过滤器,过滤条件。logger日志记录器,realm,loader类加载器,manager会话管理器
集群类组件:listener,cluster
jsp的webapp的组织结构
/根,web应用程序的根
ls /root/javaee-1.3/bbs/WebRoot/ web应用程序的根
主页:index.do java后缀名有两个.jsp和.do
classes:存放自己的类文件
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
静态内容
ls /root/javaee-1.3/bbs/WebRoot/static/image/
在tomcat有.jsp和.do的动态内容,tomcat也直接提供静态,显然这不是tomcat擅长地方,因此我们应该在单个主机上组织出一个n ,t,t处理静态内容,n处理动态内容
将来我们要接手一个企业及站点应用程序会非常大,我们从被人手里面提供ssh传文件会非常慢,我们可以归档打包
webapp的归档格式
.war:如果我们从程序员拿到的.war文件,我们不用展开,直接放到对应的网页根目录下,会自动展开
.ear:企业及webapp
.jar:类库文件
.rar:资源适配器类打包文件
如果我们tomcat应用程序想让别人通过BS架构访问,我们应该把.war文件放在某一个虚拟主机
**********************************************************************************************88
部署:就相当于把一个应用程序放在可运行的环境中运行起来
tomcat部署的操作
deploy:部署,把一个应用程序及应用程序所依赖到的类文件,根据web.xml和context.xml文件中的定义class加载至,有类加载器loader加载至JVM之上
部署的方式有两种
自动部署:auto deploy 默认自动部署,只要放到网页的根目录下面就能访问到
手动部署:手动部署分为两种
冷部署:把tomcat停止,在部署
热部署:在不停止tomcat的前提下部署
热部署工具:manager ant脚本,tcp(tomcat client deployer)等
undeploy:拆除,反部署。反部署之后的应用程序只能重新部署才能访问
start:启动
stop:停止
redeploy:重新部署
************************************************************************************************************88
我们手动的通过一测试类应用,并冷部署
创建一个目录路径,里面放一个测试页面
mkdir test/{classes,lib,WEB-INF,META-INF} -pv
自己写一个网站,测试应用程序
vi test/index.jsp
<%@ page language="java" %> #编程语言是java
<%@ page import="java.util.*" %> #导入java的某一个类库 ,前面两行是页面资源代码格式的信息
<% out.println("hello world");
%>
热部署
直接将创建test目录放到网站目录下
cp -r test/ /usr/share/tomcat/webapps/
默认启动
**********************************************************************************************************8
在工作中当开发写完代码,都放在Gitilab ,gogs 私有的库中,我们可以拷贝下来要用的代码
例如:在http://gitlab.ilinux.io下面有一个test.git的项目,我们可以在这下面拷贝
git clone https://glthub.com/test.git
**********************************************************************************************************************
在真实的场景中,我们拷贝的代码是有版本的 例:text-1.1
我们将 text-1.1的代码拷贝到webapp应用程序目录
cp -r test-1.1/ /usr/share/tomcat/webapps/
在应用程序中是不需要版本号的,我们可以创建一个链接,链接到test
cd /usr/share/tomcat/webapps/ 切换到webapps应用程序目录
ln -sv test-1.1 test 创建软链接
如果要随机版本
我们将新的版本拷贝到webapps目录
cp -r test-1.2/ /usr/share/tomcat/webapps/
删除软链接
rm -rf test
创建软链接到新版本
ln -sv test-1.2 test
#########################################################################
tomcat的两个管理应用:
manager:管理应用,可以部署,反部署,停止,启动。图形界面
host-manager:管理虚拟主机
请注意,对于Tomcat 7以上,使用管理器应用程序所需的角色已从单个管理器角色更改为以下四个角色。您需要分配您希望访问的功能所需的角色。
l manager-gui - 允许访问HTML GUI和状态页面
l manager-script - 允许访问文本界面和状态页面
l manager-jmx - 允许访问JMX代理和状态页面
l manager-status - 仅允许访问状态页面
manager要被认证才能访问
在 vim /etc/tomcat/tomcat-users.xml 文件下创建
启动服务
systemctl restart tomcat
浏览器访问
http://192.168.63.131:8080/manager/html
我们可以单独对某一个应用程序,进行启动,停止,重载,重新部署
也是一个非常好的热部署工具
创建一个webapps目录
mkdir /data/webapps/ -pv
拷贝一个应用程序文件到webapps目录
cp -r test-1.1/ /data/webapps/test-1.2
在web界面进行热部署
*******************************************************************************
配置tomcat的组件
server:一个server代表一个tomcat实例
vim /etc/tomcat/server.xml
port监听的是端口8005,没有指定ip默认是127.0.0.1
shutdown则表示通过这个8005端口连进来,可以直接关闭tomcat
[root@contes7 ~]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
vim /etc/tomcat/server.xml
全局名称资源,去×××用户名,去×××密码认证信息的
注:Connector:定义连接器,例如:http的连接器 connectionTimeout="20000" 注:连接超时时间,单位是毫秒 redirectPort="8443" /> 注:如果要做ssl重定向,用户访问的时候,虽然到达的8080端口,但是给的协议是https,那只能重定向到8443 一个engine内可以有多个host 当用户访问的host,在本机不存在,直接访问默认的host 鞥 注:appBase:网页文件的根目录,相当于/use/share/tomcat unpackWARs="true" autoDeploy="true"> 注:unpackWARs:是否自动展开.wra文件 autoDeploy:自动部署应用程序 默认的虚拟主机在/usr/share/webapps/ROOT/下 定义host 例: unpackWARs="ture" autoDeploy="true"/> 注: host的名字是contes7.magedu.com appBase网页文件的根目录是/data/webapps unpackWARs自动展开.wra文件 autoDeploy自动部署应用程序 创建默认虚拟主机的目录ROOT mkdir /data/webapps/ROOT{classes,lib,META-INF,WEB-INF} -p 用vi编辑一个index.jsp文件 vi /data/webapps/ROOT/index.jsp <%@ page language="java" %>TomcatA.magedu.com
Session ID | <%= session.getId() %> |
Created on | <%= session.getCreationTime() %> |
启动服务
systemctl restart tomcat
我们需要客户端解析主机名,不然默认访问的是默认localhost的主机
客户端,临时解析
vim /etc/hosts
192.168.63.131 contes7.magedu.com
*********************************************************************8888888
如果每一个虚拟主机都要记录虚拟主机的独立日志怎么办?
vim /etc/tomcat/server.xml
unpackWARs="ture" autoDeploy="true"> prefix="centos7_access_log." suffix=".txt" #前缀centos7_access_log. 后缀.txt 中间是日期 pattern="%h %l %u %t "%r" %s %b" />
重新启动访服务
systemctl restart tomcat
查看日志
tail /var/log/tomcat/centos7_access_log.2018-07-20.txt
***********************************************************************************************************8
在host内部添加contex组件
cp -r /data/webapps/ROOT/ /data/otherapps/myapp
vim /data/otherapps/myapp/index.jsp
<%@ page language="java" %>
TomcatA.ilinux.io
Session ID | <%= session.getId() %> |
Created on | <%= session.getCreationTime() %> |
要想通过某一特定的URL加载并不在我们的appBase网页文件根目录下里面的资源,但又能被我们的URL访问到
vim /data/otherapps/ROOT/index.jsp
unpackWARs="ture" autoDeploy="true"> 注:path=访问路径 docBase=网页文件路径 我们通过当前的主机后面跟上/testapp,能访问/data/otherapps/myapp里面的资源 prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
启动服务
systemctl restart tomcat
**********************************************************************************************************
tomcat的管理应用
host-manager:管理虚拟主机
vim /etc/tomcat/tomcat-users.xml
启用admin-gui角色
用户名和密码属于manager-gui角色和admin-gui角色
重新启动服务
systemctl restart tomcat
浏览器测试
http://172.20.115.61:8080/host-manager/html
注:172.20.115.61 是tomcat的配置文件vim /etc/tomcat/server.xml里面默认的host原来的localhost改成 172.20.115.61
#############################################################################
tomcat负载均衡
tomcat的连接器
http:支持任何类型的http客户端
https:通常只有浏览器客户端直接跟tomcat大交道时才使用https连接器,或者在我们需要在内网中药构建ssl会话才有必要使用https连接器
ajp:ajp的客户端,只有一个httpd
如果我们要构建tomcat提供服务的话,它大体有几种情形
1.直接拿tomcat连接提供互联网上的客户端
这时候就叫tomcat运行在standalone中叫独立运行
这个时候的tomcat既要负责客户端的连接的建立,与各种的connections需要维护
同时还有负责运行应用程序,去响应用户请求包括动态内容,静态内容,版本等等
我们一般不怎么使用
在一个单机的tomcat的之前一个加一个nginx的反代,这样至少能把连接的建立和维护,由nginx来负责,静态的内容的响应有nginx负责,这样tomcat只要负责动态内容
如果只是在本机上构建,那么我们的tomcat只要放在127.0.0.1的地址上,好处是,我们的tomcat就不可以被其他客户端随意的访问,安全防护的功能都可以转个nginx,包括既有日志一应功能都可以转给nginx,而此处nginx确实有更好的性能和其他方面的表现
所以说我们运行tomcat,如果需要做负载均衡,我们通常可以用ngixn ,即便如此tomcat主机也有可能是nginx加tomcat
######################################################################
让nginx反代用户的请求到httd
192.168.63.131 tomcat主机
192.168.63.132 tomcat主机
192.168.63.140 负载均衡器
192.168.63.141 客户端
内网域名的定义
tomcat1-rack11-zone32-telcome-bj.magedu.com
角色加数字-机房的房间-所属区域-运营商-地域
**************************************************************************************
构建NT,也就是nginx加tomcat
在192.168.63.140 负载均衡器 安装nginx
yum install nginx -y
配置虚拟主机,进行反代
vim /etc/nginx/conf.d/ww.conf
server {
listen 80;
server_name www.magedu.com;
location / {
proxy_pass http://172.20.115.61:8080;
}
}
检查语法
nginx -t
启动服务
nginx -s reload
192.168.63.141 客户端测试
vim /etc/hosts
192.168.63.140 www.magedu.com
虚拟机浏览器测试
www.magedu.com
******************************************************************************************************************
192.168.63.131 tomcat主机
192.168.63.132 tomcat主机
yum install java-1.8.0-openjdk-devel -y tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps -y
192.168.63.131 tomcat主机
创建虚拟主机
mkdir /data/ROOT/{classes,lib,META-INF,WEB-INF}
编辑index.jsp 文件
vim /data/webapps/ROOT/index.jsp
<%@ page language="java" %>
TomcatA.magedu.com
Session ID | <%= session.getId() %> |
Created on | <%= session.getCreationTime() %> |
编辑tomcat的配置文件
vim /etc/tomcat/server.xml
unpackWARs="ture" autoDeploy="true"> prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
找到 编辑管理tomcat的web界面认证的用户名密码文件 vim /etc/tomcat/tomcat-users.xml 重新启动服务 systemctl restart tomcat 192.168.63.132 tomcat主机 创建虚拟主机 mkdir /data/webapps/ROOT/{classes,lib,META-INF,WEB-INF} -p 编辑index.jsp 文件 vim /data/webapps/ROOT/index.jsp <%@ page language="java" %>
TomcatB.magedu.com
Session ID | <%= session.getId() %> |
Created on | <%= session.getCreationTime() %> |
编辑tomcat的配置文件
vim /etc/tomcat/server.xml
unpackWARs="ture" autoDeploy="true"> prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
找到 编辑管理tomcat的web界面认证的用户名密码文件 vim /etc/tomcat/tomcat-users.xml 重新启动服务 systemctl restart tomcat 192.168.63.140 负载均衡器 安装nginx服务 yum install nginx -y 配置虚拟主机进行反向代理 vim /etc/nginx/conf.d/www.conf upstream tcsrvs { server contes7.magedu.com:8080; #192.168.63.131 tomcat主机的自定义的host虚拟主机 server zhouyafei.com:8080; #192.168.63.132 tomcat主机自定义的虚拟主机 } server { listen 80; server_name www.magedu.com; location / { proxy_pass http://tcsrvs; } } 检查语法 nginx -t 启动服务 nginx -s reload 由于没有DNS,我们要解析域名,要将两个tomcat的域名写入hosts文件 vim /etc/hosts 192.168.63.131 contes7.magedu.com 192.168.63.132 zhouyafei.com 192.168.63.141 客户端 由于没有DNS,我们要解析域名,要将两个tomcat的域名还有nginx反代的域名写入hosts文件 192.168.63.131 contes7.magedu.com 192.168.63.140 www.magedu.com 192.168.63.132 zhouyafei.com 浏览器测试 http://www.magedu.com/ ****************************************************************************************************** 不建议使用 基于IP地址的绑定,同一个ip,访问nginxtomcat主机,会绑定在同一个tomcat主机上 vim /etc/nginx/conf.d/www.conf upstream tcsrvs { ip_hash; server zhouyafei.com:8080; server contes7.magedu.com:8080; } server { listen 80; server_name www.magedu.com; location / { proxy_pass http://tcsrvs; #proxy_pass http://192.168.63.132:8080; } } ********************************************************************************************************** 如何在httpd上进行反向代理 192.168.63.140 安装httpd yum install httpd -y 列出httpd动态可装卸的共享模块 httpd -M 出现proxy_module (shared)模块代表httpd已经支持反代和正代 出现 proxy_ajp_module 这个模块就可以直接连接tomcat的ajp连接器 使用httpd连接器进行反代 vim /etc/httpd/conf.d/http-tomcat.conf ServerName www.magedu.com #要被访问的域名 ProxyRequests Off #关闭正向代理 ProxyVia On ProxyPreserveHost On Require all granted ProxyPass / http://contes7.magedu.com:8080/ #指明把/根的url代理到http://contes7.magedu.com:8080/ Require all granted 检查配置 httpd -t 启动服务 systemctl start httpd 浏览器测试 www.magedu.com 使用ajp连接器进行反代 vim /etc/httpd/conf.d/ajp-tomcat.conf ServerName web.magedu.com ProxyRequests Off ProxyVia On ProxyPreserveHost On Require all granted ProxyPass / ajp://zhouyafei.com:8009/ Require all granted 检查配置 httpd -t 启动服务 systemctl start httpd 浏览器测试 web.magedu.com http连接器进行负载均衡 权重 byrequests: 默认 轮循 bybusyness :最少连接 bytraffic :根据流量调度,谁流量少,给谁调度 要让www的主机基于httpd连接,分别代理的不同的后端服务器不同的虚拟主机上 vim /etc/httpd/conf.d/http-tomcat.conf BalancerMember http://contes7.magedu.com:8080 BalancerMember http://zhouyafei.com:8080 ProxySet lbmethod=byrequests ServerName www.magedu.com ProxyRequests Off ProxyVia On ProxyPreserveHost On Require all granted ProxyPass / balancer://tcsrvs/ Require all granted 检查配置 httpd -t 启动服务 systemctl start httpd 浏览器测试 www.magedu.com 我们也可以设置权重 BalancerMember http://contes7.magedu.com:8080 loadfactor=2 BalancerMember http://zhouyafei.com:8080 loadfactor=1 默认是1 status状态 status=D 排干,就让这个后端主机人为的设置为不可用 BalancerMember http://contes7.magedu.com:8080 loadfactor=2 status=D status=H 备用模式, BalancerMember http://contes7.magedu.com:8080 loadfactor=2 status=H 在httpd反代的时候也可以用会话连接器 Header add Set-Cookie "Routeid=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTER_CHANGED BalancerMember http://contes7.magedu.com:8080 loadfactor=1 route=TcA BalancerMember http://zhouyafei.com:8080 loadfactor=1 route=TcB ProxySet stickysession=ROUTEID
在后端服务器 192.168.63.131 vim /etc/tomcat/server.xml 加入 jvmRoute="TcA属性 192.168.63.132 vim /etc/tomcat/server.xml 加入 jvmRoute="TcB属性 ajp连接器进行负载均衡 vim /etc/httpd/conf.d/ajp-tomcat.conf BalancerMember ajp://contes7.magedu.com:8009 BalancerMember ajp://zhouyafei.com:8009 ServerName web.magedu.com ProxyRequests Off ProxyVia On ProxyPreserveHost On Require all granted ProxyPass / balancer://tomcat/ Require all granted 检查配置 httpd -t 启动服务 systemctl start httpd 浏览器测试 web.magedu.com 注意:上面的实验只是测试,在输出环境中只用配置一种httpd或者ajp ********************************************************************************************************* 基于httpd的反代负载均衡 管理接口balance,有一个内建的页面,这个页面还有管理功能 指定一个 SetHandler balance-manager 代表URL SetHandler 打开处理器,这个处理器是balance-manager ProxyPass !关闭代理 Require all granted 授权所有人都可以访问 vim /etc/httpd/conf.d/http-tomcat.conf Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTER_CHANGED BalancerMember http://contes7.magedu.com:8080 loadfactor=1 route=TcA BalancerMember http://zhouyafei.com:8080 loadfactor=1 route=TcB ProxySet stickysession=ROUTEID ServerName www.magedu.com ProxyRequests Off ProxyVia On ProxyPreserveHost On Require all granted ProxyPass / balancer://tcsrvs/ Require all granted SetHandler balancer-manager ProxyPass ! Require all granted #这个权限太大,建议进行认证 检查配置 httpd -t 启动服务 systemctl start httpd 浏览器测试 www.magedu.com/balancer-manager 单机http链接,会处理一个节目 ***********************************************************************************8 如何在后端实现状态跟踪 seeicnManager 会话管理器 会话管理器就是将多个tomcat实例构建成一个多播通信的会话集群 Delta 会话变动 构建会话集群 这种集群是绑定在后端的服务器上的,不管是httpd调度器,还是nginx的调度器都是可以的 组播地址为228.0.0.4 多播端口为45564(端口和地址共同决定了集群成员资格。 广播的IP是java.net.InetAddress.getLocalHost().getHostAddress()(确保你不播放127.0.0.1,这是一个常见的错误) 侦听复制消息的TCP端口是范围内第一个可用的服务器套接字 4000-4100 监听器已配置 ClusterSessionListener 两个拦截器配置TcpFailureDetector和MessageDispatch15Interceptor 注意:这样的会话集群不适合较大的规模,3,5个节点构建的tomcat没有太大问题,在多久不建议使用了 192.168.63.131 添加到tomcat主机的自己创建的host中 用vi复制 vi /etc/tomcat/server.xml 用vim 编辑 vim /etc/tomcat/server.xml 在集群中要添加jvmRoute="TcA属性 在自己的host中加载集群信息 unpackWARs="ture" autoDeploy="true"> channelSendOptions="8"> expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> address="228.0.0.199" #和另一台主机一样的组播地址 port="45564" frequency="500" dropTime="3000"/> address="192.168.63.131" #本机的地址 port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> filter=""/> tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 192.168.63.131 添加到tomcat主机的自己创建的host中 用vi复制 vi /etc/tomcat/server.xml 用vim 编辑 vim /etc/tomcat/server.xml 在集群中要添加jvmRoute="TcB 在自己的host中加载集群信息 unpackWARs="ture" autoDeploy="true"> channelSendOptions="8"> expireSessionsOnShutdown="false" notifyListenersOnReplication="true"/> address="228.0.0.199" #和另一台集群一样的组播地址 port="45564" frequency="500" dropTime="3000"/> address="192.168.63.132" #自己主机的地址 port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> filter=""/> tempDir="/tmp/war-temp/" deployDir="/tmp/war-deploy/" watchDir="/tmp/war-listen/" watchEnabled="false"/> prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 一定要确定那个主机要做集群服务,要在web.html文件添加 192.168.63.131 tomcat主机 我们的web.html放在WEB-INF目录,如果没有,就从默认的目录下复制过来 cp /etc/tomcat/web.xml /data/webapps/ROOT/WEB-INF/ 编辑web.xml 文件,添加 vim /data/webapps/ROOT/WEB-INF/web.xml 在这一行下添加 192.168.63.132 tomcat主机 vim /data/webapps/ROOT/WEB-INF/web.xml 在这一行下添加 192.168.63.131 先停止tomcat的服务,成本查看日志 systemctl stop tomcat 打开日志 tail -f /var/log/tomcat/catalina.2018-07-21.log 启动服务 systemctl start tomcat 检查是否有错误 192.168.63.132 在停止启动另一台tomcat主机的服务 先停止tomcat的服务,成本查看日志 systemctl stop tomcat 打开日志 tail -f /var/log/tomcat/catalina.2018-07-21.log 启动服务 systemctl start tomcat 检查是否有错误 在192.168.63.131查看日志会出现 tail -f /var/log/tomcat/catalina.2018-07-21.log 显示添加进来一个集群 在192.168.63.132查看日志会出现 tail -f /var/log/tomcat/catalina.2018-07-21.log 会显示加入一个集群 使用nginx进行调度 192.168.63.140 负载均衡主机 vim /etc/nginx/conf.d/www.conf upstream tcsrvs { server zhouyafei.com:8080; server contes7.magedu.com:8080; } server { listen 80; server_name www.magedu.com; location / { proxy_pass http://tcsrvs; #proxy_pass http://192.168.63.132:8080; } } 检查nginx的配置 nginx -t 重载服务 nginx -s reload 浏览器测试 www.magedu.com 或 使用httpd调度 vim /etc/httpd/conf.d/ajp-tomcat.conf BalancerMember ajp://contes7.magedu.com:8009 BalancerMember ajp://zhouyafei.com:8009 ServerName web.magedu.com ProxyRequests Off ProxyVia On ProxyPreserveHost On Require all granted ProxyPass / balancer://tomcat/ Require all granted 检查配置 httpd -t 重载服务 systemctl reload httpd 客户端测试 web.magedu.com ############################################################################ 实现后端 nginx服务静态,tomcat服务动态,在前端再用一个nginx进行反代 在tomcat主机上在部署一个nginx,用来处理纯静态内容 在后端192.168.63.131 tomcat部署nginx服务 yum install nginx -y 在自己自定义的host虚拟主机的目录下的ROOT目录下添加一个静态页面 echo TEST R1 > /data/webapps/ROOT/test.html 现在在两个tomcat主机上一个静态页面index.html 和一个动态页面index.jps 配置nginx能实现反代 注:红色的为添加的内容 vim /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /data/webapps/ROOT; #添加网站的目录 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~* \.(jsp|do)$ { #~*忽略大小写 所有以jsp和do结尾的文件 proxy_pass http://192.168.63.131:8080; #反代给本机,在生产中是使用localhost } location / { index index.jsp index.html; #识别主页 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 检查配置 nginx -t 启动服务 nginx 浏览器测试 测试动态网页 http://contes7.magedu.com/ 测试静态网页 http://contes7.magedu.com/test.html 在后端192.168.63.132 tomcat部署nginx服务 yum install nginx -y 在自己自定义的host虚拟主机的目录下的ROOT目录下添加一个静态页面 echo TEST R1 > /data/webapps/ROOT/test.html 现在在两个tomcat主机上一个静态页面index.html 和一个动态页面index.jps 配置nginx能实现反代 注:红色的为添加的内容 vim /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /data/webapps/ROOT; #添加网站的目录 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~* \.(jsp|do)$ { #~*忽略大小写 所有以jsp和do结尾的文件 proxy_pass http://192.168.63.132:8080; #反代给本机,在生产中是使用localhost } location / { index index.jsp index.html; #识别主页 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 检查配置 nginx -t 启动服务 nginx 浏览器测试 测试静态页面 http://zhouyafei.com/test.html 测试动态页面 http://zhouyafei.com/ 配置前端基于nginx的调度器 192.168.63.140 vim /etc/nginx/conf.d/www.conf upstream tcsrvs { #后端tomcat服务器 server zhouyafei.com:80; server contes7.magedu.com:80; } upstream imgsrvs { #假设图片服务器 server zhouyafei.com:80; server contes7.magedu.com:80; } server { listen 80; server_name www.magedu.com; #要访问的域名 location ~* \.(jpg|jpeg|png|gif)$ { #如果有图片服务器,将图片~*忽略大小写,以jpg等结尾的图片 proxy_pass http://imgsrvs; #调度到imgsvs图片服务器 } location / { proxy_pass http://tcsrvs; #其他的都调度到tcsrvs } } 检测配置 nginx -t 启动服务 nginx 浏览器测试 测试动态网页 www.magedu.com 测试静态网页 http://www.magedu.com/test.html ############################################################################# varnish缓存系统 cache 页面缓存 proxy:代理式缓存 bypass:旁挂式缓存系统 memcached 高性能的分布式的内存对象缓存系统 yum install memcached -y vim /etc/sysconfig/memcached PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="128" OPTIONS="-f 1.2" 启动服务 systemctl start memcached 查看端口 ss -ntl 远程telnet连接 telnet 127.0.0.1 11211 stats里面是内建的变量 添加一个缓存项 add 键不能冲突 标志位随便写 过期时间 字节 add mykey 1 120 9 ilinux.io 内容 get mykey 获取数据 memcached程序的常用选项 -m 内存空间,在当前系统分出多少空间用来缓存memcached相关的数据 -c 最大并发连接数,默认1024 -u 以普通用户的身份运行memcached进程 -l 监听的tcp端口,默认是本机所有的地址,如果想监听特有地址用-l定义 -p 端口 11211 -U UDP的端口,不指定默认的一样11211,0表示关闭UDP协议的端口 -M 内存耗尽时,不执行LRU清理缓存,而是拒绝存入新的缓存项,直到有多余的可用空间为止 -f 增长因子,默认是1.25 -t 启动用于响应用户请求的线程数,线程数要小于等于CPU的核心数 memcached默认没有认证机制,可以借用于SASL进行认证 SASL :简单安全认证层 SASL是把一些不支持认证功能的程序做认证 c++语言连接mamcached yum install libmemcached -y PHP语言mamcached php-pecl-memcache php-pecl-memcached 多个tomcat配置为一个所谓的多播集群,通过集群内升的设定,能够构建DeltaManager的环境 它所能试用的规模非常的有限,因为每一个在构建的网页都要通过网络传输给统一集群中的其他节点,所以每一个节点都会受控于会话的管理,如果要借助于第三方工具,或借助一个外在的工具,来使用作为集中存储会话,使得每一个节点获取会话时都从这个集中的存储系统上来获取 mamcached就是可以用来存储会话的一个主机 但是一个memcached是单独故障,我们要做冗余备份,但是memcached不支持这个功能,我们要在前端程序一侧用手动构建 ******************************************************************************************************* 查看地址下载地址 https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration#decide-which-serialization-strategy-to-use 下载主架库类文件 wget https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar 下载适用于tomcat的版本的架 wget https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.3.0/memcached-session-manager-tc7-2.3.0.jar 如果你正在使用memcached,你还需要spymemcached - $ {version} .jar wget https://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar 下载序列化工具 例: < 依赖 > < groupId > de.javakaffee.msm groupId > < artifactId > msm-kryo-serializer artifactId > < version > 1.9.7 version > < scope > runtime scope > dependency > wget https://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar wget https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar wget https://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/kryo-4.0.2.jar wget https://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar wget https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar wget https://repo1.maven.org/maven2/org/ow2/asm/asm/6.2/asm-6.2.jar wget https://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar ############################################################################3 配置memcached缓存,进行tomcat集群的会话保持 1.下载必要的文件 在tomcat主机 192.168.63.131 192.168.63.132 yum install memcached -y 将下载的文件放到tomcat的lib文件路径/usr/share/tomcat/lib/,这个不赖是链接目录,我们进入到真正的目录 查看目录的软链接 ls -ld /usr/share/tomcat/lib 进入目录 cd /usr/share/java/tomcat 下载主架库类文件 wget https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar 下载适用于tomcat的版本的架 wget https://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.3.0/memcached-session-manager-tc7-2.3.0.jar 如果你正在使用memcached,你还需要spymemcached - $ {version} .jar wget https://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar 下载序列化工具 wget https://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar wget https://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar wget https://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/kryo-4.0.2.jar wget https://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar wget https://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar wget https://repo1.maven.org/maven2/org/ow2/asm/asm/6.2/asm-6.2.jar wget https://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar 2. 配置tomcat支持使用memcached的jar文件 192.168.63.131 打开tomcat的配置文件 vim /etc/tomcat/server.xml 在打算定义会话管理的虚拟主机上配置 注意:汉字是注释,使用的时候不能加 unpackWARs="ture" autoDeploy="true"> memcachedNodes="n1:contes7.magedu.com:11211,n2:zhouyafei.com:11211" failoverNodes="n2" #故障转移节点,设为n2,n1是活动的 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" #要忽略的URI有哪些,不去会话追踪 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 192.168.63.132 打开tomcat的配置文件 vim /etc/tomcat/server.xml 在打算定义会话管理的虚拟主机上配置 注意:汉字是注释,使用的时候不能加 unpackWARs="ture" autoDeploy="true"> memcachedNodes="n1:contes7.magedu.com:11211,n2:zhouyafei.com:11211" failoverNodes="n2" #故障转移节点,设为n2,n1是活动的 requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" #要忽略的URI有哪些,不去会话追踪 transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> prefix="centos7_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> 实现后端 nginx服务静态,tomcat服务动态,在前端再用一个nginx进行反代 在tomcat主机上在部署一个nginx,用来处理纯静态内容 yum install nginx -y 在自己自定义的host虚拟主机的目录下的ROOT目录下添加一个静态页面 echo TEST R1 > /data/webapps/ROOT/test.html 现在在两个tomcat主机上一个静态页面index.html 和一个动态页面index.jps 配置nginx能实现反代 注:红色的为添加的内容 vim /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /data/webapps/ROOT; #添加网站的目录 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~* \.(jsp|do)$ { #~*忽略大小写 所有以jsp和do结尾的文件 proxy_pass http://192.168.63.131:8080; #反代给本机,在生产中是使用localhost } location / { index index.jsp index.html; #识别主页 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 检查配置 nginx -t 启动服务 nginx 在后端192.168.63.132 tomcat部署nginx服务 yum install nginx -y 在自己自定义的host虚拟主机的目录下的ROOT目录下添加一个静态页面 echo TEST R1 > /data/webapps/ROOT/test.html 现在在两个tomcat主机上一个静态页面index.html 和一个动态页面index.jps 配置nginx能实现反代 注:红色的为添加的内容 vim /etc/nginx/nginx.conf server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /data/webapps/ROOT; #添加网站的目录 # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location ~* \.(jsp|do)$ { #~*忽略大小写 所有以jsp和do结尾的文件 proxy_pass http://192.168.63.132:8080; #反代给本机,在生产中是使用localhost } location / { index index.jsp index.html; #识别主页 } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } 检查配置 nginx -t 启动服务 nginx 3.host文件解析域名 192.168.63.131 192.168.63.132 192.168.63.141 vim /etc/hosts 192.168.63.131 contes7.magedu.com 192.168.63.140 www.magedu.com web.magedu.com 192.168.63.132 zhouyafei.com 4.启动tomcat服务,并查看日志 192.168.63.131 systemctl restart tomcat 查看日志 tail -f /var/log/tomcat/catalina.2018-07-22.log 可以看见 INFO: -------- - finished initialization: - sticky: true - operation timeout: 1000 - node ids: [n1] - failover node ids: [n2] - storage key prefix: null - locking mode: null (expiration: 5s) -------- 192.168.63.132 systemctl restart tomcat 查看日志 tail -f /var/log/tomcat/catalina.2018-07-22.log 可以看见 INFO: -------- - finished initialization: - sticky: true - operation timeout: 1000 - node ids: [n1] - failover node ids: [n2] - storage key prefix: null - locking mode: null (expiration: 5s) 5.测试 192.168.63.132 tomcat主机 http://zhouyafei.com:8080/ 测试 192.168.63.131 tomcat主机 http://contes7.magedu.com:8080/ 6.配置基于nginx的负载均衡 192.168.63.140 vim /etc/nginx/conf.d/www.conf upstream tcsrvs { #后端tomcat服务器 server zhouyafei.com:80; server contes7.magedu.com:80; } server { listen 80; server_name www.magedu.com; #要访问的域名 location / { proxy_pass http://tcsrvs; #其他的都调度到tcsrvs } } 检查配置 nginx -t 启动服务 nginx 7.测试,不加端口号, 由后端的nginx服务器反代到tomcat的主机上的nginx,在由tomcat主机的nginx反代到前端的nginx服务器 http://zhouyafei.com/ http://contes7.magedu.com/ 8. 测试 http://www.magedu.com/ 可以看见Session ID一行的最后有一个n1 10.在memcached查看保存的会话 yum install libmemcached -y memdump --servers="contes7.magedu.com:11211" 注意:在memcached的配置中n2被设置为故障转移节点,此前所有的会话都是由n1来提供,当n1 出现故障在由n2提供会话 如果n1和n2都存在,n2是备用的 如果n1故障n2启用,但是n1创建的会话还保持着n1的属性 ################################################################################################################################### Tomcat的常用优化配置: (1) 内存空间: /etc/sysconfig/tomcat, /etc/tomcat/tomcat.conf, /usr/local/tomcat/bin/catalina.sh JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize=" -server:服务器模型 -Xms:堆内存初始化大小; -Xmx:堆内存空间上限; -XX:NewSize=:新生代空间初始化大小; -XX:MaxNewSize=:新生代空间最大值; -XX:PermSize=:持久代空间初始化大小; -XX:MaxPermSize=:持久代空间最大值; 192.168.63.131 tomcat主机 vim /etc/tomcat/tomcat.conf 注:JAVA_OPTS="-server 为服务器端优化 -Xms512 初始化大小为512m兆 -Xmx1.5g 最大1500m -XX:MaxNewSize=512m 新生代的大小,新生成的对象 -XX:NewSize=256m 新生代初始化大小 #JAVA_OPTS="-Xminf0.1 -Xmaxf0.3" JAVA_OPTS="-server -Xmx1500m -Xms512m -XX:MaxNewSize=512m -XX:NewSize=256m" vim /etc/tomcat/server.xml 默认主机是localhost < 启动服务 systemctl restart tomcat 浏览器 http://172.20.114.201:8080/manager/html 可以看见一个server status,单机进入 能看见刚才定义的内容 可以根据使用的大小更改配置文件 vim /etc/tomcat/tomcat.conf 2.线程池设置 常用属性: maxThreads:最大线程数;最大并发连接数; minSpareThreads:最小空闲线程数; maxSpareThreads:最大空闲线程数; acceptCount:等待队列的最大长度; URIEncoding:URI地址编码格式,建议使用UTF-8; enableLookups:是否启用dns解析,建议禁用; compression:是否启用传输压缩机制,建议“on"; compressionMinSize:启用压缩传输的数据流最小值,单位是字节; compressableMimeType:定义启用压缩功能的MIME类型; text/html, text/xml, text/css, text/javascript (3) 禁用8005端口; (4) 隐藏版本信息: Server="SOME STRING" *******************************************************************************************************8888 垃圾回收 新生代垃圾回收 Minor GC