Tomact从入门到进阶

tomcat从入门到进阶

Tomat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器。由于Tomcat本身也包含了一个HTTP服务器,它可以被视作一个单独的WEB服务器。不过HTTP服务器是C语言实现的Web服务器,而Tomcat则是由Java编写。


什么是Servlet呢? Servlet,全称 Java Servlet,是用Java编写的服务器端程序,主要功能在于交互式的浏览和修改数据,生成动态Web内容。

JSP代码运行过程

index.jsp –> 由jasper转换 –> index_jsp.java–> 通过javac编译器 –> 生成类文件 index_jsp.class –> 在(engine上)jvm虚拟机上运行
基于jsp将静态输出的数据转为java代码进行输出,结果为Servlet规范的代码

Java代码运行过程

.java –> javac –> .class(bytecode字节码)

JVM运行时区域

方法区   :   用于存储被JVM加载的class信息、常量、静态变量,方法等
堆       :  是jvm所管理的内存中占用空间最大的一部分,也是GC管理的主要区域,用
            来存储对象信息
栈       :  线程私有,存储线程自己的局部变量
PC寄存器 :  线程私有的内存空间,程序的指令指针
GC      :  垃圾回收,回收堆中不再使用的空间

JDK

在Linux下想要运行tomcat,就必须依赖JDK环境了,这里我们使用的JDK版本是java-1.8.0-openjdk。openjdk是jdk的一个分支,也是其开源的项目。

安装JDK

由于使用的是Centos 7,所以在base仓库就已经提供了3种openjdk版本:

$ yum list all *jdk*
java-1.6.0-openjdk
java-1.7.0-openjdk
java-1.8.0-openjdk

这里我们使用java-1.8.0-openjdk版本

$ yum install java-1.8.0-openjdk
$ java -version

为了防止其他程序要使用java时找不到JAVA_HOME,我们这里手动配置JAVA_HOME

$ vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
$ . /etc/profile.d/java.sh

如果是使用Oracle版本的JDK,其默认安装在/usr/java/jdk_VERSION路径下

$ vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk_VERSION
export PATH=$JAVA_HOME/bin:$PATH
$ . /etc/profile.d/java.sh

安装完jdk之后,我们就可以开始安装和配置Tomcat了!

Tomcat安装与配置

安装Tomcat
  • 使用base仓库安装

      $ yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
    
  • 使用官方二进制版本安装

$ wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.16/bin/apache-tomcat-8.5.16.tar.gz
$ tar -xf  apache-tomcat-8.5.16.tar.gz -C /usr/local/
$ cd /usr/local
$ ln -sv apache-tomcat-8.5.16 tomcat

注意这里使用软连接的方式,是为了生产环境中,如果需要版本升级时,可以很好的进行替换操作,只需将连接修改至新版本即可。

如果使用了二进制版本安装,我们就需要手动添加环境变量了:

$ vim /etc/profile.d/tomcat.sh 
export CATALINA_BASE=/usr/local/tomcat 
export PATH=$CATALINA_BASE/bin:$PATH
$ . /etc/profile.d/tomcat.sh

Tomcat程序环境

tomcat的目录结构

bin         脚本,及启动时用到的类
conf        配置文件目录
lib         库文件,Java类库,jar
logs        日志文件目录
temp        临时文件目录
webapps     webapp的默认目录
work        工作目录
ROOT        存放主站的文件,就是访问 / 的显示的页面

rpm包安装的程序环境

配置文件目录:/etc/tomcat
主配置文件:/etc/tomcat/server.xml
认证用户配置文件:/etc/tomcat/tomcat-users.xml
webapps存放位置:/var/lib/tomcat/webapps/
Unit File:/usr/lib/systemd/system/tomcat.service
环境配置文件:/etc/sysconfig/tomcat

运行Tomcat进程的用户

默认为tomcat用户,但无权监听80端口

使用authbind程序使tomcat用户可以监听80端口

$ wget https://s3.amazonaws.com/aaronsilber/public/authbind-2.1.1-0.1.x86_64.rpm
$ yum install -y ./authbind-2.1.1-0.1.x86_64.rpm
$ chmod 755 /etc/authbind/port/80 
$ chown test.test /etc/authbind/port/80 
$ authbind --deep systemctl restart tomcat

authbind-github下载

tomcat的配置文件

配置文件路径          /etc/tomcat/conf 
server.xml          主配置文件
web.xml             每个webapp只有"部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置
context.xml         每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置
tomcat-users.xml    用户认证的账号和密码文件
catalina.policy     当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.properties  日志系统相关的配置

二进制安装中 catalina.sh脚本使用方法

debug             测试模式
debug -security   安全策略的测试模式
run               运行为守护进程
run -security     安全策略模式启动
start             运行为守护进程
start  -security  安全策略模式启动
stop              停止
stop n            等待几秒后停止
stop -force       强制停止
stop n -force     几秒后强制停止
version           版本
$ catalina.sh start         #启动tomcat
$ catalina.sh version       #查看tomcat版本

JSP WebAPP的组织结构

路径                 /var/lib/tomcat/webapps
/                   webapps的根目录
    index.jsp       主页文件
    WEB-INF/        当前webapp的'私有资源路径';通常用于存储当前webapp的web.xml和context.xml配置文件
    META-INF/       类似于WEB-INF/
    classes/        类文件,当前webapp所提供的类
    lib/            类文件,当前webapp所提供的类,被打包为jar格式

部署deploy webapp的相关操作

deploy      将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问此webapp
undeploy    反部署,停止webapp,并从tomcat实例上卸载webapp
start       启动处于停止状态的webapp
stop        停止webapp,不再向用户提供服务;其类依然在jvm上
redeploy    重新部署

部署有两种方式

自动部署:auto deploy(可能需要重启)
手动部署:
    冷部署:把webapp复制到指定的位置,而后才启动tomcat
    热部署:在不停止tomcat的前提下进行部署
部署工具:manager、ant脚本、tcd(tomcat client deployer)等

tomcat的两个管理应用

manager

不用关闭tomcat,完成webapp的热部署
使用此功能,需要先配置用户和密码:
    conf/tomcat-user.xml
    $ vim tomcat-user.xml
    <role rolename="manager-gui">
    <user username="tomcat" password="tomcat" roles="manager-gui" />
    修改完之后,重启tomcat
    $ systemctl restart tomcat 
    expire session:清除超过指定时间的会话
    只要把webapp放到路径下,然后在网页控制页面中的deploy填写 /test /test2 类似这样
    并创建WEB-INF、META-INF、index.jsp即可

host-manager

此管理应用,需要另一个配置。
    <role rolename="admin-gui">n
    <user username="tomcat" password="tomcat" roles="admin-gui" />
但是在这里通过图形化界面添加的 虚拟主机,重启tomcat后,就会失效,需要定义在 server.xml

Tomcat的常用组件配置

Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口
Service:用于实现将一个或多个connector组件关联至一个engine组件
Connector组件:
    负责接收请求,常见的有三类http/https/ajp;
    进入tomcat的请求可分为两类:
        (1) standalone : 请求来自于客户端浏览器;
        (2) 由其它的web server反代:来自前端的反代服务器;
            nginx --> http connector --> tomcat 
            httpd(proxy_http_module) --> http connector --> tomcat
            httpd(proxy_ajp_module) --> ajp connector --> tomcat 
            http(mod_jk) --> ajp connector --> tomcat 
    
    参数:
        address:监听的IP地址;默认为本机所有可用地址
        maxThreads:最大并发连接数,默认为200
        enableLookups:是否启用DNS查询功能
        acceptCount:等待队列的最大长度
        
Engine组件:
    Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定义默认的虚拟主机
    
Host组件:
    位于engine内部用于接收请求并进行相应处理的主机或虚拟主机
    
    参数:
        (1)'appBase':此Host的'webapps的默认存放目录',指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;
        (2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否'自动将其部署至tomcat;'
        (3) unpackWARs:是否自动解开 WAR 文件
注意:'这里如果是新建的HOST,主页的文件资源必须放在appBase指定的目录下的ROOT目录下,否则将无法访问'
Context组件:(类似于nginx中的alias)
    参数:
        path:URL路径
        reloadable:是否支持自动装载
        docBase:系统文件路径
Valve组件:
    参数:
        定义访问日志:org.apache.catalina.valves.AccessLogValve
        定义访问控制:org.apache.catalina.valves.RemoteAddrValve 
        pattern:日志格式
        prefix:日志前缀
        suffix:日志后缀
    日志路径:
        rpm安装:/var/log/tomcat/
        绿色安装:/usr/local/tomcat/logs/

综合示例:

<Host name="www.maxie.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
        prefix="node1_access" suffix=".log"
        pattern="%h %l %u %t "%r" %s %b" />
    <Context path="/test" docBase="test" reloadable="">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
        prefix="node1_test_access_" suffix=".log"
        # 设置为combined格式的日志
        pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i" />      
    </Context>
</Host>

配置几个Tomcat示例

简单测试页 配置
  • 安装Tomcat
安装所需要的包:
$ yum install -y java-1.8.0-openjdk-devel tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp 
配置tomcat.users.xml 
$ vim /etc/tomcat/tomcat.users.xml
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui"/>
<role rolename="manager-gui"/>
<user username="maxie" password="maxie" roles="manager-gui"/>
修改网卡地址为内网地址
  • 配置Tomcat测试页
$ mkdir /usr/share/tomcat/webapps/test/{classes,META-INF,WEB-INF}
$ vim /usr/share/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>Test Page</title>
    </head>
    <body>
        <font size=10 color="#38B0DE" > Tomcat One Server  </font>
        <table align="centre" border="1">
        <tr>
                <td>Session ID</td>
                <% session.setAttribute("magedu.com","magedu.com"); %>
                <td><%= session.getId() %></td>
        </tr>
        <tr>
                <td>Created on</td>
                        <td><%= session.getCreationTime() %></td>
                </tr>
        </table>
        <br>
        <% out.println("hello world");
        %>
    </body>
</html>
$ systemctl restart tomcat
  • 使用nginx作为反向代理tomcat
$ yum install nginx 
$ vim /etc/nginx/nginx.conf
upstream 
server {
    listen 80;
    server_name www1.maxie.com;
    location / {
        proxy_pass http://192.168.1.30:8080;
    }
}
$ systemctl start nginx
  • 修改客户端HOSTS文件

      $ sudo vim /etc/hosts
      172.16.3.10 www1.maxie.com
    
  • 打开网页进行测试

使用反向代理Tomcat

  • 使用httpd作为反代服务器(需要将之前nginx服务关闭,防止端口冲突)
$ yum install httpd 
$ cd /etc/httpd 
$ vim conf.d/maxie-http.conf 
<VirtualHost *:80>
    ServerName www1.maxie.com
    DocumentRoot "/data/maxie/"
    ProxyRequests Off              # 关闭正向代理
    ProxyVia      On           # 添加首部Via(由谁代理)--> 有可能会httpd被取消掉 
    ProxyPreserveHost On           # 把主机头部发送到后端;保留代理服务器上虚拟主机的头部(域名)
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / http://192.168.1.30:8080/          # 把/ 代理到后端服务器的地址
    #或者可以定义成:
    ProxyPass / http://192.168.1.30:8080/test/     # 把 / 代理到后端的 /test 上
    ProxyPassReverse / http://192.168.1.30:8080/   # 把重定向返回给客户端
    <Location />                                   # 设置代理的/ 允许谁访问
        Require all granted
    </Location>
</VirtualHost>  
$ httpd -M | grep proxy                                 # 确保 proxy_http 模块装载
$ httpd -t 
$ systemctl start httpd
  • 使用ajp协议进行通信(确保 proxy_ajp_module装载)
$ cp conf.d/maxie-http.conf conf.d/maxiecloud-ajp.conf
$ vim conf.d/maxiecloud-ajp.conf
<VirtualHost *:80>
    ServerName www1.maxiecloud.com
    DocumentRoot "/data/maxie/"
    ProxyRequests Off           
    ProxyVia      On                    
    ProxyPreserveHost On        
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / ajp://192.168.1.30:8009/ 
    ProxyPassReverse / ajp://192.168.1.30:8009/ 
    <Location /> 
        Require all granted
    </Location>
</VirtualHost>
$ systemctl restart httpd

使用nginx/httpd负载均衡Tomcat

这时需要两台Tomcat机器,两台配置一样。只需复制之前做的一台上的配置文件以及/test测试jsp文件

使用nginx反向代理调度器对tomcat实现负载均衡

  • 停止httpd服务

      $ systemctl stop httpd
    
  • 配置nginx

$ vim /etc/nginx/conf.d/maxie.conf 
upstream tomcatsrv {
    server 192.168.1.50:8080;
    server 192.168.1.60:8080;
}
server {
    listen          80;
    server_name     www.maxie.com;
    
    location / {
        proxy_pass http://tomcatsrv;
    }
}
$ systemctl restart nginx
  • 打开网页进行测试

如需设置会话保持功能:

$ vim /etc/nginx/conf.d/maxie.conf
在upstream中添加
hash $request_uri consistent;
或者
ip_hash;
或者
hash $cookie_name consistent;

使用httpd作为反向代理时,对后端2台tomcat实现负载均衡

  • 停止nginx服务

      $ systemctl stop nginx
    
  • 配置httpd

$ vim /etc/httpd/conf.d/maxie-http.conf
<Proxy balancer://tomcatsrv>
    BalancerMember http://192.168.1.50:8080
    BalancerMember http://192.168.1.60:8080
    ProxySet lbmethod=byrequests
</Proxy>
<VirtualHost *:80>
    ServerName www.maxie.com
    ProxyRequests Off                  # 关闭正向代理
    ProxyVia      On               # 添加首部Via(由谁代理)--> 有可能会httpd被取消掉 
    ProxyPreserveHost On               # 把主机头部发送到后端;保留代理服务器上虚拟主机的头部(域名)
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / balancer://tomcatsrv/              # 把/ 代理到后端服务器的地址
    
    ProxyPassReverse / balancer://tomcatsrv/       # 把重定向返回给客户端
    <Location />                                   # 设置代理的/ 允许谁访问
        Require all granted
    </Location>
</VirtualHost>  
$ httpd -t
$ systemctl restart httpd
  • 打开网页测试即可,效果如nginx代理一样
  • httpd负载均衡实现会话粘性并开启httpd內建的负载均衡状态页
$ vim /etc/httpd/conf.d/maxie-http.conf
Header add Set-Cookie "MYID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://tomcatsrv>
        BalancerMember http://192.168.1.50:8080 route=tom1 loadfactor=2
        BalancerMember http://192.168.1.60:8080 route=tom2 loadfactor=1
        ProxySet lbmethod=byrequests
        ProxySet stickysession=MYID
</Proxy>
<VirtualHost *:80>
    ServerName wwww.maxie.com
    ProxyRequests Off
    ProxyVia      On
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / balancer://tomcatsrv/
    ProxyPassReverse / balancer://tomcatsrv/
    <Location />
        Require all granted
    </Location>
    <Location /http-stats>                  # 开启管理负载均衡的接口
        SetHandler balancer-manager         # 启动balancer-manager这个內建功能
        ProxyPass !                         # !表示 不反代,只在本机处理
        Require all granted
    </Location>
</VirtualHost>
$ systemctl restart httpd
  • 打开网页测试
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • Java语言介绍Java EE和TomcatTomcat的主要配置Tomcat的管理工具Tomcat的反向代理 一...
    哈喽别样阅读 531评论 0 0
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,143评论 11 349
  • CocoaLumberjack是Mac和iOS上一个集快捷、简单、强大和灵活于一身的日志框架。其下载地址:http...
    sincere_bs阅读 771评论 0 6
  • 简直不要太弱,做了十几分钟的马甲线训练,做完10组简易burpee,觉得自己不行了,心跳超快,眼睛有点晕,就赶紧停...
    丁信子阅读 221评论 0 0
  • 一转眼间第四周又过完了,在第四周里,我的任务开始提前了,每天写的字也开始加倍了,本来是写一页,但现在我每天...
    薛义之Harry阅读 406评论 0 2