总结 tomcat实现多虚拟机
[root@centos8 tomcat]#pwd
/usr/local/tomcat
[root@centos8 tomcat]#vim conf/server.xml
[root@centos8 tomcat]#tail conf/server.xml
pattern="%h %l %u %t "%r" %s %b" />
</Host>
#添加以下行
<Host name="node1.example.org" appBase="/data/webapps1/" unpackWARs="true"
autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="node1_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
<Host name="node2.example.org" appBase="/data/webapps2/" unpackWARs="true"
autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="node2_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
#对每个虚拟主机,准备数据
[root@centos8 ~]#mkdir /data/webapps{1,2}/ROOT -pv
mkdir: created directory '/data/webapps1/ROOT'
mkdir: created directory '/data/webapps2/ROOT'
[root@centos8 ~]#cat /data/webapps1/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 ~]#cat /data/webapps2/ROOT/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
<br>
<%=request.getRequestURL()%>
</body>
</html>
[root@centos8 ~]#
#设置权限
[root@centos8 ~]#chown -R tomcat.tomcat /data/webapps{1,2}/
#准备虚拟主机的名称解析
[root@centos8 ~]#cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
centos8.localdomain
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.152 node1.example.org node2.example.org
#对部署完成的网页进行测试
[root@centos8 ~]#curl http://node1.example.org:8080/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
http://node1.example.org:8080/
</body>
</html>
[root@centos8 ~]#curl http://node2.example.org:8080/
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jsp例子</title>
</head>
<body>
后面的内容是服务器端动态生成字符串,最后拼接在一起
http://node2.example.org:8080/
</body>
</html>
总结 tomcat定制访问日志格式和反向代理tomcat
Tomcat定制访问日志格式
Tomcat的访问日志是服务器管理和性能优化的重要工具,它记录了客户端对服务器的访问请求和响应信息。Tomcat允许用户根据需求定制访问日志的格式,以便更好地理解和分析日志数据。
定制步骤
-
编辑server.xml文件:
Tomcat的主配置文件是conf/server.xml
。要定制访问日志格式,需要编辑该文件中的<Host>
元素内的<Valve>
子元素。<Valve>
元素用于定义日志记录的行为,其中className
属性指定了日志阀门的类名(通常为org.apache.catalina.valves.AccessLogValve
),而pattern
属性则用于定义日志的格式。 -
配置pattern属性:
pattern
属性支持多种预定义的格式串,如%h
(客户端IP地址)、%l
(远程登录名)、%u
(认证用户名)、%t
(请求时间)、"%r"
(请求行)、%s
(状态码)、%b
(响应大小)等。用户可以根据需要选择这些格式串,并通过自定义组合来定义日志格式。 -
示例:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
这个示例中的日志格式将包含客户端IP地址、远程登录名、认证用户名、请求时间、请求行、状态码和响应大小。
反向代理的实现方式
-
使用Nginx作为反向代理:
Nginx是一款高性能的HTTP和反向代理服务器,也是邮件代理服务器和通用的TCP/UDP代理服务器。通过配置Nginx,可以轻松实现Tomcat的反向代理。 -
配置Nginx:
在Nginx的配置文件中(通常是nginx.conf
或位于conf.d/
目录下的某个文件),需要定义一个server
块来监听客户端的请求,并在location
块中使用proxy_pass
指令将请求转发到Tomcat服务器。server { listen 80; server_name www.example.com; location / { proxy_pass http://10.0.0.152:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
在这个示例中,Nginx监听80端口,并将所有请求转发到本地Tomcat服务器的8080端口。同时,还设置了一些HTTP头信息,以便Tomcat能够获取到原始请求的一些重要信息。
总结 JVM垃圾回收算法和分代
JVM垃圾回收(Garbage Collection,简称GC)是Java虚拟机的一个重要特性,用于自动回收不再使用的对象所占用的内存。Java的垃圾回收器通过各种算法和策略来有效地回收内存,以保持JVM的性能和稳定性。
JVM垃圾回收算法
- 标记-清除(Mark-Sweep):
- 标记阶段:遍历所有的对象,标记出还在使用的对象。
- 清除阶段:遍历标记阶段未被标记的对象,回收它们的内存。
- 优点:简单、高效。
- 缺点:需要进行两阶段扫描,容易产生内存碎片。
- 标记-整理(Mark-Compact):
- 标记阶段:与标记-清除相同,标记出还在使用的对象。
- 整理阶段:将所有还在使用的对象移动到内存的一端,然后清理掉边界以外的内存。
- 优点:解决了内存碎片问题。
- 缺点:移动对象比较耗时。
- 复制(Copying):
- 将可用内存划分为两块,每次只使用其中一块。
- 当这一块内存用完时,将还存活的对象复制到另一块内存上,然后清理掉已使用的内存。
- 优点:没有内存碎片,停顿时间短。
- 缺点:内存利用率低,只有50%。
- 分代收集(Generational Collection):
- 将对象分为新生代和老年代,对不同年代的对象使用不同的回收策略。
- 新生代:对象生命周期短,采用复制算法,如Scavenge。
- 老年代:对象生命周期长,采用标记-整理或标记-清除算法,如CMS(Concurrent Mark Sweep)。
分代
- 新生代(Young Generation):
- 对象存活时间短,新生代通常分为Eden区、From Survivor区和To Survivor区。
- 垃圾回收器会首先在Eden区进行回收,然后根据对象的存活情况,将部分存活的对象移动到From Survivor区或To Survivor区。
- 经过多次回收后,如果对象仍然存活,就会被移动到老年代。
- 老年代(Old Generation):
- 对象存活时间长,当对象在新生代中经过多次回收后仍然存活,就会被移动到老年代。
- 老年代通常采用标记-整理或标记-清除算法进行回收。
总结memcache使用,安装和MSM原理
Memcache使用
Memcache是一个自由、源码开放、高性能、分布式的内存对象缓存系统,主要用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高网站访问的速度。Memcache的设计理念是小而强大,支持Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
基本使用流程
- 客户端请求数据:当客户端请求数据时,首先检查Memcached中是否有对应的数据。
- 缓存命中:如果Memcached中有对应的数据,则直接返回数据给客户端,结束请求。
- 缓存未命中:如果Memcached中没有对应的数据,则去数据库中请求数据。
- 数据写入缓存:将从数据库获取的数据写入Memcached中,供下次请求时使用。
- 返回数据:将数据返回给客户端,结束请求。
Memcache安装
Memcache的安装过程通常涉及以下几个步骤(以Linux环境为例):
- 下载Memcache源码:从Memcache的官方网站或可靠的源下载Memcache的源码包。
- 编译安装:解压源码包,使用
./configure
、make
和make install
命令进行编译安装。 - 启动Memcache服务:使用
memcached -d -m 64 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid
命令启动Memcache服务,其中-d
表示以守护进程方式运行,-m
指定分配给Memcache的内存大小(单位MB),-u
指定运行Memcache的用户,-l
指定监听的IP地址,-p
指定监听的端口,-c
指定最大同时连接数,-P
指定pid文件的保存位置。 - 配置客户端:在应用程序中配置Memcache客户端,指定Memcache服务器的IP地址和端口等信息。
MSM(Memcached-Session-Manager)原理
MSM(Memcached-Session-Manager)是一个用于Tomcat与Memcached之间会话管理的工具,它支持Tomcat 6和Tomcat 7。MSM通过Tomcat的Valve对Request进行跟踪,实现Tomcat Session与Memcached之间的同步,以达到Session共享的目的。
MSM的工作流程
- Request请求到来时:
- MSM会从Memcached中加载Session(如果Tomcat的jvmroute发生变化,或者Tomcat中没有该Session)。
- 如果Memcached中没有找到Session,则直接使用Tomcat中的Session。
- Request请求处理过程中:
- 应用程序对Session进行操作(如读取、修改)。
- 这些操作实际上是在Tomcat的Session中进行的。
- Request请求结束时:
- MSM将Tomcat中的Session更新到Memcached中,以实现主备同步。
- 如果配置了多个Memcached节点,MSM还会根据配置进行主备节点的选择和数据同步。
MSM的Session同步策略
- 主备同步:Tomcat中的Session被视为主Session,Memcached中的Session被视为备Session。在每次Request请求结束时,MSM都会将Tomcat中的Session更新到Memcached中,以保持两者的同步。
- 容错处理:如果主Memcached节点出现故障,MSM可以自动切换到备Memcached节点,并从备节点中加载Session,以保证应用程序的正常运行。
通过MSM,Tomcat可以轻松地实现Session的分布式共享和容错处理,提高Web应用的可靠性和扩展性。