2017-11-03_190947.jpg

Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阈等。但是不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器时一个用C语言实现的HTTP web服务器,而Tomcat则是由Java编写。

一、java

Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。Java的特点之一面向对象,是程序设计方法的一种。

程序是由指令和数据组成。
过程式编程:以指令为中心,数据服务于代码
对象式编程:以数据位中,指令服务于数据

1、Java代码编译过程

java%E8%BF%87%E7%A8%8B.png

用java语言编译源代码,通过JAVAC (Java complie)它编译成java .class(bytes code)文件,然后在Java VM中运行.class文件;当编写程序时,通过调用类(API class)中的方法来访问系统资源,而当程序运行时,它通过调用class文件中实现Java API的方法来满足程序的Java API调用。Java VM 和Java API一起组成一个平台,被称为JDK(Java Development Kit),所有的Java程序都在其上编译和运行。

Java VM主要任务时装载class文件并且执行其中的字节码,加载程序的类文件即程序的类文件依赖到的其他的类文件而后运行,整个运行表现为一个jvm进程。它包含一个类装载器(class loader)可以从程序和API装载class文件;但是Java API的类只在程序执行中需要时才会装载。

2、Java API

Java SE包含了Java二进制程序(如JVM和Java字码编译器)和Java的核心代码库;而Java EE标准则包含了一组适用于创建企业级Web应用程序API。Java EE是建立在Java SE基础之上;它包含了多个独立的API,如Servlet和JSP等

3、Java VM 内部体系结构

2017-11-03_200219.jpg

方法区线程共享,用于存储被JVM加载的class信息、常量、静态变量、方法等

JVM所管理的内存中占用空间最大的一部分;也是GC管理的主要区域;存储对象

线程私有,存储线程自己的局部变量

PC寄存器线程私有的内存空间,程序的指令指针

本地方法栈执行引擎调用本地方法是的运行时聂村去

JVM的功能模块主要包括类加载器、执行引擎和垃圾回收系统。

-- JVM组成

JRE(JVM+java SE API):是用于实现java程序运行的最小环境
JDK(Java+API+JVM):是用于实现Java程序开发的最小环境

3、JSP代码运行过程

tomcat-http-guocheng.jpg

index.jsp-->jasper-->servert Source Code(.java)-->Java Compiler (.class)-->在JVM虚拟机上运行

注意:基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码。

二、Tomcat

Tomcat不是一个完整意义上的Java EE服务器,甚至没有提供对一个主要java EE API。由于遵守apache开源协议,tomcat为众多java应用程序服务器嵌入自己的产品中构建商业的java应用程序服务器,如JBoss等

1、JSP和Servlet区别

Servlet通常需要实现编译好,而JSP则并非必须事先编译。这意味着Servlet通常放置于私有资源区域,而JSP则通常以嵌入代码的方式包含于HTML页面文件中,这些HTML文件通常放置在公开资源区域。

2、MVC架构

MVC架构由Contoller、Model和View构成,实现Apache Structs框架。

a、Servlet用于实现应用逻辑
b、JSP用于内容展示
c、标签库和JSP扩展语言用于替换JSP内部嵌入Java代码,进而降低了HTML维护的复杂度
d、MVC框架用于实现展示和应用逻辑分离

3、Servlet目录结构

对于一个web应用程序而言,其通常由Servlet、JSP和其他文件等共同组成。这些文件通常被打包成WAR(Web Application Archive)格式,并以.war作为打包后的文件扩展名。而Servlet规范则定义了在WAR内部组织这些文件的标准目录结构。

/   :web应用程序的根目录,所有可被公开访问的文件均放置于此处,如HTML、JSP和图片文件等
/WEB-INF :此目录为私有资源目录,其内部的所有文件和子目录不能被公开访问;包含此web应用程序的配置文件web.xml,通常放置于此目录
/WEB-INF/classes:当前web应用程序的类文件存在目录
/WEB-INF/lib:可被打包为JAR格式的类文件通常放置于此目录

java-http.png

4、Tomcat目录

bin:脚本,即启动时用到的类
conf:配置文件目录
lib:库文件,Java类库,jar
logs:日志文件目录
temp:临时文件目录
webapps:webapp的默认目录
work:工作目录,存放编译后的字节码文件

5、Tomcat文件

  • server.xml tomcat主配置文件,包含service、connector、engine、realm、valve、host相关配置信息

  • web.xml 每个webapp只有“部署”后才能被访问,它的部署方式通常有web.xml进行定义,其存放的位置为WEB-INF/目录下,次文件为所有的webapps提供默认部署相关的配置

  • context.xml 每个文本app都可以使用的配置文件,它通常有专用的配置文件contest.xml来定义,其存放位置为WEB-INF/目录下

  • tomcat-user.xml realm认证时用到的相关角色、用户和密码等信息;tomcat自带的manager默认情况下会用到此文件。此文件在tomcat启动时被装入内存

  • catalina.policy 当使用-security选项启动tomcat时,用于为tomcat设置安全策略

  • catalina.properties Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数

  • logging.properties 日志系统相关的配置

server.xml组件

2017-11-03_221835.jpg

Tomcat组件

顶级组件:位于配置层次的顶级,并且彼此间有着严格的对应关系(server、service)
连接器:连接客户端请求至servlet(connector)
容器:包含一组其他组件(engine、host、context)
被嵌套的组件:位于一个容器当中,但不能包含其他组件(valve、logger、realm)





        <Server>
            <Service>
                <connector/>
                <connector/>
                ...
                <Engine>
                    <Host>
                        <Context/>
                        <Context/>
                        ...
                    </Host>
                    <Host>
                        ...
                    </Host>
                    ...
                </Engine>
            </Service>
        </Server>
tomcat常用组件配置
  • server:代表tomcat instance,即表现出一个java进程;监听在8005端口,只能接受“SHUTDOWN”指令。各server监听的端口不能相同,因此在同一物理主机启动多个示例时,需要修改其监听端口为不同的端口。这个端口的定义为管理员提供一个关闭此示例的便捷途径,管理员可以直接使用telnet命令连接此端口SHUTDOWN关闭此示例。基于安全角度考虑,通常不允许远程进行

  • service:用于实现将一个或多个connector组件关联至一个engine组件

    className:用于实现service的类名 name:此服务的名称,默认为catalina

  • connector:负责接收请求,常见的有三类http、https、ajp

    address:指定连接器监听的地址,默认为所有地址maxThreads:支持的最大并发连接数,默认为200 port:监听的端口,默认为0 protocol:连接器使用的协议,默认为HTTP/1.1,定义AJP协议时通常为AJP/1.3redirectPort:如果某连接器支持的协议时HTTP,当接收客户端发来的HTTPS请求时则转发至此属性的定义端口connectionTimeout:等待客户端发送请求的超时时间,单位为毫秒,默认为6000 enableLookups:是否通过request.getRemoteHost()即是否启用DNS查询功能acceptCount:设置等待队列的最大长度

  • engine: servlet示例,即servlet引擎,其内部可以一个或多个host组件来定义站点;通常需要defaultHost属性来为其定义一个接受所有发往非明确定义虚拟主机的请求的host组件

    name:engine组件的名称,用于日志和错误信息记录时却别不同的引擎

  • host:位于engine内部用于接受请求并进行响应处理的主机或虚拟主机

    appBase:此host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径 autoDepoly:在tomcat处于运动状态时,将某webapp放置于appBase所定义的目录中,是否自动将其部署至tomcat;默认为true unpackWars:在启用此webapss时是否对WAR格式的归档文件先进行展开,默认为true

主机别名定义:如果一个主机有两个或两个以上的主机名,额外的名称均可以以别名的形式进行定义

示例

<Host name="www.test.com" appBase="webapps" unpackWARS="true">
    <Alias>test.com</Alias>
</Host>
  • context:context在某些意义上类似于apache的路径别名,一个context定义用于表示tomcat示例中的一个web应用程序

    docBase:相应的web应用程序存放位置;也可以使用相对路径,起始路径为Context所属Host中appBase定义的路径;切记,docBase的路径名不能与相应的Host中的appBase中定义的路径名有包含关系,比如appBase为deploy,而docBase决不能为deploy-bbs类的名字 path:相对于web服务器根目录而言的URI,如果为空,则表示为webapp的根路径;如果context定义了一个单独的xml文件,此属性不需要定义 reloadable:是否允许重新加载此context相关的web应用程序类,默认为false

示例

<Context path="/path" docBase="/path/to/somedir" reloadable=""/>
  • realm:一个realm表示一个安全上下文,授权访问某个给定context的用户列表和某用户所允许切换角色相关定义的列表

  • valve: 类似于过滤器,valve定义的次序决定了他们的生效次序。

    RemoteHostValve:基于远程主机名称的访问控制 RemouteAddrValve:基于远程地址的访问控制

    控制本身可以通过allow或deny来进行定义,这有点类似于apache的访问控制功能

示例:

<Context path="/test" docBase="test">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.0\.0\.1"/>
</Context>


*className*:相关的java实现的类名
*allow*:以逗号分开的允许访问的IP地址列表,支持正则表达式,使用“.”需要转义;仅定义allow选项是,被明确allow的地址均被deny
*deny*:以逗号分开的禁止访问IP地址列表,支持正则表达式,使用方式同allow

部署(deploy)webapp相关操作

将webapp的源文件放置于目标目录,配置tomcat服务器能够基于web.xml和context.xml文件中定义的路径来访问webapp;将其特有的类和依赖的类通过class loader装载至JVM中

部署方式:

    (1)自动部署auto deploy
    (2)手动部署

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

        undeploy:拆除(反部署),停止webapp,并从tomcat示例上卸载webapp
        start:启动处于停止状态的webapp
        stop:停止webapp,不再向用户提供服务,其类亦然在jvm上
        redeploy:重新部署

6、启动manager功能

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="standard"/>
<user username="tomcat" password="secret" roles="admin-gui,manager-script,standard"/>

7、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

三、Tomcat安装

方式一:

使用yum源安装即可

(1)安装jdk环境,由于base源提供了三个不同版本的jdk环境,根据我们的需要自行安装所需要的版本

[root@localhost~]#yum install -y java-1.8.0-openjdk-src

[root@localhost~]#java -version #查看是否安装成功

如果多 版本并存时,可使用alternatives命令设定默认使用的版本。

(2)安装tomcat

[root@localhost~]#yum install -y tomcat tomcat-admin-webapps tomcat-docs-webapp tomcat-webapps tomcat-libs

[root@localhost~]#systemctl start tomcat.service #启动服务

2017-11-04_093049.jpg

方式二:

(1)从官网下载rpm安装jdk

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

[root@localhost~]#rpm -ivh jdk-8u144-linux-x64.rpm

[root@localhost~]#java -version #测试是否安装成功

(2)二进制安装tomcat

https://tomcat.apache.org/download-80.cgi

[root@localhost~]#tar xf apache-tomcat-7.0.78.tar.gz -C /usr/local/#解压缩

[root@localhost~]#cd /usr/local/

[root@localhost/usr/local]#ln -sv apache-tomcat-7.0.78/ tomcat#创建软连接

[root@localhost/usr/local/tomcat]#vim /etc/profile.d/tomcat.sh#修改环境变量

  1 export CATALINA_BASE=/usr/local/tomcat
  2 export PATH=$CATALINA_BASE/bin:$PATH

修改权限

[root@localhost/usr/local]#useradd -r tomcat #创建用户

[root@localhost/usr/local]#chown -R :tomcat tomcat/ #修改配置文件所属组

[root@localhost/usr/local/tomcat]#chown tomcat ./{logs,temp,work,webapps}

[root@localhost/usr/local/tomcat]#source /etc/profile.d/tomcat.sh#使环境变量生效

(3)重启服务测试

[root@localhost/usr/local/tomcat/bin]#catalina.sh --help

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?

[root@localhost~]#mkdir test/{logs,temp,work,webapps} -pv

[root@localhost~]#chown -R tomcat test/{logs,temp,work,webapps}

[root@localhost/usr/local/tomcat/bin]#catalina.sh start#启动服务

2017-11-04_101732.jpg

建议一般以普通用户运行tomcat

四、示例

1、冷部署方法

(1)创建所需要的目录

[root@localhost~]#mkdir test/{classes,lib,WEB-INF} -pv

(2)创建index.jsp文件

[root@localhost~]#vim test/index.jsp

  1  <%@ page language="java" %>
  2  <%@ page import="java.util.*" %>
  3  <html>
  4          <head>
  5                  <title>Test Page</title>
  6          </head>
  7          <body>
  8                  <% out.println("hello world");
  9                  %>
 10          </body>
 11  </html>

(3)将test目录移动到webapps目录下

[root@localhost~]#cp -r test/ /usr/share/tomcat/webapps/

(4)重启服务测试

[root@localhost~]#systemctl start tomcat

2017-11-04_110703.jpg

如果是程序员将打包好的jar文件发给我们,可以将此包直接防止webapps目录下,可以自行部署

(5)查看部署过程

[root@localhost/usr/share/tomcat/work/Catalina/localhost]#tree test/

test/
└── org
    └── apache
        └── jsp
            ├── index_jsp.class
            └── index_jsp.java

2、手动使用SHUTDOWN关闭服务

(1)首先先查看下我们的服务是否正常运行

2017-11-04_111511.jpg

(2)使用telnet连接关闭服务

2017-11-04_111645.jpg

此时我们再看服务已经没有开启了,为了防止恶意之人,我们需要将命令修改为随机数等等

[root@localhost/etc/tomcat]#openssl rand -hex 20

fb8a9c1a78827dcb81950feca0e18c6d4470997e

2017-11-04_111922.jpg

3、创建站点

[root@localhost/etc/tomcat]#vim server.xml

2017-11-04_113352.jpg

[root@localhost/etc/tomcat]#mkdir -pv /app/webapps

[root@localhost/etc/tomcat]#mkdir -pv /app/webapps/ROOT/{lib,classes,WEB-INF}

[root@localhost/etc/tomcat]#cp /usr/share/tomcat/webapps/test/index.jsp /app/webapps/ROOT/#创建站点文件

重启服务测试

[root@localhost/etc/tomcat]#systemctl start tomcat

[root@localhost/etc/tomcat]#curl www.test.com:8080

 <html>
         <head>
                 <title>Test Page</title>
         </head>
         <body>
                 hello world

         </body>
 </html>

出现上述结果正常,使用的是curl命令没有做修改

[root@localhost/etc/tomcat]#links www.test.com:8080

2017-11-04_113653.jpg

4、修改conext组件相当于修改别名

(1)创建目录

[root@localhost~]#cp -r test/ /data/test

(2)编辑server.xml文件

[root@localhost~]#vim /etc/tomcat/server.xml

2017-11-04_114918.jpg

(3)编辑index.jsp文件

[root@localhost/data/test]#vim index.jsp

  1  <%@ page language="java" %>
  2  <%@ page import="java.util.*" %>
  3  <html>
  4          <head>
  5                  <title>Test Page</title>
  6          </head>
  7          <body>
  8                  <% out.println("hello tomcat");
  9                  %>
 10          </body>
 11  </html>

(4)重启服务测试

[root@localhost/data/test]#links www.test.com:8080/test

2017-11-04_114840.jpg

5、启动web-gui管理

2017-11-04_115428.jpg

(1)如果我们想启用Server Status功能需要认证,如果我们点击cancle则出现指示方法

2017-11-04_141848.jpg

(2)修改tomcat-user.xml配置文件

[root@localhost/etc/tomcat]#vim tomcat-users.xml

2017-11-04_142628.jpg

(3)重启tomcat服务测试

[root@localhost/etc/tomcat]#systemctl restart tomcat

2017-11-04_142853.jpg

2017-11-04_142837.jpg

2017-11-04_142908.jpg

5、禁止或允许某个或某些远程IP主机管理

(1)编辑server.xml配置文件

[root@localhost/etc/tomcat]#vim server.xml

2017-11-04_143912.jpg

(2)测试

2017-11-04_144159.jpg

禁止此IP访问没有显示内容

那么接下来我们允许此IP访问并再次重启服务测试

2017-11-04_144330.jpg

6、LNMT环境搭建

2017-11-04_203254.jpg

安装mysql数据库

(1)安装mysql并配置环境

[root@mysql ~]# yum install -y mysql-server

[root@mysql ~]# service httpd start #启动服务

[root@mysql ~]# mysql_secure_installation #mysql安全初始化

(2)创建数据库并授权用户

[root@mysql ~]# mysql -uroot -p

mysql> CREATE DATABASE testprocess;

mysql> GRANT ALL ON testprocess.* TO 'joah'@'192.168.4.61' IDENTIFIED BY '123456';

tomcat

(1)安装jdk环境

[root@tomcat/etc/tomcat]#yum install -y java-1.8.0-openjdk-src

(2)安装tomcat

[root@tomcat~]#yum install -y tomcat tomcat-lib tomcat-admin-webapps tomcat-docs tomcat-webapps

(3)启动服务测试是否成功

[root@tomcat~]#systemctl enable tomcat #设置为开机自动启动

[root@tomcat~]#systemctl start tomcat #启动服务

2017-11-04_172452.jpg

使tomcat与mysql可以连接

MySQL Connector / J是一个本地Java驱动程序,可以将JDBC(Java Database Connectivity)调用MySQL数据库使用的网络协议。

(1)安装mysql-connector-java

[root@tomcat~]#yum install -y mysql-connector-java #用于使用java连接mysql数据库

[root@tomcat~]#cp /usr/share/java/mysql-connector-java.jar /usr/share/tomcat/lib/将此压缩包复制到此目录下,自动安装部署

[root@tomcat~]#systemctl restart tomcat #重启服务

(2)修改mysql中的配置文件

[root@mysql ~]# vim /etc/my.cnf

2017-11-04_192749.jpg

[root@mysql ~]# service mysqld restart #重启服务

查看是否生效

2017-11-04_193113.jpg

创建数据库并授权

mysql> CREATE DATABASE tomcat;

mysql> CREATE TABLE tom(id int,name varchar(40));
mysql> insert into tom values(1,'test');


mysql> GRANT ALL ON tomcat.* TO 'joah'@'192.168.4.61' IDENTIFIED BY '123456';

测试是否成功

[root@tomcat~]#mysql -ujoah -p -h 192.168.4.56

编辑test.jsp文件

[root@tomcat/usr/share/tomcat/webapps/ROOT]#vim test.jsp

  1 <%@ page contentType="text/html;charset=utf-8"%>
  2 <%@ page import="java.sql.*"%>
  3 <html>
  4     <body>
  5     <%Class.forName("org.gjt.mm.mysql.Driver").newInstance();
  6       String url ="jdbc:mysql://192.168.4.56(此处需要换成mysql的地址)/tomcat?user=joah(连接数据库使用的名字)&password=123456(连接数据库的密码)&useUnicode=tr    ue&characterEncoding=utf-8";
  7       Connection conn= DriverManager.getConnection(url);
  8       Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_    UPDATABLE);
  9       String sql="select * from tom(连接数据库中的表)";
 10       ResultSet rs=stmt.executeQuery(sql);
 11       while(rs.next()) {%>
 12       step:<%=rs.getString(1)%>
 13       context:<%=rs.getString(2)%><br><br><%}
 14      %>
 15      
 16     <%out.print("Congratulations!!! JSP connect MYSQL IS OK!!");%>
 17     <%rs.close();
 18       stmt.close();
 19       conn.close();
 20     %>
 21 </body>
 22 </html>

2017-11-04_195820.jpg

修改nginx.conf配置文件

[root@nginx/etc/nginx]#vim nginx.conf

 47         location / {
 48             proxy_pass http://192.168.4.61:8080;
 49         }
 50         location ~*\.(jsp|do)$ {
 51                 proxy_pass http://test.com:8080;
 52         }

[root@nginx/etc/nginx]#nginx -t

[root@nginx/etc/nginx]#systemctl restart nginx #重启服务测试

重启服务测试

2017-11-04_185820.jpg

至此我们的LNMT环境搭建成功

7、LAMT环境搭建

2017-11-04_203337.jpg

(1)apache安装

[root@web~]#yum install -y httpd

[root@web~]#systemctl enable httpd #设置开机启动

[root@web~]#systemctl start httpd.service #启动服务

(2)修改配置文件httpd.conf

基于http连接

查看是否有支持http协议的代理模块

[root@web/etc/httpd/conf]#httpd -M |grep http

 proxy_http_module (shared)

编辑配置文件

[root@web/etc/httpd/conf.d]#vim host.conf

  1 <VirtualHost *:80>
  2         ServerName www.test.com
  3         ProxyRequests off   关闭正向代理
  4         ProxyVia    on     是否记录代理
  5         ProxyPreserveHost on    #开启保留主机名
  6         <Proxy *>
  7                 Require all granted
  8         </Proxy>
  9         ProxyPass / http://192.168.4.61:8080/
 10         ProxyPa***everse / http://192.168.4.61:8080/
 11         <Location />
 12                 Require all granted
 13         </Location>
 14 </VirtualHost>

重启服务测试

[root@web/etc/httpd/conf.d]#systemctl restart httpd.service

2017-11-04_202353.jpg

基于AJP协议连接

查看是否加载了支持ajp协议的反向代理模块

[root@web/etc/httpd/conf]#httpd -M |grep ajp

 proxy_ajp_module (shared)

编辑配置文件

[root@web/etc/httpd/conf.d]#vim host.conf

  1 <VirtualHost *:80>
  2         ServerName www.test.com
  3         ProxyRequests off
  4         ProxyVia    on
  5         ProxyPreserveHost on
  6         <Proxy *>
  7                 Require all granted
  8         </Proxy>
  9         ProxyPass / ajp://192.168.4.61:8009/
 10         ProxyPa***everse / ajp://192.168.4.61:8009/
 11         <Location />
 12                 Require all granted
 13         </Location>
 14 </VirtualHost>

重启服务测试

2017-11-04_202353.jpg

后续的安装和LNMT的安装方法一样,就不再累述。

8、实现如下topology

2017-11-04_204237.jpg