[TOC]
一、JDK的安装 JDK是 Java 语言的软件开发工具包,JDK协议基于 JRL(JavaResearch License)协议
java程序的源码是.java,需要使用JDK里面的javac将.java转换为字节码(.class),在通过虚拟机将字节码转换为Linux和Windows里的机器码
JDK分为免费版(openjdk:测试环境使用)和收费版(oraclejdk 8版本以后收费:生产环境使用)
openjdk的安装,只需要yum或者apt即可安装
[root@Rocky ~] [root@ubuntu2204 ~]
1.1、安装oracle官方JDK 官方下载链接:
1 #注意需要注册登录后,才能下载JDK https://www.oracle.com/java/technologies/downloads/#java8 https://www.oracle.com/java/technologies/downloads/#java11 https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
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 [root@Rocky ~] anaconda-ks.cfg jdk-8u321-linux-x64.tar.gz [root@Rocky ~] [root@Rocky ~] [root@Rocky local ] bin etc games include jdk1.8.0_321 lib lib64 libexec sbin share src [root@Rocky local ] [root@Rocky local ] bin etc games include jdk jdk1.8.0_321 lib lib64 libexec sbin share src [root@Rocky ~]export JAVA_HOME=/usr/local/jdk export PATH=$PATH :$JAVA_HOME /binexport JRE_HOME=$JAVA_HOME /jreexport CLASSPATH=.:$JAVA_HOME /lib/:$JRE_HOME /lib/ :wq [root@Rocky ~] [root@Rocky ~] Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program [root@centos8 ~] [root@Rocky ~] java version "1.8.0_321" Java(TM) SE Runtime Environment (build 1.8.0_321-b07) Java HotSpot(TM) 64-Bit Server VM (build 25.321-b07, mixed mode) [root@Rocky ~] /usr/local/jdk/bin/java
二、Tomcat的二进制安装 注意:安装tomcat前必须先部署JDK
官方和镜像站点下载:
1 2 https://tomcat.apache.org https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/
2.1、Tomcat的安装 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 [root@Rocky ~] [root@Rocky ~] anaconda-ks.cfg apache-tomcat-9.0.59.tar.gz jdk-8u321-linux-x64.tar.gz [root@Rocky ~] [root@Rocky ~] [root@Rocky local ] apache-tomcat-9.0.59 bin etc games include jdk jdk1.8.0_321 lib lib64 libexec sbin share src [root@Rocky local ] [root@Rocky local ] [root@Rocky local ] [root@Rocky local ] /usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk/bin [root@Rocky local ] Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: Usage: catalina.sh ( commands ... ) commands: debug Start Catalina in a debugger debug -security Debug Catalina with a security manager jpda start Start Catalina under JPDA debugger run Start Catalina in the current window run -security Start in the current window with security manager start Start Catalina in a separate window start -security Start in a separate window with security manager stop Stop Catalina, waiting up to 5 seconds for the process to end stop n Stop Catalina, waiting up to n seconds for the process to end stop -force Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running stop n -force Stop Catalina, wait up to n seconds and then use kill -KILL if still running configtest Run a basic syntax check on server.xml - check exit code for result version What version of tomcat are you running? Note: Waiting for the process to end and use of the -force option require that $CATALINA_PID is defined [root@Rocky local ] Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: Tomcat started. [root@Rocky local ] State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* LISTEN 0 100 *:8080 *:* LISTEN 0 128 *:80 *:* LISTEN 0 128 [::]:22 [::]:* [root@Rocky local ] Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: [root@centos8 ~] [root@Rocky local ] Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: Tomcat started. [root@Rocky local ] Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS:
注意:为了后期更方便管理,需添加service文件
2.2、配置tomcat自启动的service文件 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 [root@Rocky ~] [root@Rocky ~] [root@Rocky ~] [root@Rocky ~] [Unit] Description=Tomcat After=syslog.target network.target [Service] Type=forking EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf ExecStart=/usr/local/tomcat/bin/startup.sh ExecStop=/usr/local/tomcat/bin/shutdown.sh PrivateTmp=true User=tomcat Group=tomcat [Install] WantedBy=multi-user.target :wq [root@Rocky ~] [root@Rocky ~]
三、tomcat的文件结构和组成
目录
说明
bin
服务启动、停止等相关程序和文件
conf
配置文件
lib
库目录
logs
日志目录
webapps
应用程序,应用部署目录
work
jsp编译后的结果文件,建议提前预热访问,升级应用后,删除此目录数据才能更新
注意:当java程序更新时,需要将work目录数据删除(rm -rf /usr/local/tomcat/work/*)
3.1、JSP WebApp目录结构 $CATALINA_BASE/webapps 下面的每个目录对应的WebApp,可能有以下子目录,但下面子目录是非必须的
①主页配置:默认按以下顺序查找主页文件 index.html,index.htm、index.jsp
②WEB-INF/:当前目录WebApp的私有资源路径,通常存储当前应用使用的web.xml和context.xml配置文件
③META-INF/:类似于WEB-INF,也是私有资源的配置信息,和WEB-INF/目录一样浏览器无法访问
④classes/:类文件,当前webapp需要的类
⑤lib/:当前应用依赖的jar包
3.2、主页设置 3.2.1、全局配置实现修改默认主页文件 默认情况下 tomcat 会在**$CATALINA_BASE**/webapps/ROOT/目录下按以下次序查找文件,找到第一个则进行显示
——index.html
——index.htm
——index.jsp
可以通过修改 $CATALINA_BASE /conf/web.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 [root@Rocky ~] <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> [root@Rocky ~] [root@Rocky ~] <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> :wq [root@Rocky tomcat] [root@Rocky tomcat]
四、部署基于JAR包的博客系统Halo Halo 是一款现代化的基于JAVA实现的博客/CMS系统
Halo 官网: https://halo.run/
Halo 部署: https://docs.halo.run/install/linux
docker 部署: https://docs.halo.run/install/docker
jar包不依赖于Tomcat
1 2 3 4 [root@Rocky opt] halo-1.4.17.jar [root@Rocky opt]
五、自动的应用部署war包 5.1、将jsp文件制作成war包 1 2 3 4 5 6 7 8 9 10 11 [root@centos8 ~] test.jsp [root@centos8 ~] [root@centos8 app2] added manifest adding: test.html(in = 28) (out= 27)(deflated 3%) adding: test.jsp(in = 329) (out= 275)(deflated 16%) [root@centos8 app2] [root@centos8 data] app2.war [root@centos8 data]
5.2、自动应用部署上面的war包 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@centos8 data] [root@centos8 tomcat] [root@centos8 tomcat] total 8 drwxr-x--- 15 tomcat tomcat 4096 Feb 9 11:02 docs drwxr-x--- 6 tomcat tomcat 83 Feb 9 11:02 examples drwxr-x--- 5 tomcat tomcat 87 Feb 9 11:02 host-manager drwxr-x--- 5 tomcat tomcat 103 Feb 9 11:02 manager drwxr-x--- 3 tomcat tomcat 300 Feb 9 19:59 ROOT drwxr-x--- 3 tomcat tomcat 55 Feb 9 20:14 app2 -rw-r--r-- 1 tomcat tomcat 862 Feb 9 20:05 app2.war [root@centos8 tomcat] total 8 drwxr-x--- 2 tomcat tomcat 44 Feb 9 20:14 META-INF -rw-r----- 1 tomcat tomcat 329 Aug 30 02:30 test.jsp
六、基于WEB的管理Server status和Manager APP实现应用部署 tomcat 提供了基于WEB的管理页面,默认由 tomcat-admin-webapps.noarch包提供相关文件
打开浏览器可以访问tomcat管理的默认管理页面,点击下图两个按钮都会出现下面提示403的错误提示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@centos8 tomcat] <tomcat-users xmlns="http://tomcat.apache.org/xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd" version="1.0" > <role rolename="manager-gui" /> <user username="admin" password="123456" roles="manager-gui" /> </tomcat-users> :wq [root@centos8 tomcat] [root@centos8 tomcat] <Context antiResourceLocking="false" privileged="true" > <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" /> <Manager sessionAttributeValueClassNameFilter="java\.lang\. :wq #修改WebApp的配置无需重启服务即可生效
七、tomcat实现多虚拟主机 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [root@Rocky ~] [root@Rocky tomcat] <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" > <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <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="n68.magedu.org" appBase="/data/tomcat/n68" unpackWARs="true" autoDeploy="true" > <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="n68_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> :wq [root@Rocky tomcat] [root@Rocky tomcat] [root@Rocky ROOT] <h1> 10.0.0.186 </h1> :wq [root@Rocky ROOT] [root@DNS ~]$TTL 1D @ IN SOA master admin.magedu.org ( 6 1D 10M 1D 6H ) NS master NS slave1 master A 10.0.0.128 slave1 A 10.0.0.184 n68 A 10.0.0.186 :wq [root@DNS ~] [root@Rocky tomcat]
八、tomcat的负载均衡
8.1、Tomcat配置 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [root@tomcat1 ~] [root@tomcat1 tomcat] <Host name="www.magedu.org" appBase="/data/tomcat/node1/" unpackWARs="true" autoDeploy="true" > <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node1_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> :wq [root@tomcat1 ~] [root@tomcat1 ~] [root@tomcat1 ROOT] [root@tomcat1 ROOT] <%@ page import="java.util.*" %> <!DOCTYPE html> <html lang="en" > <head > <meta charset="UTF-8" > <title>tomcat test </title> </head> <body> <h1> Tomcat Website node1 </h1> <div>On <%=request.getServerName() %></div> <div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div> <div>SessionID = <span style="color:blue" ><%=session.getId() %></span></div> <%=new Date()%> </body> </html> [root@tomcat1 ~] [root@tomcat1 ROOT] ----------------------------------------------------------------------------------- [root@tomcat2 ~] [root@tomcat2 tomcat] <Host name="www.magedu.org" appBase="/data/tomcat/node2/" unpackWARs="true" autoDeploy="true" > <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="node2_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> :wq [root@tomcat2 ~] [root@tomcat2 ~] [root@tomcat2 ROOT] [root@tomcat2 ROOT] <%@ page import="java.util.*" %> <!DOCTYPE html> <html lang="en" > <head > <meta charset="UTF-8" > <title>tomcat test </title> </head> <body> <h1> Tomcat Website node2 </h1> <div>On <%=request.getServerName() %></div> <div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div> <div>SessionID = <span style="color:blue" ><%=session.getId() %></span></div> <%=new Date()%> </body> </html> [root@tomcat2 ~] [root@tomcat2 ROOT]
8.2、DNS解析 1 2 3 4 5 6 7 8 9 10 11 [root@DNS ~]$TTL 1D @ IN SOA master admin.magedu.org ( 6 1D 10M 1D 6H ) NS master NS slave1 master A 10.0.0.128 slave1 A 10.0.0.184 node1 A 10.0.0.216 node2 A 10.0.0.217 :wq [root@DNS ~]
8.3、nginx的配置(反向代理与负载均衡) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@nginx ~] http { upstream tomcat { server 10.0.0.216:8080; server 10.0.0.217:8080; } server { listen 80; server_name localhost; location / { root html; index index.html index.htm; proxy_pass http://tomcat; proxy_set_header Host $http_host ; } } } :wq [root@nginx ~]
8.3.1、保持session不发生变化 1 2 3 4 5 6 7 8 9 [root@nginx ~] upstream tomcat { hash $cookie_JSESSIONID ; server 10.0.0.216:8080; server 10.0.0.217:8080; } :wq [root@nginx ~]
九、tomcat和memcached集成在一台主机,实现session共享 msm(memcached session manager)提供将Tomcat的session保持到memcached或redis的程序,可以实现高可用。
注意:msm不支持Tomcat10版本
项目早期托管在google code,目前在Github
github网站链接:
1 https://github.com/magro/memcached-session-manager
安装参考链接:
1 https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration
将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中
去,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。
1 2 3 4 5 6 7 8 9 10 11 memcached-session-manager-2.3.2.jar memcached-session-manager-tc9-2.3.2.jar #如果是Tomcat8,需要安装tc8 spymemcached-2.12.3.jar msm-kryo-serializer-2.3.2.jar kryo-serializers-0.45.jar kryo-3.0.3.jar minlog-1.3.1.jar reflectasm-1.11.9.jar asm-5.2.jar objenesis-2.6.jar
9.1、Tomcat配置 和上面8.1、Tomcat配置相同
9.2、DNS解析 和上面8.2、DNS解析相同
9.3、nginx的配置(反向代理与负载均衡) 和上面8.3、nginx的配置(反向代理与负载均衡)相同
9.4、memcached的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@tomcat1 ~] [root@tomcat1 ~] PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="" :wq [root@tomcat1 ~] [root@tomcat1 ~] State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:11211 *:* ------------------------------------------------------------------------------------ [root@tomcat2 ~] [root@tomcat2 ~] [root@tomcat2 ~] State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:11211 *:*
9.5、Tomcat和memcached的关联设置 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 33 34 35 36 [root@tomcat1 tomcat] --> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:10.0.0.216:11211,n2:10.0.0.217:11211" failoverNodes="n1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context> :wq [root@tomcat1 tomcat] [root@tomcat1 lib] rz waiting to receive. [root@tomcat1 lib] 43 [root@tomcat1 lib] ------------------------------------------------------------------------------------ [root@tomcat2 tomcat] --> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="n1:10.0.0.216:11211,n2:10.0.0.217:11211" failoverNodes="n2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context> :wq [root@tomcat2 tomcat] [root@tomcat2 lib] 43 [root@tomcat2 lib]
十、redis实现non-sticky模式的msm,实现session共享 将spymemcached.jar、memcached-session-manage、kyro相关的jar文件都放到Tomcat的lib目录中
去,这个目录是 $CATALINA_HOME/lib/ ,对应本次安装就是/usr/local/tomcat/lib。
1 2 3 4 5 6 7 8 9 10 11 12 13 memcached-session-manager-2.3.2.jar memcached-session-manager-tc9-2.3.2.jar #如果是Tomcat8,需要安装tc8 spymemcached-2.12.3.jar jedis-3.0.0.jar msm-kryo-serializer-2.3.2.jar kryo-serializers-0.45.jar kryo-3.0.3.jar minlog-1.3.1.jar reflectasm-1.11.9.jar asm-5.2.jar objenesis-2.6.jar
10.1、Tomcat配置 和上面8.1、Tomcat配置相同
10.2、DNS解析 和上面8.2、DNS解析相同
10.3、nginx的配置(反向代理与负载均衡) 和上面8.3、nginx的配置(反向代理与负载均衡)相同
10.4、redis配置 1 2 3 4 5 6 [root@redis ~] [root@redis ~]bind 0.0.0.0 :wq [root@redis ~]
10.5、Tomcat和redis的关联设置 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 [root@tomcat1 tomcat] --> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="redis://10.0.0.218" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context> :wq [root@tomcat1 tomcat] -------------------------------------------------------------------------- [root@tomcat2 tomcat] --> <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="redis://10.0.0.218" sticky="false" sessionBackupAsync="false" lockingMode="uriPattern:/path1|/path2" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" /> </Context> :wq [root@tomcat2 tomcat]
10.6、检测redis是否有session数据 1 2 3 4 5 6 7 8 9 [root@redis ~] 127.0.0.1:6379> keys * (empty list or set ) 127.0.0.1:6379> 127.0.0.1:6379> keys * 1) "validity:EB2796C9FF36561966BC7CFA3BBBA079" 2) "EB2796C9FF36561966BC7CFA3BBBA079"
十一、