tomcat的功能介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和JSP容器起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson,在1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目Tomcat 仅仅实现了Java EE规范中与Servlet、JSP相关的类库,是JavaEE不完整实现。1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 和 JSP 1.1规范。Tomcat 4.x发布时,内建了Catalina(Servlet容器)和 Jasper(JSP engine)等当前 Tomcat 的正式版本已经更新到 10.0.x 版本,但当前企业中主流版本为 8.x 和 7.x官网 :http://tomcat.apache.org/官网文档 :https://tomcat.apache.org/tomcat-8.5-doc/index.html帮助文档 :https://cwiki.apache.org/confluence/display/tomcat/https://cwiki.apache.org/confluence/display/tomcat/FAQ
安装 Tomcat
[root@node2 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.93/bin/apache-tomcat-9.0.93.tar.gz
安装java环境
[root@node1 ~]# yum install java-1.8.0-openjdk.x86_64 -y
安装并启动tomcat
[root@node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@node1 local]# ln -s apache-tomcat-9.0.93/ tomcat
[root@node1 local]# ls
apache-tomcat-9.0.93 etc include lib64 sbin src
bin games lib libexec share tomcat
[root@node1 local]# cd tomcat/
[root@node1 tomcat]# ls
bin CONTRIBUTING.md logs RELEASE-NOTES webapps
BUILDING.txt lib NOTICE RUNNING.txt work
conf LICENSE README.md temp
[root@node1 tomcat]# cd bin/
[root@node1 bin]# ls
bootstrap.jar configtest.sh shutdown.sh
catalina.bat daemon.sh startup.bat
catalina.sh digest.bat startup.sh
catalina-tasks.xml digest.sh tomcat-juli.jar
ciphers.bat makebase.bat tomcat-native.tar.gz
ciphers.sh makebase.sh tool-wrapper.bat
commons-daemon.jar setclasspath.bat tool-wrapper.sh
commons-daemon-native.tar.gz setclasspath.sh version.bat
configtest.bat shutdown.bat version.sh
[root@node1 bin]# pwd
/usr/local/tomcat/bin
[root@node1 bin]# ./startup.sh # 启动脚本
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
查看端口
[root@node1 bin]# netstat -antlupe | grep java
tcp6 0 0 :::8080 :::* LISTEN 0 31426 2461/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 31435 2461/java
访问tomcat
tomcat的文件结构和组成
目录结构
目录 说明
-------------------------------------------------------
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib 库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp 编译后的结果文件,建议提前预热访问
查看tomcat相关目录和文件
[root@node1 ~]# ls /usr/local/tomcat/
bin CONTRIBUTING.md logs RELEASE-NOTES webapps
BUILDING.txt lib NOTICE RUNNING.txt work
conf LICENSE README.md temp
生成tomcat的启动文件
[root@node1 conf]# vim tomcat.conf
[root@node1 conf]# cat tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
[root@node1 conf]# pwd
/usr/local/tomcat/conf
编写执行脚本
[root@node1 conf]# cat /usr/bin/tomcat
#!/bin/bash
case $1 in
start)
/usr/local/tomcat/bin/startup.sh
;;
stop)
/usr/local/tomcat/bin/shutdown.sh
esac
[root@node1 conf]# chmod +x /usr/bin/tomcat
生成启动文件
[root@node1 ~]# useradd -s /sbin/nologin -M tomcat
[root@node1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/
[root@node1 ~]# vim /lib/systemd/system/tomcat.service
[root@node1 ~]# cat /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/bin/tomcat start
ExecStop=/usr/bin/tomcat stop
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable --now tomcat.service
将该主机的tomcat配置,同步到另一台tomcat上,就无需一个一个修改了
[root@node2 ~]# useradd -s /sbin/nologin -M tomcat
# 在node2上创建用户
[root@node2 ~]# ln -s /usr/local/apache-tomcat-9.0.93/ /usr/local/tomcat
[root@node2 ~]# chown -R tomcat:tomcat /usr/local/tomcat/
[root@node1 conf]# rsync -ar /usr/local/apache-tomcat-9.0.93 root@192.168.10.210:/usr/local/apache-tomcat-9.0.93
The authenticity of host '192.168.10.210 (192.168.10.210)' can't be established.
ED25519 key fingerprint is SHA256:4mhtNjCWm/aPk+3yb1NH2JC+5x+6KCPKWkfLOkMz9zU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.10.210' (ED25519) to the list of known hosts.
root@192.168.10.210's password:
[root@node1 conf]# rsync -ar /usr/bin/tomcat root@192.168.10.210:/usr/bin
root@192.168.10.210's password:
[root@node1 conf]# rsync -ar /lib/systemd/system/tomcat.service root@192.168.10.210:/lib/systemd/system/tomcat.service
root@192.168.10.210's password:
[root@node2 ~]# mv /usr/local/apache-tomcat-9.0.93/ /mnt/
[root@node2 ~]# mv /mnt/apache-tomcat-9.0.93/apache-tomcat-9.0.93 /usr/local/
同步时环节出错,文件没有到对的目录下,手动修改
[root@node2 ~]# systemctl restart tomcat.service
[root@node2 ~]# netstat -antlupe | grep java
tcp6 0 0 :::8080 :::* LISTEN 1001 37019 2829/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1001 37028 2829/java
结合反向代理实现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
利用 nginx 反向代理实现
[root@node1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@node1 ~]# ls
公共 视频 文档 音乐 anaconda-ks.cfg test.jsp
模板 图片 下载 桌面 apache-tomcat-9.0.93.tar.gz vmset.sh
# 将写好的jsp文件放到tomcat发布目录下
[root@node1 ~]# scp test.jsp root@192.168.10.210:/usr/local/tomcat/webapps/ROOT/
root@192.168.10.210's password:
test.jsp 100% 968 1.3MB/s 00:00
将文件复制在另一台tomcat realserver上
测试:
修改nginx子配置文件
[root@nginx ~]# cat /usr/local/nginx/conf.d/vhost.conf
server {
listen *:80;
server_name var.haha.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://192.168.10.200:8080;
}
}
访问测试:
实现tomcat中的负载均衡
动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance 负载均衡。当单机 Tomcat ,演化出多机多级部署的时候,一个问题便凸显出来,这就是 Session 。而这个问题的由来,都是由于HTTP 协议在设计之初没有想到未来的发展。
HTTP的无状态,有连接和短连接
- 无状态:指的是服务器端无法知道2次请求之间的联系,即使是前后2次请求来自同一个浏览器,也没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookie、session机制来判断。
浏览器端第一次HTTP请求服务器端时,在服务器端使用session这种技术,就可以在服务器端产生一个随机值即SessionID发给浏览器端,浏览器端收到后会保持这个SessionID在Cookie当中,这个Cookie值一般不能持久存储,浏览器关闭就消失。浏览器在每一次提交HTTP请求的时候会把这个SessionID传给服务器端,服务器端就可以通过比对知道是谁了
Session 通常会保存在服务器端内存中,如果没有持久化,则易丢失Session 会定时过期。过期后浏览器如果再访问,服务端发现没有此 ID ,将给浏览器端重新发新的 SessionID更换浏览器也将重新获得新的 SessionID
- 有连接:是因为它基于TCP协议,是面向连接的,需要3次握手、4次断开。
- 短连接:Http 1.1之前,都是一个请求一个连接,而Tcp的连接创建销毁成本高,对服务器有很大的影响。所以,自Http 1.1开始,支持keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设置),浏览器再访问该服务器就使用这个Tcp连接,减轻了服务器压力,提高了效率。
服务器端如果故障,即使 Session 被持久化了,但是服务没有恢复前都不能使用这些 SessionID 。如果使用 HAProxy 或者 Nginx 等做负载均衡器,调度到了不同的 Tomcat 上,那么也会出现找不到SessionID的情况。
tomcat负载均衡实现
修改nginx子配置文件
测试:
没规定算法的情况下,默认是轮询,但是,无法做到会话保持,跳转一次,到另一台tomcat上,上一台的数据就清空了。所以需要所以ip_hash算法,对cookic值进行hash
测试访问: