效果如下
同一台服务器、同一个 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 "%r" %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 "%r" %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