•  

【Java】Tomcat学习笔记

发表于 2019-07-23,阅读 44

介绍

安装

准备

mkdir -p /tongfu.net/env/
mkdir /packages
cd /packages

安装依赖

yum -y install wget

下载JDK

必须通过网页下载,需要勾选“接受协议”,所以不能用wget直接下载了!

网页地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载Tomcat

如果下载地址失效,可以进入官网获取

网页地址:https://tomcat.apache.org/download-90.cgi

wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.35/bin/apache-tomcat-9.0.35.tar.gz

安装JDK

tar -xzvf jdk-8u192-linux-x64.tar.gz -C /tongfu.net/env/

安装Tomcat

tar -xzvf apache-tomcat-9.0.35.tar.gz -C /tongfu.net/env/
cd /tongfu.net/env/apache-tomcat-9.0.35/

配置JDK

echo "export JAVA_HOME=/tongfu.net/env/jdk1.8.0_192" >> /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar" >> /etc/profile
source /etc/profile

配置Tomcat

设置JVM参数

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
替换为
JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Xms1024m -Xmx1024m"

[root@tongfunet]# vi bin/catalina.sh
JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Xms1024m -Xmx1024m"

编辑启动脚本

[root@tongfunet]# cat > /tongfu.net/env/apache-tomcat-9.0.35/bin/tomcat-start <<EOF
#!/bin/sh

# env
export PATH

# start
source /etc/profile

cd /tongfu.net/env/apache-tomcat-9.0.35/

./bin/startup.sh &
EOF

编辑停止脚本

[root@tongfunet]# cat > /tongfu.net/env/apache-tomcat-9.0.35/bin/tomcat-quit <<EOF
#!/bin/sh

# env
export PATH

# quit
source /etc/profile

cd /tongfu.net/env/apache-tomcat-9.0.35/

./bin/shutdown.sh
EOF

授权脚本

chmod 0755 /tongfu.net/env/apache-tomcat-9.0.35/bin/tomcat-start
chmod 0755 /tongfu.net/env/apache-tomcat-9.0.35/bin/tomcat-quit

自动启动脚本

[root@tongfunet]# cat > /lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=tomcat
After=network.target

[Service]
Type=forking
ExecStart=/tongfu.net/env/apache-tomcat-9.0.35/bin/tomcat-start
ExecStop=/tongfu.net/env/apache-tomcat-9.0.35/bin/tomcat-quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

使用 systemctl 管理 tomcat 服务

systemctl enable tomcat # 设置自动启动

systemctl start tomcat # 启动服务

systemctl stop tomcat # 停止服务

systemctl restart tomcat # 重启服务

测试

通过 curl 测试 tomcat 首页

curl 'http://localhost:8080/'

看到界面表示安装成功!!!

虚拟主机

配置文件

打开 conf/server.xml,结构如下

<Server>
    <Service>
        <Connector/>
        <Engine>
            <Host>
                <Context/>
                <Alias/>
            </Host>
        </Engine>
    </Service>
</Server>
  • Server:服务器

  • Service:服务,例如:User

  • Connector:连接,服务的端口、协议等等

  • Engine:引擎,主机组

  • Host:主机,指向具体项目,不同 Host 对应不同的域名。

  • Context:虚拟目录,可选

  • Alias:域名别名,可选

不同端口主机

配置这种主机,需要设置不通的 Service,在 Service 里面设置各自的 Connector,通过 Connector 设置不同的端口

<!-- site1 configuration -->
<Service name="Site1">
  <Connector port="8081" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8441" />
  <Engine name="Site1" defaultHost="site1.tongfu.net">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    </Realm>
    <Host name="site1.tongfu.net"  appBase="/tongfu.net/web/Java"
          unpackWARs="false" autoDeploy="false">
      <Context path="" docBase="/tongfu.net/web/Java/Site1" privileged="true">
      </Context>
      <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>

<!-- site2 configuration -->
<Service name="Site2">
  <Connector port="8082" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8442" />
  <Engine name="Site2" defaultHost="site2.tongfu.net">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    </Realm>
    <Host name="site2.tongfu.net"  appBase="/tongfu.net/web/Java"
          unpackWARs="false" autoDeploy="false">
      <Context path="" docBase="/tongfu.net/web/Java/Site2" privileged="true">
      </Context>
      <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>

相同端口不通域名主机

配置这种主机,需要在同一个 Service 里设置多个 Host,在 Host 里设置不同的域名

<Service name="Site3">
  <Connector port="8083" protocol="HTTP/1.1"
             connectionTimeout="20000"
             redirectPort="8443" />
  <Engine name="Site3" defaultHost="site3.tongfu.net">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
    </Realm>
    
    <!-- zhang3 configuration -->
    <Host name="zhang3.site3.tongfu.net"  appBase="/tongfu.net/web/Java"
          unpackWARs="false" autoDeploy="false">
      <Context path="" docBase="/tongfu.net/web/Java/zhang3" privileged="true">
      </Context>
      <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>
    
    <!-- li4 configuration -->
    <Host name="li4.site3.tongfu.net"  appBase="/tongfu.net/web/Java"
          unpackWARs="false" autoDeploy="false">
      <Context path="" docBase="/tongfu.net/web/Java/li4" privileged="true">
      </Context>
      <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>

多域名配置

通过在 Host 里设置多个 Alias 实现多域名的支持

<Host>
    <Alias>www.zhang3.com</Alias>
    <Alias>www.li4.com</Alias>
</Host>

Manager

配置

manager是用来管理tomcat的GUI工具,默认部署在 webapps 下面

如果我们的项目不是在 webapps 下面,我们可以复制 webapps/manager 目录到自己的 Host.appBase 目录下面

服务配置

打开 conf/server.xml 文件,在 Server 节点增加 Service 节点

<Service name="TongfuJava">

    <Connector port="8088" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Engine name="TongfuJava" defaultHost="localhost">

      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost" appBase="webapps">
      </Host>

    </Engine>
  </Service>

用户配置

打开 conf/tomcat-users.xml 文件,在 tomcat-users 节点下面增加用户设置

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

重启Tomcat

./bin/shutdown.sh
./bin/startup.sh

授权IP地址

默认 manager 只能通过 localhost 访问,如果需要其他 IP 页可以访问,则需要进行如下配置

打开 webapps/manager/META-INF/context.xml 文件,修改 <Value ... RemoteAddrValue ... />

增加自己的 IP 地址,我们这里设置的是 192.168.1.133

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|192\.168\.1\.133|::1|0:0:0:0:0:0:0:1" />
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

测试

通过 curl 测试 manager 首页

curl --basic -u admin:123456 'http://localhost:8088/manager/html'

看到界面表示安装成功!!!

打包

通过 Maven 打包 war

我们使用 Maven 工具将项目打包成 war 文件,方便 tomcat 使用

准备

打开 pom.xml

在 project 里增加

<packaging>war</packaging>

在 dependencies 里增加

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

打包

切换到项目跟目录

通过 mvn 打包 war

mvn clean package -Dmaven.test.skip=true
  • maven.test.skip=true:表示在打包的时候跳过测试项目

因为大多数打包的环境是不能连接数据库之类的外部资源的,如果不加这一句,打包将会因为无法连接数据库而失败

部署

手动部署war

我们通过 maven 打包的 war 压缩包可以被 tomcat 解析来使用

配置

打开配置文件 conf/server.xml,在虚拟主机 <Host> 里增加设置

<Context path="/" docBase="/data/web/myweb" debug="0" privileged="true">
</Context>

解压缩war

使用 unzip 解压缩 war 文件到指定目录

unzip -o myweb.war -d /data/web/myweb/

重启tomcat

重新启动tomcat

./bin/shutdown.sh
./bin/startup.sh

打开浏览器测试程序!

自动部署war

我们利用 tomcat 的 Host 主机进行自动解压缩 war 文件来完成自动部署

配置

打开配置文件 conf/server.xml,给虚拟主机 <Host> 增加属性

unpackWARs="true"
autoDeploy="true"
  • unpackWARs="true":表示允许自动解压缩 war 文件

  • autoDeploy="true":表示开启自动部署功能

更新war

将打包好的 war 文件放到 <Host> 的  appBase 指定的目录下面,默认是 webapps 目录

重启tomcat

重新启动tomcat

./bin/shutdown.sh
./bin/startup.sh

打开浏览器测试程序!

FAQ

项目发布完记得删除war文件

如果appBase下面有war文件,即使没有开启unpackWARs,没有开启autoDeploy,tomcat还是会去等待,所以用完记得要删除哦~~

ROOT目录是可以删除的

通过war文件自动部署完项目之后会发现,在同级目录下面有个ROOT目录,这个目录是可以删除掉的

Tomcat启动速度瓶颈在CPU上

tomcat启动慢和内存关系不大,主要cpu才是瓶颈,所以笔记本电脑开发尽量提供IDE的模式调试

项目更新后必须重启Tomcat

项目更新了,必须重启tomcat才能生效,因为java是整体运行思路的语音,和脚本语音不一样,任何一个改动都需要重新来过

鬼谷子叔叔
  • 日志:205
  • 回复:13

进入ta的主页