企业级WEB应用服务器TOMCAT

tomcat的功能介绍

 

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和JSP容器起始于SUN 公司的一个Servlet的参考实现项目 Java Web Server,开发者是 James Duncan Davidson
1999年,将项目贡献给了apache软件基金会(ASF),和ASF现有的项目 JServ 合并,并开源成为顶级项目
Tomcat 仅仅实现了Java EE规范中与ServletJSP相关的类库,是JavaEE不完整实现。
1999年发布初始版本是Tomcat 3.0,实现了Servlet 2.2 JSP 1.1规范。
Tomcat 4.x发布时,内建了CatalinaServlet容器)和 JasperJSP 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的启动文件  

生成 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 反向代理实现 

利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机
利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的host首部

 

[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次请求来自同一个浏览器,也没有任何数据能够判断出是同一个浏览器的请求。后来可以通过cookiesession机制来判断。

                      浏览器端第一次HTTP请求服务器端时,在服务器端使用session这种技术,就可以在服务器端产生一个随机值即SessionID发给浏览器端,浏览器端收到后会保持这个SessionIDCookie当中,这个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

 测试访问:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值