java技术基础,tomcat核心和配置,(第37天)

编程语言:
系统级:C, C++, go, erlang
应用级:C#, Java, Python, Perl, Ruby, php
语言的虚拟机:jvm, pvm,该虚拟机提供自己语言的运行时环境
动态网站:asp.net(C#),   jsp(java), Django, Flask,

tips:
C语言写出来的程序,如果调用准寻POSIX规范的API,则可以达到一次编写,到处编译,也就是在各个不同的系统上编译。



动态网站:
客户端动态:applet
服务器动态:CGI,通用网关接口



webapp server:    webapp服务
jsp: tomcat, jboss, jetty
php: php-fpm



Java编程语言:
            SUN, James Gosling, Green Project, Oak, Java, SunWorld
            1995: Java 1.0, Write Once, Run Anywhere
            1996: JDK (Java Development Kit),包含一个JVM(Sun Classic VM)
                JDK 1.0: JVM, Applet, AWT
            1997:JDK 1.1
                JAR文档格式、JDBC、JavaBeans
            1998:JDK 1.2
                Sun把Java技术分拆为三个方向:Java 2
                    J2SE: Standard Edition
                    J2EE:Enterprise Edition   企业版java
                    J2ME:Mobile Edition   已废弃
                代表性技术:EJB, Java Plug-in, Swing,
                    JIT编译器: Just In Time,即时编译器

            2000:JDK 1.3
                1999:HotSpot虚拟机
            2002:JDK 1.4

            2006年,Sun开源了Java技术;遵循GPL规范;并建立了OpenJDK组织管理此些代码;

            java虚拟机:JRockit, HostSpot;




编程语言的类别:指令+数据
面向过程:以指令为中心,围绕指令组织数据;
面向对象:以数据为中心,围绕数据组织指令;


Java体系结构:
java编程语言;
Java Class文件格式;java字节码,可以运行于jvm
Java API;
Java VM;






JVM的组成:




Java编程语言的特性:
面向对象、多线程、结构化错误处理
垃圾收集、动态链接、动态扩展



三个技术流派:
J2SE ==> Java 2 SE
J2EE ==> Java 2 EE
J2ME ==> Java 2 ME




JVM运行时区域:运行为多个线程
方法区:线程共享;用于存储被虚拟机加载的类信息、常量、静态变量等;永久代;
堆:Java堆是jvm所管理的内存中最大的一部分;也是GC管理的主要区域,主流的算法都基于分代收集方式进行:新生代和老年代;线程共享
Java栈:线程私有,存放线程自己的局部变量等信息;
PC寄存器(Program Counter Register),线程独占的内存空间;
本地方法栈:





JAVA 2 EE包含有的技术:
JAVA 2 SE
Servlet, JSP, EJB, JMS, JMX, JavaMail



Servlet Contaier:servlet容器
println("<h1>")

html标签要硬编码在应用程序中;


JSP技术:让java代码可以嵌入到html网页中
<html>
<body>
<h1>...</h1>
<%
%>
</body>
</html>


java web container 包含的组件有:jdk, servlet,jsp


java web container 商业实现:
                    WebSphere(IBM)
                    WebLogic (BEA --> Oracle)
                    Oc4j
                    Glassfish
                    Geronimo
                    JOnAS
                    JBoss



java web container 开源实现:
                    Tomcat
                    jetty
                    resin




jsp的解析过程:






Tomcat的核心组件包括如下3个:catalina,Coyote,Jasper
 catalina: servlet container(servlet container),实现了servlet类
 Coyote: http connection,接受http请求并处理响应
 Jasper: JSP Engine (JSP引擎),Tomcat提供了一个Jasper编译器用以将JSP编译成对应的Servlet。

所以tomcat内置了http服务器



Tomcat的开发语言:JAVA






Tomcat Instance: 运行中的tomcat进程包含如下的组件:
Server: 即一个tomcat实例;
Service: 用于将connector关联至engine组件;一个service只能包含一个engine组件和一个或多个connector组件;
Engine:Tomcat的核心组件,用于运行jsp或servlet代码;
Connector:接入并解析用户请求,将请求映射为Engine中运行的代码;之后,将运行结果构建成响应报文;可以处理http, ajp等协议报文
Host:类似httpd中的虚拟主机;
Context:类似于httpd中的alias;

注意:上面的每个组件都由“类”来实现,有些组件的实现还不止一种;
顶级类组件:server
服务类组件:service
容器类组件:即可以部署webapp的组件,engine, host, context
连接器组件:connector
被嵌套类组件:valve, logger, realm




XML格式:
                <server>
                    <service>
                        <connector />
                        <connector />
                        ...
                        <engine>
                            <host>
                                <context />
                                <context />
                                ...
                            </host>
                            ...
                        </engine>
                    </service>
                </server>





Tomcat的运行模式:
standalone:通过内置的web server (http connector)来接收客户端请求;
proxy:代理模式,由专门的web server(比如nginx)服务客户端的http请求;
    in-process: 部署于同一主机;
    network: 部署于不同主机;




tomcat的安装:
官方站点:http://tomcat.apache.org
部署前提:jdk:
     Oracel JDK
     OpenJDK


安装openjdk的步骤:
1:   apt search openjdk-11-jdk   搜索软件包
2:   apt install  openjdk-11-jdk    安装软件包
3: 设置java的环境变量
     vim  /etc/profile.d/java.sh  输入如下内容:
        export JAVA_HOME=/usr/lib/jvm/default-java
        export PATH=$JAVA_HOME/bin:$PATH
4:重读此文件   source  /etc/profile.d/java.sh


安装tomcat:
1: wget -c "http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz"   下载
      tar -xvf apache-tomcat-8.5.38.tar.gz  -C /usr/share/   解压
      mv /usr/share/apache-tomcat-8.5.38  /usr/share/tomcat8  重命名目录
2:设置环境变量
      vim  /etc/profile.d/tomcat.sh   输入如下内容
      export  CATALINA_HOME=/usr/share/tomcat8
      export  PATH=$CATALINA_HOME/bin:$PATH
3:重读此文件   source  /etc/profile.d/tomcat.sh
4:catalina.sh start   即可启动tomcat,就会默认运行于8080端口(ss -tnpl 可以查看8080端口是否已经监听了)





 Tomcat的目录结构:
            bin: 脚本及启动时用到的类
            lib: 类库
            conf: 配置文件
            logs: 日志文件
            webapps: 应用程序默认部署目录,应用程序代码放置在此处
            work:工作目录,jsp解析为servlet,jvm加载运行servlet类等
            temp:临时文件目录


tomcat的配置文件有如下几种:
            server.xml: 主配置文件
            context.xml:每个webapp都可以有专用的配置文件,这些配置文件通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC等;conf/context.xml是为各webapp提供默认配置;
            web.xml:每个webapp“部署”之后才能被访问;此文件则用于为所有的webapp提供默认部署相关的配置;
            tomcat-users.xml:用户认证的账号和密码配置文件;
            catalina.policy:当使用-security选项启动tomcat实例时会读取此配置文件来实现其安全运行策略;
            catalina.properties:Java属性的定义文件,用于设定类加载器路径等,以及一些JVM性能相关的调优参数;
            logging.properties:日志相关的配置信息;




tomcat目录下的bin目录保存了一些可运行文件,其中catalina.sh的用法如下:
root@kali:/usr/share/tomcat8# catalina.sh 
Using CATALINA_BASE:   /usr/share/tomcat8
Using CATALINA_HOME:   /usr/share/tomcat8
Using CATALINA_TMPDIR: /usr/share/tomcat8/temp
Using JRE_HOME:        /usr/lib/jvm/default-java
Using CLASSPATH:       /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
Usage: catalina.sh ( commands ... )
commands:
  debug             Start Catalina in a debugger
  debug -security   Debug Catalina with a security manager
  jpda start        Start Catalina under JPDA debugger
  run               Start Catalina in the current window
  run -security     Start in the current window with security manager
  start             Start Catalina in a separate window
  start -security   Start in a separate window with security manager
  stop              Stop Catalina, waiting up to 5 seconds for the process to end
  stop n            Stop Catalina, waiting up to n seconds for the process to end
  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running
  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running
  configtest        Run a basic syntax check on server.xml - check exit code for result
  version           What version of tomcat are you running?
Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined





Java WebAPP 的组织结构:
有特定的组织形式、层次型的目录结构;主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等;
            /usr/local/tomcat/webapps/app1/
                /: webapp的根目录;
                WEB-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的web.xml;
                META-INF/:当前webapp的私有资源目录,通常存放当前webapp自用的context.xml;
                classes/: 此webapp的私有类;
                lib/: 此webapp的私有类,被打包为jar格式类;
                index.jsp:webapp的主页



java  webapp归档格式:java web应用的格式
.war:webapp;
.jar:EJB的类;
.rar:资源适配器;
.ear:企业级应用程序;






手动添加一个测试应用程序:
        1、创建webapp特有的目录结构;
            mkdir -pv myapp/{lib,classes,WEB-INF,META-INF}
                  这里没有提供web.xml和context.xml文件,所以这个应用默认的conf目录下的配置文件web.xml和context.xml的配置信息,   局部覆盖全局。
        2、提供webapp各文件;
            vim  myapp/index.jsp
                <%@ page language="java" %>
                <%@ page import="java.util.*" %>
                <html>
                    <head>
                        <title>JSP Test Page</title>
                    </head>
                    <body>
                        <% out.println("Hello, world."); %>
                    </body>
                </html>




部署(deployment)webapp相关的操作:
deploy:部署,将webapp的源文件放置于目标目录、配置tomcat服务器能够基于context.xml文件中定义的路径来访问此webapp; 将其特有类通过class loader装载至tomcat;
具体有两种方式:自动和手动
自动部署:auto deploy
手动部署有如下2中方法:
1、冷部署:把webapp复制到指定位置,而后才启动tomcat;
2、热部署:在不停止tomcat的前提下进行的部署:

部署工具有:manager、ant脚本、tcd(tomcat client deployer)等;


undeploy:反部署,停止webapp,并从tomcat实例拆除其部分文件和部署名;
stop:停止,不再向用户提供服务;
start:启动处于“停止”状态的webapp;
redeploy:重新部署;





tomcat自带的应用程序:
manager app: webapp管理工具
host manager:Virtual Hosts管理工具

要使用这些自带的应用程序必须在conf/tomcat-users.xml文件中配置用户名和密码:
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>

<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui"/>




tomcat的主配置文件server.xml结构:
        <server attribute="value" attribute2="value">
            <service>
                <connector />
                <connector />
                <engine >
                    <host name="虚拟主机1的名称">
                    </host>
                    <host name="虚拟主机2的名称">
                    </host>
                    <host name="虚拟主机3的名称">
                        <context />   这里是context1
                        <context />   这里是context2
                    </host>                                     
                </engine>
            </service>
        </server>

Server: 即一个tomcat实例;
Service: 用于将connector关联至engine组件;一个service只能包含一个engine组件和一个或多个connector组件;
Connector:接入并解析用户请求,将请求映射为Engine中运行的代码;之后,将运行结果构建成响应报文;可以处理http, ajp等协议报文
Connector代表连接组件。Tomcat 支持三种协议:HTTP/1.1、HTTP/2.0、AJP。
Engine:Tomcat的核心组件,用于运行jsp或servlet代码;
Host元素表示一个虚拟主机,它是一个服务器的网络名称(如“www.mycompany.com”)与运行Tomcat的特定服务器的关联。
Context元素表示一个Web应用程序,它在特定的虚拟主机中运行。每个Web应用程序都基于Web应用程序存档(WAR)文件,或者包含相应的解包内容的相应目录,如Servlet规范述。


AJP: apache jserv protocol, 二进制协议;





在server.xml文件中自定义Host及Context示例:
          <Host name="web1.magedu.com" appBase="/data/webapps/" unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="ROOT" reloadable="true">
              <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                   deny="172\.16\.100\.100"/>
            </Context>
            <Context path="/shop" docBase="shopxx" reloadable="true" />
            <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"
                   prefix="web1_access_log" suffix=".txt"
                   pattern="%h %l %u %t "%r" %s %b" /> 
          </Host>
 注意:path给定的路径不能以“/”结尾;
Context 中的path表示浏览器的访问路径,docBase表示网页程序的放置路径,docBase可以是绝对路径,docBase如果是相对路径是相对于Host标签中的appBase的





tomcat一般不会直接接受用户http请求,而是由nginx来直接接处理用户的http请求,nginx对于静态内容可以直接响应,然后自己扮演反向代理服务器将动态请求转发给tomcat处理,tomcat处理好动态请求后,将响应发送给nginx,由nginx将动态内容响应给发出该请求的用户。



流程如下:
LNMT:Linux nginx mysql tomcat
client -->http --> nginx --> reverse_proxy --> http --> tomcat (http connector)

nginx.conf配置文件:
location ~* \.(jsp|do)$ {
            proxy_pass http://web1.magedu.com:8080;
        }



LAMT:linux apache2 mysql tomcat
        client --> http --> httpd --> reverse_proxy --> {http|ajp} --> tomcat {http connector|ajp connector}

httpd的反代模块:
主:proxy_module
子:proxy_module_http, proxy_module_ajp,分别基于http和ajp协议


        httpd.conf文件的配置:
        proxy_module_http:
            <VirtualHost *:80>
                ServerName web1.magedu.com
                ProxyVia On     添加代理头部
                ProxyRequests Off        关闭正向代理
                ProxyPreserveHost On  添加用户请求头部的host到请求头部中
                <Proxy *>
                    Require all granted
                </Proxy>
                ProxyPass / http://172.16.100.67:8080/
                ProxyPassReverse / http://172.16.100.67:8080/
                <Location />
                    Require all granted
                </Location>
            </VirtualHost>

        proxy_module_ajp:
            <VirtualHost *:80>
                ServerName web1.magedu.com
                ProxyVia On
                ProxyRequests Off
                ProxyPreserveHost On
                <Proxy *>
                    Require all granted
                </Proxy>
                ProxyPass /status !    这表示访问/status不走代理
                ProxyPass / ajp://172.16.100.67:8009/
                ProxyPassReverse / ajp://172.16.100.67:8009/
                <Location />
                    Require all granted
                </Location>
            </VirtualHost>






















评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用