Tomcat
服务器是一个免费的开放源代码的
Web
应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat
具有处理
HTML
页面的功能,它还是一个
Servlet
和 JSP容器
1、安装 Tomcat
(1)、tomcat的文件结构和组成
目录结构
目录 说明
-------------------------------------------------------
bin
服务启动、停止等相关程序和文件
conf
配置文件
lib
库目录
logs
日志目录
webapps
应用程序,应用部署目录,相当于
nginx
的默认发布目录
work jsp
编译后的结果文件,建议提前预热访问
(2)、查看tomcat相关目录和文件
[root@tomcat ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat ~]# ls /usr/local/tomcat/
bin conf lib logs README.md RUNNING.txt
webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
A、tomcat环境部署
[root@cat10 conf]# chmod +x /usr/bin/tomcat
2、tomcat反向代理部署
standalone
模式,
Tomcat
单独运行,直接接受用户的请求,不推荐。
反向代理,单机运行,提供了一个
Nginx
作为反向代理,可以做到静态由
nginx
提供响应,动态
jsp
代 理给Tomcat
LNMT
:
Linux + Nginx + MySQL + Tomcat
LAMT
:
Linux + Apache
(
Httpd
)
+ MySQL + Tomcat
前置一台
Nginx
,给多台
Tomcat
实例做反向代理和负载均衡调度,
Tomcat
上部署的纯动态页面更
适合
LNMT
:
Linux + Nginx + MySQL + Tomcat
多级代理
LNNMT
:
Linux + Nginx + Nginx + MySQL + Tomcat
(1)、利用 nginx 反向代理实现
利用
nginx
反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个
tomcat
主机
利用
nginx
指令
proxy_pass
可以向后端服务器转发请求报文
,
并且在转发时会保留客户端的请求报文中的 host首部
(2)、实现tomcat中的负载均衡
动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压 力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance
负载
均衡。
当单机
Tomcat
,演化出多机多级部署的时候,一个问题便凸显出来,这就是
Session
。而这个问题的由来,都是由于HTTP
协议在设计之初没有想到未来的发展。
B、tomecat反向代理及负载均衡
[root@cat10 ~]# ls
- anaconda-ks.cfg apache-tomcat-9.0.93.tar.gz test.jsp
[root@cat10 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@cat10 ~]# scp test.jsp root@172.25.254.20:/usr/local/tomcat/webapps/ROOT/
root@172.25.254.20's password:
test.jsp 100% 968 801.0KB/s 00:00
[root@cat10~]# cd /usr/local/nginx/conf.d
[root@cat10 conf.d]# ls
vhosts.conf
[root@cat10 conf.d]# vim vhosts.conf
upstream tomcat {
ip_bash;
#hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name lee.ll.org;
root /webdataw/nginx/ll.org/lee;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
[root@cat10 conf.d]#nginx -s reload
C、负载均衡
[root@tomcat ~]# vim /usr/local/nginx/conf.d/tomcat.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name www.ll.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
[root@tomcat ~]# nginx -s reload
# 模拟tomcat2出现故障
[root@cat10 ~]# systemctl stop tomcat
3、Memcached
(1)、简介
Memcached
只支持能序列化的数据类型,不支持持久化,基于
Key-Value
的内存缓存系统
memcached虽然没有像redis
所具备的数据持久化功能,比如
RDB
和
AOF
都没有,但是可以通过做集群同步的方式, 让各memcached
服务器的数据进行同步,从而实现数据的一致性,即保证各
memcached
的数据是一样的,即使有任何一台 memcached
发生故障,只要集群中有一台
memcached
可用就不会出现数据丢失,当其他memcached
重新加入到集群的时候
,
可以自动从有数据的
memcached
当中自动获取数据并提供服务。
Memcached
借助了操作系统的
libevent
工具做高效的读写。
libevent
是个程序库,它将
Linux
epoll
、 BSD类操作系统的
kqueue
等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥高性能。memcached
使用这个
libevent
库,因此能在
Linux
、
BSD
、
Solaris
等操作系统上发挥其高性能
D、memcached的安装与启动
[root@cat10 ~]# yum install memcached -y
[root@cat10 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@cat10 ~]# systemctl enable --now memcached
[root@cat10 ~]# netstat -antlupe | grep memcache
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 975 122107 43014/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 975 122108 43014/memcached
[root@cat20 ~]# yum install memcached -y
[root@cat20 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@cat20 ~]# systemctl enable --now memcached
[root@cat20 ~]# netstat -antlupe | grep memcache
(2)、操作命令
set 多数据存储在缓存中,如果指定的键已经存在,set会覆盖现有的数据。
add 在指定的键不存在时,将数据存储在缓存中。如果键已经存在,则操作失败。
replace 仅在指定的键已经存在时,替换该键下的数据。如果键不存在,则操作失败。
get 从缓存中检索指定键的数据。
delete 从缓存中删除指定的键及其数据。
#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>
#参数说明如下:
command set/add/replace
key key 用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes 在缓存中存储的字节数
value 存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes
4、session 共享服务器
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
E、seesion会话保持的实现
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录
中,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。
kryo-3.0.3.jar
asm-5.2.jar
objenesis-2.6.jar
reflectasm-1.11.9.jar
minlog-1.3.1.jar
kryo-serializers-0.45.jar
msm-kryo-serializer-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
spymemcached-2.12.3.jar
memcached-session-manager-2.3.2.jar
当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于备份了一份Session如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在memcached1中
cat10、cat2中修改tomcat配置
[root@cat10 ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
. . . . . .
<Manager pathname="" />
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:172.25.254.10:11211,m2:172.25.254.20:11211"
failoverNodes="m1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@cat10 ~]# systemctl restart memcached
[root@cat20 ~]# vim /usr/local/tomcat/conf/context.xml
<Context>
. . . . . .
<Manager pathname="" />
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:172.25.254.10:11211,m2:172.25.254.20:11211"
failoverNodes="m1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>
[root@cat20 ~]# systemctl restart memcached
tomcat(50)中修改配置
[root@tomcat ~]# vim /usr/local/nginx/conf.d/vhosts.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen 80;
server_name ll.ll.org;
root /webdataw/nginx/ll.org/ll;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
try_files $uri $uri.html $uri/index.html /error/default.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
测试:http://ll.timinglee.org/test.jsp