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规范的代码

Tomact从入门到进阶_第1张图片

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
    
    
    修改完之后,重启tomcat
    $ systemctl restart tomcat 
    expire session:清除超过指定时间的会话
    只要把webapp放到路径下,然后在网页控制页面中的deploy填写 /test /test2 类似这样
    并创建WEB-INF、META-INF、index.jsp即可

host-manager

此管理应用,需要另一个配置。
    n
    
但是在这里通过图形化界面添加的 虚拟主机,重启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/

综合示例:


    
    
              
    

配置几个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




修改网卡地址为内网地址
  • 配置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.*" %>

    
        Test Page
    
    
         Tomcat One Server  
        
                <% session.setAttribute("magedu.com","magedu.com"); %>
                
Session ID<%= session.getId() %>
Created on <%= session.getCreationTime() %>

<% out.println("hello world"); %> $ 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
    
  • 打开网页进行测试

Tomact从入门到进阶_第2张图片

使用反向代理Tomcat

  • 使用httpd作为反代服务器(需要将之前nginx服务关闭,防止端口冲突)
$ yum install httpd 
$ cd /etc/httpd 
$ vim conf.d/maxie-http.conf 

    ServerName www1.maxie.com
    DocumentRoot "/data/maxie/"
    ProxyRequests Off              # 关闭正向代理
    ProxyVia      On           # 添加首部Via(由谁代理)--> 有可能会httpd被取消掉 
    ProxyPreserveHost On           # 把主机头部发送到后端;保留代理服务器上虚拟主机的头部(域名)
    
        Require all granted
    
    ProxyPass / http://192.168.1.30:8080/          # 把/ 代理到后端服务器的地址
    #或者可以定义成:
    ProxyPass / http://192.168.1.30:8080/test/     # 把 / 代理到后端的 /test 上
    ProxyPassReverse / http://192.168.1.30:8080/   # 把重定向返回给客户端
                                       # 设置代理的/ 允许谁访问
        Require all granted
    
  
$ 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

    ServerName www1.maxiecloud.com
    DocumentRoot "/data/maxie/"
    ProxyRequests Off           
    ProxyVia      On                    
    ProxyPreserveHost On        
    
        Require all granted
    
    ProxyPass / ajp://192.168.1.30:8009/ 
    ProxyPassReverse / ajp://192.168.1.30:8009/ 
     
        Require all granted
    

$ 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

    BalancerMember http://192.168.1.50:8080
    BalancerMember http://192.168.1.60:8080
    ProxySet lbmethod=byrequests


    ServerName www.maxie.com
    ProxyRequests Off                  # 关闭正向代理
    ProxyVia      On               # 添加首部Via(由谁代理)--> 有可能会httpd被取消掉 
    ProxyPreserveHost On               # 把主机头部发送到后端;保留代理服务器上虚拟主机的头部(域名)
    
        Require all granted
    
    ProxyPass / balancer://tomcatsrv/              # 把/ 代理到后端服务器的地址
    
    ProxyPassReverse / balancer://tomcatsrv/       # 把重定向返回给客户端
                                       # 设置代理的/ 允许谁访问
        Require all granted
    
  
$ 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

        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


    ServerName wwww.maxie.com
    ProxyRequests Off
    ProxyVia      On
    ProxyPreserveHost On
    
        Require all granted
    
    ProxyPass / balancer://tomcatsrv/
    ProxyPassReverse / balancer://tomcatsrv/
    
        Require all granted
    
                      # 开启管理负载均衡的接口
        SetHandler balancer-manager         # 启动balancer-manager这个內建功能
        ProxyPass !                         # !表示 不反代,只在本机处理
        Require all granted
    

$ systemctl restart httpd
  • 打开网页测试

你可能感兴趣的:(Tomact从入门到进阶)