Tomcat和Resin部署和优化

目前有很多网站是用Java编写的,所以解析Java程序就必须有相关的软件来完成,Tomcat就是去其中之一。Tomcat是Apache软件基金会(Apache Software Foundation)的Jackarta项目中的一个核心项目,由Apache、Sun和其它一些公司及个人共同开发而成。Tomcat技术先进、性能稳定而且免费,因为深受Java爱好者的喜爱,并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。

Tomcat是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试Java程序的首选。对于初学者,在一台机器上配置好Apache服务器之后,可利用它相应对HTML页面的访问请求。实际上,Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行Tomcat时,它是作为一个福利的进程运行的。


1. 安装Tomcat

Tomcat的安装分为安装JDK和安装Tomcat两个步骤。JDK(Java Development Kit)是Sunday Microsystems针对Java开发的产品。自从Java推出依赖,JDK已经称为使用最广泛的Java JDK。JDK是整个Java的核心,它包括了Java运行环境、Java工具和Java基础的类库。所以想要运行Java程序必须要有JDK的支持,而安装Tomcat的前提也是安装好JDK。

1.1. 安装JDK

可以去JDK的官网去下载,但是这个下载地址不能通过wget命令来进行下载,只能先通过浏览器,然后再上传到Linux中。根据平台来下载相应的版本。在这里实验环境是CentOS7系统,软件包下载的是64位的。

下载完JDK的包之后,把它上传到/usr/local/src/目录下,然后解压,命令如下:

1
2
3
# cd /usr/local/src/
# tar zxvf jdk-9.0.4_linux-x64_bin.tar.gz
# mv jdk-9.0.4 /usr/local/jdk9.0.4

然后设置环境变量,操作方法如下:

1
2
3
4
5
6
7
8
9
# vim /etc/profile
#<==在末尾添加如下内容
JAVA_HOME=/usr/local/jdk9.0.4/
JAVA_BIN=/usr/local/jdk9.0.4/bin
JRE_HOME=/usr/local/jdk9.0.4/jre
PATH=$PATH:/usr/local/jdk9.0.4/bin:/usr/local/jdk9.0.4/
jre/bin
CLASSPATH=/usr/local/jdk9.0.4/jre/lib:/usr/local/jdk9.0.4/lib:/usr/local/jdk9.0.4/jre/lib/charsets.jar

接下来:

  • 保存文件后,执行这个命令使其生效:source /etc/profile
  • 检测设置是否正确,使用这个命令:java -version,如果显示如下内容,则说明配置正确:
    1
    2
    3
    java version "9.0.4"
    Java(TM) SE Runtime Environment (build 9.0.4+11)
    Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

也许这一步的显示和上面的不一样,这可能是因为系统中调用了rpm的openjdk,请按照下面的方法检测:

  • 输入命令which java
  • 如果结果为/usr/bin/java则说明这个rpm的JDK,而且执行java -version时会有openjdk字样。
  • 其实我们也可以直接使用openjdk来配合Tomcat,但是在这个实验里,我们还是使用JDK吧。这时如果系统中已经存在了openjdk,则我们需要做一个临时处理:

    1
    2
    # mv /usr/bin/java /usr/bin/java_bak
    # source /etc/profile
  • 再次执行java -version,显示的结果就和上面的一样了。

1.2. 安装Tomcat

安装JDK只不过是为安装Tomcat做准备工作,现在才是正式安装Tomcat。

首先下载软件包,可以到Tomcat的官网去下载,在工作中可以根据需求来选择合适的版本。这里以Tomcat8版本作为演示。

1
2
# cd /usr/local/src/
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.29/bin/apache-tomcat-8.5.29.tar.gz

安装过程如下:

1
2
# tar zxvf apache-tomcat-8.5.29.tar.gz
# mv apache-tomcat-8.5.29 /usr/local/tomcat

因为是二进制包,所以免去了编译的过程,启动Tomcat,命如下:

1
2
3
4
5
6
7
# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/jdk9.0.4
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

查看是否启动成功,命令如下:

1
2
3
4
5
6
7
# ps aux | grep tomcat | grep -v grep #<==查看是否有Java相关进程
]# netstat -lnp | grep java #<==也可以查看监听端口
tcp6 0 0 :::8080 :::* LISTEN 1112/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 1112/java
tcp6 0 0 :::8009 :::* LISTEN 1112/java
#<==正常情况应该会有三个端口:800980058080
#<==其中8080为提供Web服务的端口,8005为管理端口,8009为第三方服务调用的端口(比如httpd和Tomcat结合时会用到

若想开机启动,需要把命令放到/etc/rc.d/rc.local文件里。如下:

1
2
3
# echo "/usr/local/tomcat/bin/startup.sh" >> /etc/rc.d/rc.local
# chmod a+x /etc/rc.d/rc.local
#<==默认rc.local文件没有x权限,所以需要加一下

然后在浏览器中输入http://IP:8080就可以看到Tomcat的默认页面了。


2. 配置Tomcat

Tomcat的安装过程非常简单,但是我们还需要学会如何配置Tomcat。在生产环境中关于Tomcat的配置其实并不多,下面是几个常用的配置。

2.1. 配置Tomcat服务的访问端口

Tomcat的默认启动端口是8080,如果你想改为80,则需要修改server.xml文件。操作如下:

  • 打开server.xml文件:vim /usr/local/tomcat/conf/server.xml
  • 找到<Connector port="8080" protocol="HTTP/1.1"修改为<Connector port="80" protocol="HTTP/1.1"
  • 保存文件后重启Tomcat,命令如下:
    1
    2
    # /usr/local/tomcat/bin/shutdown.sh
    # /usr/local/tomcat/bin/startup.sh

Tomcat的关闭和启动优点特殊,需要使用它自带的脚本实现。其实在生产环境中,Tomcat会使用8080端口,而80端口是留给Nginx的。也就是说要想访问Tomcat,需要使用Nginx代理。

2.2. Tomcat的虚拟主机

关于虚拟主机,在Tomcat中也有这么一说。

先来看一下配置文件server.xml中的结构,其中<!---->之间的内容为注释,所以把它们过滤掉,剩下的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<Service name="Catalina">
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
</Realm>
<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 &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>
</Server>

其中<Host></Host>之间的配置就是虚拟主机配置部分,name定义域名,appBase定义应用的目录。Java的应用通常是一个jar的压缩包,将jar的压缩包放到appBase目录下面即可。

刚才安装完所访问的Tomcat的页面其实就是在appBase目录下面,不过是在它子目录ROOT里:

1
2
3
4
5
6
# ls /usr/local/tomcat/webapps/ROOT/
asf-logo-wide.svg bg-upper.png tomcat.gif
bg-button.png favicon.ico tomcat.png
bg-middle.png index.jsp tomcat-power.gif
bg-nav-item.png RELEASE-NOTES.txt tomcat.svg
bg-nav.png tomcat.css WEB-INF

其中index.jsp就是Tomcat的默认页面。也可以用curl命令来访问一下Tomcat.gif图片:

1
2
3
4
5
6
7
8
# curl localhost:80/tomcat.gif -I
HTTP/1.1 200
Accept-Ranges: bytes
ETag: W/"2066-1520255503000"
Last-Modified: Mon, 05 Mar 2018 13:11:43 GMT
Content-Type: image/gif
Content-Length: 2066
Date: Thu, 15 Mar 2018 04:48:55 GMT

在appBase(即/usr/local/tomcat/webapps)目录下面有很多子目录,每一个子目录都可以被访问,你可以把自定义的应用放到webapps目录里(假设应用名字为theshu,theshu为一个目录),然后可以通过http://IP/theshu/来访问这个应用。如果直接访问IP,后面不加二级目录,则默认会访问ROOT目录下面的文件,加上二级目录会访问二级目录下面的文件。

下面再来增加一个虚拟主机,并定义域名,编辑server.xml,在</Host>下一行插入新的<Host>,内容如下:

1
2
3
4
5
<Host name="www.123.cn" appBase="/data/tomcatweb/">
unpackWARs="false" sutoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/data/tomcatweb/" debug="O" reloadable="true" crossContext="true"/>
</Host>

上述配置的说明:

  • 其中多了一个docBase,这个参数用来定义网站的文件存放路径,如果不定义,默认是在appBase/ROOT下面的。定义了docBase就以该目录为主了
  • 其中appBasedocBase可以一样。

创建目录和测试文件并测试,过程如下:

1
2
3
4
5
6
7
8
9
10
11
#<==创建目录和测试文件
# mkdir -p /data/tomcatweb
# echo "Tomcat test page." > /dta/tomcatweb/1.html
#<==修改完配置文件后重启Tomcat
# /usr/local/tomcat/bin/shutdown.sh
# /usr/local/tomcat/bin/startup.sh
#<==用curl访问一下刚才创建的1.html
# curl -x127.0.0.1:80 www.123.cn/1.html
Tomcat test page.

2.3. 测试Tomcat解析JSP

上面的演示仅仅是把Tomcat作为一个普通的Web Server,其实Tomcat主要用来解析JSP页面。下面将创建一个JSP的测试页面,如下所示:

1
2
3
4
5
6
7
8
9
10
# vim /data/tomcatweb/111.jsp
#<==编写如下内容
<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>
</center>
</body>
</html>

保存文件后使用curl进行测试,如下所示:

1
2
3
4
5
6
7
8
# curl -x127.0.0.1:80 www.123.cn/111.jsp
<html>
<body>
<center>
Now time is: Thu Mar 15 13:35:30 CST 2018
</center>
</body>
</html>

可以看到,中间的那行代码被解析成当前系统的时间了。

2.4. Tomcat日志

Tomcat的日志目录为/usr/local/tomcat/logs,主要有四大类日志:

1
2
3
4
5
6
7
# cd /usr/local/tomcat/logs && ls
catalina.2018-03-15.log
catalina.out
host-manager.2018-03-15.log
localhost.2018-03-15.log
localhost_access_log.2018-03-15.txt
manager.2018-03-15.log

其中:

  • catalina开头的日志为Tomcat的综合日志,它记录Tomcat服务相关信息,也会记录错误日志。
  • catalina.2018-03-15.logcatalina.out内容相同,前者会每天生成一个新的日志。
  • host-managermanager为管理相关的日志,其中host-manager为虚拟主机的管理日志。
  • localhostlocalhost_access为虚拟主机相关日志,其中带access字样的日志为访问日志,不带access字样的为默认虚拟主机的错误日志。

访问日志默认不会生成,需要在server.xml中配置一下。具体方法是在对应虚拟主机的<Host></Host>里面加入下面的配置(加入域名为123.cn):

1
2
3
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="123.cn_access_log" suffix=".txt"
pattern="%h %l %u %t &quot;%r&quot; %s %b" />

说明:

  • prefix定义访问日志的前缀
  • suffix定义日志的后缀
  • pattern定义日志格式
  • 新增加的虚拟主机默认并不会生成类似默认虚拟主机的那个localhost.日期.log日志,错误日志会统一记录到catalina.out中。

关于Tomcat日志,最需要关注catalina.out,出现问题时应该首先想到去查看它。

2.5. Tomcat连接MySQL

Tomcat连接MySQL是通过自带的JDBC驱动实现的,网上有很多资料说需要下载mysql-connector-java-xxx.jar(其中xxx为版本号),并放到Tomcat的lib目录下才可以。但是有人做实验得出结论:无需做此步操作。

如果需要mysql-connector-java-xxx.tar驱动,则按照如下方式操作:

  • 官网下载地址:http://dev.mysql.com/downloads/connector/j/
  • mysql-connector-java-5.1.25.tar.gz为例来进行操作
  • 将mysql-connector-java-5.1.25.tar.gz解压放在/usr/local/下
  • cd mysql-connector-java-5.1.25
  • cp mysql-connector-java-5.1.25-bin.jar /usr/local/tomcat/lib
  • 重启Tomcat:/usr/local/tomcat/bin/shutdown.sh && /usr/local/tomcat/bin/startup.sh

接下来让我们进行Tomcat连接MySQL的实验!

首先,配置MySQL,创建实验用的库、表以及用户:

1
2
3
4
5
6
7
8
# mysql -uroot -p'123456'
mysql> create database java_test;
mysql> use java_test;
mysql> grant all on java_test.* to 'java'@'127.0.0.1' identified by 'aminglinux';
mysql> create table aminglinux (`id` int(4), `name` char(40));
mysql> insert into aminglinux values (1, 'abc');
mysql> insert into aminglinux values (2, 'aaa');
mysql> insert into aminglinux values (3, 'bbb');

创建完表以用户后, 退出MySQL,并验证用户是否可用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# mysql -ujava -paminglinux -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 4
Server version: 5.6.35 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, 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相关的配置文件:

1
2
3
4
5
6
7
8
9
10
11
# 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="aminglinux"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/java_test">
</Resource>

说明:

  • 上面配置中有个地方需要注意一下,name定义为jdbc/mytest,这里的mytest可以自定义,后面还会用到它。
  • username为MySQL的用户名,password为密码,usl定义MySQL的IP、端口以及库名。

保存该文件后,还需要更改另一个配置文件:

1
2
3
4
5
6
7
8
9
# 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>

其实每一个应用(即webapps/ROOT、webapps/aming等)目录下都应该有一个WEB-INF目录,它里面会有对应的配置文件,比如web.xml就是用来定义JDBC相关资源的,其中res-ref-name和前面定义的Rource name保持一致。

既然选择了webapps/ROOT作为实验应用对象,就需要在ROOT目录下面创建测试JSP文件(用浏览器访问的文件):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# vim /usr/local/tomcat/webapps/ROOT/t.jsp
#<==加入如下内容
<%@page import="java.sql.*"%>
<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.*"%>
<%
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx
.lookup("java:comp/env/jdbc/mytest");
Connection conn = ds.getConnection();
Statement state = conn.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();
conn.close();
%>

说明:这个JSP脚本可能你会看不懂,因为这是Java语言写的程序代码,细节我们不用太过在意,只需要知道这个脚本会去连接MySQL,并查询一个库、表的数据即可。只是用来测试环境的。

保存后,重启一下Tomcat:

1
2
# /usr/local/tomcat/bin/shutdown.sh
# /usr/local/tomcat/bin/startup.sh

然后再浏览器里面访问http://IP/t.jsp,它会查询java_test库的aminglinux表,并列出具体的数据来。并且它和直接用MySQL命令行查询得到的结果是一致的:

1
2
3
4
5
6
7
8
9
]# mysql -ujava -paminglinux -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 | bbb |
+------+------+

3. Resin安装与配置

Resin和Tomcat是一样的角色。它也需要JDK的支持。所以第一步也是安装JDK,方法同上。

安装完JDK后,下面来安装Resin。

resin的官网是http://caucho.com,它分两个版本,resin是开源的,另一个resinpro为商业版本。我们要用开源的版本resin。

1
2
3
4
5
6
# cd /usr/local/src/
# wget http://caucho.com/download/resin-4.0.55.tar.gz
# tar zxf resin-4.0.55.tar.gz
# ./configure --prefix=/usr/local/resin --with-java-home=/usr/local/jdk9.0.4
# make && make install
# /etc/init.d/resin start

下面简单配置resin

1
2
# cd /usr/local/resin/conf
# vim resin.xml

它的配置文件和tomcat的是很像的,基本结构为:

1
2
3
<cluster id="app">
<host></host>
</cluster>

其中虚拟主机配置就在<host></host>里配置:

1
2
3
<host id="www.123.com" root-directory=".">
<web-app id="/" root-directory="/tmp/123/">
</host>

注意,这里并不是在<host>下面再加一段,而是直接更改里面的<host></host>。然后编辑一个测试文件:

1
# vim /tmp/123/111.jsp

加入如下内容:

1
2
3
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>

测试:

1
# curl -x127.0.0.1:8080 www.123.com/111.jsp

0%