Tomcat
是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat服务器 是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
16.1 安装Tomcat
Tomcat的安装分为安装JDK和安装Tomcat两个步骤,JDK是整个Java的核心,它包括了Java运行环境、Java工具和Java基础的类库。要想运行Java程序必须要有JDK的支持,而安装Tomcat的前提也是安装好JDK。
安装JDK
JDK只能在浏览器上下载之后传到linux上,而无法直接使用wget去下载,这里我下载的是jdk-8u171-linux-x64.tar.gz
。官方下载地址
- 上传并解压:
# cd /usr/local/src/
# rz
# ls
jdk-8u171-linux-x64.tar.gz
# tar zxvf jdk-8u171-linux-x64.tar.gz
# mv jdk1.8.0_171 /usr/local/jdk1.8
- 设置环境变量:
# vim /etc/profile #最后面加入下面内容
JAVA_HOME=/usr/local/jdk1.8/
JAVA_BIN=/usr/local/jdk1.8/bin
JRE_HOME=/usr/local/jdk1.8/jre
PATH=$PATH:/usr/local/jdk1.8/bin:/usr/local/jdk1.8/jre/bin
CLASSPATH=/usr/local/jdk1.8/jre/lib:/usr/local/jdk1.8/lib:/usr/local/jdk1.8/jre/lib/charsets.jar
- 使其生效并检验正确:
# source /etc/profile
# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode) #显示这三行则说明配置正确
# which java
/usr/local/jdk1.8/bin/java #如果这里显示为/usr/bin/java则说明这是rpm的JDK,而且执行java -version时会有openjdk字样
安装Tomcat
上面已经安装了JDK,现在来安装Tomcat。
- 首先下载软件包:
# cd /usr/local/src/
# wget https://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz
- 解压并安装:
# tar zxvf apache-tomcat-8.5.32.tar.gz
# mv apache-tomcat-8.5.32 /usr/local/tomcat
- 启动Tomcat:
# /usr/local/tomcat/bin/startup.sh #Tomcat只能通过脚本方式启动或关闭,重启就是先关闭再启动,不能直接restart
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
- 查看是否启动成功:
# netstat -lntp |grep java
tcp6 0 0 :::8080 :::* LISTEN 1895/java #正常情况会有三个端口,8080端口提供Web服务
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1895/java #8005端口为管理端口
tcp6 0 0 :::8009 :::* LISTEN 1895/java #8009端口为第三方服务调用端口
- 设置开机启动:
# echo "/usr/local/tomcat/bin/startup.sh" >> /etc/rc.d/rc.local
# chmod a+x /etc/rc.d/rc.local #默认该文件没有执行权限,需要加上执行权限
- 关闭防火墙后使用浏览器访问:
# systemctl stop firewalld
# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
16.2 配置Tomcat
配置Tomcat服务的访问端口
Tomcat默认启动的端口是8080端口,如果想改为80端口,则需要修改配置文件 /usr/local/tomcat/conf/server.xml
。
# vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1" #找到该行,将8080改为80
# /usr/local/tomcat/bin/shutdown.sh
# /usr/local/tomcat/bin/startup.sh #先关闭再启动,即重启Tomcat服务
在生产环境中,Tomcat使用8080端口,而80端口是留给Nginx的,也就是想要访问Tomcat,需要使用Nginx代理。
Tomcat的虚拟主机
在之前httpd和Nginx的时候,就有接触过虚拟主机,而Tomcat也有虚拟主机的概念。
- 查看虚拟主机配置内容:
# vim /usr/local/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
上面<Host 和 之间的配置为虚拟主机配置部分,name定义域名,appBase定义应用的目录。Java的应用通常是一个jar的压缩包,将jar的压缩包放到appBase目录下面即可。
我们之前访问的Tomcat默认页就在appBase目录下面的子目录ROOT里面。
# ls /usr/local/tomcat/webapps/ROOT/
asf-logo-wide.svg bg-nav-item.png favicon.ico tomcat.css tomcat-power.gif
bg-button.png bg-nav.png index.jsp tomcat.gif tomcat.svg
bg-middle.png bg-upper.png RELEASE-NOTES.txt tomcat.png WEB-INF #index.jsp就是Tomcat的默认页面
在appBase(/usr/local/tomcat/webapps/
)目录下面有很多子目录,每一个子目录都可以被访问,我们可以把自定义的应用放到webapps目录里。如果直接访问IP,后面不加二级目录,则默认访问ROOT目录下面的文件,加上二级目录则会访问二级目录下面的文件。
- 增加虚拟主机,定义域名:
# vim /usr/local/tomcat/conf/server.xml
<Host name="www.lzx.cn" appBase="/data/tomcatweb/"
unpackWARs="false" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/data/tomcatweb/" debug="0" reloadable="true"
crossContext="true" />
</Host> //在</Host>下一行插入上面内容
上面多定义了一个docBase,这个参数用来定义网站的文件存放路径,如果不定义,默认是在appBase/ROOT
下面,定义了docBase就以该目录为主了,其中appBase和docBase可以一样。
- 创建目录并测试:
# mkdir /data/tomcatweb
# echo "Tomcat." > /data/tomcatweb/1.html
# /usr/local/tomcat/bin/shutdown.sh #先关闭Tomcat服务
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
# /usr/local/tomcat/bin/startup.sh #再启动Tomcat服务
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
# curl -x127.0.0.1:8080 www.lzx.cn/1.html
Tomcat. #说明我们添加的虚拟主机没有问题
16.3 测试Tomcat解析JSP
Tomcat主要用来解析JSP页面,上面仅仅是把Tomcat作为一个普通的Web Server使用。
- 创建一个JSP测试页面:
# vim /data/tomcatweb/111.jsp #写入下面内容
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>
- 保存文件后测试:
# curl -x127.0.0.1:8080 www.lzx.cn/111.jsp
<html><body><center>
Now time is: Mon Jul 16 16:02:24 CST 2018 #这里被解析为当前系统时间
</center></body></html>
还可以在宿主机上绑定hosts,用浏览器测试。
16.4 Tomcat日志
Tomcat的日志目录为/usr/local/tomcat/logs
,主要有四大类日志:
# cd /usr/local/tomcat/logs/
# ls
catalina.2018-07-16.log host-manager.2018-07-16.log localhost_access_log.2018-07-16.txt
catalina.out localhost.2018-07-16.log manager.2018-07-16.log
上面,
catalina 开头的日志为Tomcat的综合日志,它记录Tomcat服务相关信息,也会记录错误日志
host-manager和manager 管理相关的日志,其中host-manager为虚拟主机的管理日志
localhost和localhost_access 为虚拟主机相关日志,其中带access字样的为访问日志,不带access字样的为默认主机的错误日志(访问日志默认不会生成,需要在server.xml中配置一下)
错误日志会统一记录到 catalina.out 中,出现问题应该首先查看它
对于一个虚拟主机,它的配置文件中包含有下面内容
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
上面,prefix
定义访问日志的前缀,suffix
定义日志的前缀,pattern
定义日志格式。
16.5 Tomcat连接MySQL
Tomcat连接MySQL是通过自带的JDBC驱动实现的。
- 首先配置mysql,创建实验用的库、表及用户:
# echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile #加入变量,使mysql开机启动
# source /etc/profile
# mysqladmin -uroot password '123456' #设置密码
# mysql -uroot -p'123456' #登录mysql
mysql> create database java_test;
Query OK, 1 row affected (0.00 sec)
mysql> use java_test;
Database changed
mysql> grant all on java_test.* to 'java'@'127.0.0.1' identified by 'lzxlinux';
Query OK, 0 rows affected (0.00 sec)
mysql> create table lzx(`id` int(4), `name` char(40));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into lzx values (1,'abc');
Query OK, 1 row affected (0.00 sec)
mysql> insert into lzx values (2,'aaa');
Query OK, 1 row affected (0.00 sec)
mysql> insert into lzx values (3,'ccc');
Query OK, 1 row affected (0.00 sec)
- 创建完表及用户后,退出mysql,并验证用户是否可用:
[root@localhost logs]# mysql -ujava -plzxlinux -h127.0.0.1
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.6.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> #正常进入mysql,说明刚刚创建的Java用户没有问题
- 编辑Tomcat的配置文件:
# vim /usr/local/tomcat/conf/context.xml #在</Context>上面增加下面内容
<Resource name="jdbc/mytest"
auth="Container"
type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="java" password="lzxlinux"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/java_test">
</Resource>
上面,name定义为jdbc/mytest
,这里mytest可以自定义,username为mysql的用户,password为密码,url定义mysql的IP、端口及库名。
- 还需要配置一个文件:
# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml #在</web-app>上面增加下面内容
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/mytest</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
每个应用目录下面都有一个WEB-INF
目录,它里面会有对应的配置文件,比如web.xml就是用来定义JDBC相关资源的,其中res-ref-name
和前面定义的Resource name
保持一致。
- 在ROOT目录下面创建测试JSP文件:
# vim /usr/local/tomcat/webapps/ROOT/t.jsp
<%@page import="java.sql.*"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.*"%>
<%
Context context = new InitialContext();
DataSource ds = (DataSource) context
.lookup("java:comp/env/jdbc/mytest");
Connection connection = ds.getConnection();
Statement state = connection.createStatement();
String sql = "select * from aminglinux";
ResultSet rs = state.executeQuery(sql);
while (rs.next()) {
out.println(rs.getString("id") +"<tr>");
out.println(rs.getString("name") +"<tr><br>");
}
rs.close();
state.close();
connection.close();
%>
- 下载
MySQL Connector/J
(用于连接mysql和java,下载地址):
# cd /usr/local/tomcat/lib/
# rz
# ls
annotations-api.jar el-api.jar tomcat-api.jar tomcat-jni.jar
catalina-ant.jar jasper-el.jar tomcat-coyote.jar tomcat-util.jar
catalina-ha.jar jasper.jar tomcat-dbcp.jar tomcat-util-scan.jar
catalina.jar jaspic-api.jar tomcat-i18n-es.jar tomcat-websocket.jar
catalina-storeconfig.jar jsp-api.jar tomcat-i18n-fr.jar websocket-api.jar
catalina-tribes.jar mysql-connector-java-5.1.46.tar.gz tomcat-i18n-ja.jar
ecj-4.6.3.jar servlet-api.jar tomcat-jdbc.jar
# tar zxvf mysql-connector-java-5.1.46.tar.gz
# cd mysql-connector-java-5.1.46
# ls
build.xml COPYING mysql-connector-java-5.1.46.jar README.txt
CHANGES mysql-connector-java-5.1.46-bin.jar README src
# mv mysql-connector-java-5.1.46-bin.jar /usr/local/tomcat/lib/
# mv mysql-connector-java-5.1.46.jar /usr/local/tomcat/lib/
将解压出来的两个jar包放到 /usr/local/tomcat/lib/目录下面,这样才能生效。
- 重启Tomcat服务并在浏览器访问:
# /usr/local/tomcat/bin/shutdown.sh
# /usr/local/tomcat/bin/startup.sh
这和直接用MySQL命令行查询到的结果一致:
# mysql -ujava -plzxlinux -h127.0.0.1 java_test -e "select * from aminglinux"
Warning: Using a password on the command line interface can be insecure.
+------+------+
| id | name |
+------+------+
| 1 | abc |
| 2 | aaa |
| 3 | ccc |
+------+------+
更多资料参考: