首页 » 工作 » 方法 » 正文

同一个 Tomcat 配置多个项目并共用一个端口

发布者:某某人
2019/01/12 浏览数(145) 分类:方法 暂无评论

效果如下

同一台服务器、同一个 Tomcat、同一个端口。

测试环境

服务器:192.168.0.249 CentOS 7.6.1810 tomcat-7.0.76-8.el7_5.noarch
客户机:192.168.0.179 DeepinLinux 15.8 桌面版 Google Chrome 70.0.3538.77

准备项目数据

创建第一个项目 /data/webapps/localhost/index.html,内容为:

/data/webapps/localhost

创建第二个项目 /data/webapps/serverhost/index.html,内容为:

second host

目录结构

/data
├─ webapps
│   ├─ localhost
│   │   └─ index.html
│   └─ serverhost
│       └─ index.html
└─ bakup

为目录添加权限

# 不要关闭 SELinux
semanage fcontext -l | grep /data
semanage fcontext -a -t tomcat_var_lib_t '/data(/.*)?
restorecon -RvvF /data

如果找不到命令,需要安装工具包:

yum -y install policycoreutils-python

临时变更SElinux权限

chcon -t tomcat_var_lib_t -R /data

查看整理过的 SELinux 日志

yum install setroubleshoot
sealert -a /var/log/audit/audit.log > ~/selinux.log

安装 JDK

CentOS 默认没有安装 JDK,如有安装且版本不正确需要先卸载。

因为服务器没有浏览器,网址缩短后在服务器上下载时因丢失oracle网站的会话而不能下载,所以我们在 Deepin 上从这个地址下载好jdk1.8文件后后传到服务器上,服务器是 CentOS 所以选择 rpm 包,使用 scp 从本地传送到服务器上已经创建好的目录中。

从本地传到服务器上

scp ~/Download/jdk-8u191-linux-x64.rpm root@192.168.0.249:/root/download/

在服务器上安装JDK

rpm -Uvh /root/download/jdk-8u191-linux-x64.rpm

查找JDK安装位置

[root@server ~]# whereis java
java: /usr/bin/java /usr/share/man/man1/java.1
[root@server ~]# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jan 12:58 /usr/bin/java -> /etc/alternatives/java
[root@server ~]# ll /etc/alternatives/java
rwxrwxrwx. 1 root root 41 Jan 12:58 /etc/alternatives/java -> /usr/java/jdk1.8.0_191-amd64/jre/bin/java

找到安装位置在 /usr/java/jdk1.8.0_191-amd64/

添加环境变量

# vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_191-amd64
export JAVA_BIN=$JAVA_HOME/bin
export JAVA_LIB=$JAVA_HOME/lib
export CLASSPATH=.:$JAVA_LIB/toos.jar:$JAVA_LIB/dt.jar

启用环境变量

source /etc/profile

安装 Tomcat

安装并设置 Tomcat 为开机启动

yum -y install tomcat
systemctl enable tomcat

Tomcat 的默认端口

8005:用于停止Tomcat的默认端口
8080:HTTP连接的默认端口
8009:Apache的侦听默认端口
8443:SSL的连接默认端口

Tomcat 的 server.xml 配置如下:

注意配置里有两个 Host。

<?xml version='1.0' encoding='utf-8'?>
<!-- 为减少代码,tomcat自带的注释已删除 -->
<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.JasperListener" />
  <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="8080" 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" resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="/data/webapps/localhost" 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>
      <Host name="serverhost"  appBase="/data/webapps/serverhost" 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>

配置说明

每个 Service 只能有一个 Engine。
一个 Engine 可以包含多个 Host,每个 Host 定义一个虚拟主机。
Host 的 appBase 指定虚拟主机的目录,可以指定绝对目录,也可以指定相对于<CATALINA_HOME>的相对目录。若无默认为<CATALINA_HOME>/webapps。
CATALINA_HOME 的位置在 /etc/tomcat/tomcat.conf 里被设置为了 /usr/share/tomcat/ 。
Host 的 appBase 是应用程序基本目录,即存放应用程序的目录。
Context 是使用最频繁的元素,每个 Context 代表了运行在虚拟主机上的一个Web应用。一个 Host 可以包含多个 Context,每个web应用有唯一的一个相对应的 Context 代表 web 应用自身。
Context 的 docBase 是应用程序的路径或者是WAR文件存放的路径。
默认的 localhost 位置是 /usr/share/tomcat/webapps/ 。

设置项目各自的主目录

一个项目一个 Host,Host 在 server.xml 里配置。

创建第一个项目的 /etc/tomcat/Catalina/localhost/ROOT.xml,内容如下:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="/data/webapps/localhost" debug="0" privileged="true" />

创建第二个项目的 /etc/tomcat/Catalina/serverhost/ROOT.xml,内容为:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="/data/webapps/serverhost" debug="0" privileged="true">                                                   
</Context>

Context 不写 path 属性表示不使用二级目录、直接输入域名即可访问到项目。

设置为 80 端口

方法一:tomcat 直接使用 80 端口

编辑 /etc/tomcat/server.xml 找到 8080 修改 80。

编辑 /usr/lib/systemd/system/tomcat.service 删除 User=tomcat。

用户 tomcat 据说不能使用小于 1024 的端口,所以要删除“User=tomcat”(亲测确实用不了,不是 firewalld 和 SELinux 的锅),谁知道为毛 nginx 和 apache 就可以用 80 还能以 nginx 身份运行,生成的文件所有人还是 nginx 而 tomcat 就不行?

方法二:端口转发实现 80 端口访问 tomcat

# 不要关闭防火墙
firewall-cmd --add-masquerade --permanent
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
firewall-cmd --reload

完成,查看最终效果

# 重新启动 Tomcat
systemctl restart tomcat

第一个 Host :http://192.168.0.249/

第二个 Host :http://serverhost/

第二个 Host 需要编辑 deepin 的 /etc/hosts 添加以下内容(本地解析)才可以打开,如果是服务器直接在 DNS 中解析域名不需要操作这一步:

192.168.0.249 serverhost

暂时木有评论啊,等您坐沙发呢!

发表评论

点击返回顶部
  1. 留言
  2. 联系方式