企业级WEB应用服务器TOMCAT
一 WEB技术
1.1 HTTP协议和B/S 结构
操作系统有进程子系统,使用多进程就可以充分利用硬件资源。进程中可以多个线程,每一个线程可以
被CPU调度执行,这样就可以让程序并行的执行。这样一台主机就可以作为一个服务器为多个客户端提
供计算服务。
客户端和服务端往往处在不同的物理主机上,它们分属不同的进程,这些进程间需要通信。跨主机的进
程间通信需要使用网络编程。最常见的网络编程接口是Socket。
Socket称为套接字,本意是插座。也就是说网络通讯需要两端,如果一端被动的接收另一端请求并提供
计算和数据的称为服务器端,另一端往往只是发起计算或数据请求,称为客户端。
这种编程模式称为Client/Server编程模式,简称C/S编程。开发的程序也称为C/S程序。C/S编程往往使用
传输层协(TCP/UDP),较为底层,比如:QQ,迅雷, 云音乐, 云盘, foxmail,xshell等
二 WEB框架
2.1 web资源和访问
PC 端或移动端浏览器访问
从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务
器请求图片资源显示
从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端
手机 App 访问
内置了HTML和JS文件,不需要从静态WEB服务器下载 JS 或 HTML。为的就是减少文件的发送,现代前
端开发使用的JS文件太多或太大了
有必要就从图片服务器请求图片,从业务服务器请求动态数据
客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成
三 tomcat的功能介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和
并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和
JSP容器
3.1下载tomcat
安装JDK版本
[root@tomcat1 ~]# dnf install java-1.8.0-openjdk.x86_64
查找JDK位置
[root@tomcat1 ~]# rpm -ql java-1.8.0-openjdk
解压TOMCAT
[root@tomcat1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat1 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat
[root@tomcat1 ~]# /usr/local/tomcat/bin/startup.sh
启动运行
[root@tomcat1 ~]# /usr/local/tomcat/bin/startup.sh
[root@tomcat1 ~]# netstat -antlupe | grep java
3.2配置启动文件
[root@tomcat1 ~]# vim /usr/local/tomcat/conf/tomcat.conf
[root@tomcat1 ~]# vim /usr/local/tomcat/conf/tomcat.conf
[root@tomcat1 ~]# cd /etc/alternatives/
[root@tomcat1 alternatives]# cd
[root@tomcat1 ~]# useradd -s /sbin/nologin -M tomcat
[root@tomcat1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/
[root@tomcat1 ~]# vim /lib/systemd/system/tomcat.service
[root@tomcat1 ~]# systemctl daemon-reload
[root@tomcat1 ~]# systemctl enable --now tomcat.service
查看启动情况
同步到另一台主机
[root@tomcat1 ~]# rsync -ar /usr/local/apache-tomcat-9.0.93 root@172.25.253.20:/usr/local/apache-tomcat-9.0.93
[root@tomcat1 ~]# rsync -ar /lib/systemd/system/tomcat.service root@172.25.253.20:/lib/systemd/system/tomcat.service
[root@tomcat1 ~]# rsync -ar /usr/local/tomcat root@172.25.253.20:/usr/local/tomcat
创建用户与提权和上一台主机一致
另一台主机配置与上一台主机一致
查看网页情况
四 结合反向代理实现tomcat部署
4.1 常见部署方式介绍
- 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
TOMCAT实现负载均衡
两台tomcat主机都做此操作
4.2 利用 nginx 反向代理实现
利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的host首部
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
location ~ .jsp$ {
proxy_pass http://172.25.254.10:8080;
}
4.3 实现tomcat中的负载均衡
动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压
力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载
均衡。
当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。而这个问题的由
来,都是由于HTTP协议在设计之初没有想到未来的发展。
4.3.1 HTTP的无状态,有连接和短连接
- 无状态:指的是服务器端无法知道2次请求之间的联系,即使是前后2次请求来自同一个浏览器,也
没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie、session机制来判断。 - 有连接:是因为它基于TCP协议,是面向连接的,需要3次握手、4次断开。
-短连接:Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的
影响。所以,自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间
(可设置),浏览器再访问该服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率。
4.3.2 tomcat负载均衡实现
五 Memcached
5.1 Memcached简介
Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统memcached
虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,
让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样
的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢
失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并
提供服务。
5.2 memcached的安装与启动
安装telnet
查看memcached
六 session 共享服务器
6.1 msm 介绍
msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。
项目早期托管在google code,目前在Github
6.2 安装
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
6.3 配置过程
修改tomcat配置
[root@tomcat-1 ~]# vim /usr/local/tomcat/conf/context.xml
@@@@内容省略@@@@
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
/>
[root@tomcat-2 tomcat]# vim /usr/local/tomcat/conf/context.xml
@@@@内容省略@@@@
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFacto
ry"
/>
测试: