实例

1 什么是Tomcat(开源免费)(Weblogic - 收费)/JAVA服务器
官方网站:http://tomcat.apache.org/
Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目开发的一个Servlet容器,由于有了 Sun 的参与和支持(技术规范),实现了对Servlet和Java Server Page(JSP)的支持,本身也是一个HTTP服务器,可以单独使用,Tomcat主要来解析JSP语言。成为目前比较流行的 Web 应用服务器。

image.png

  • Tomcat是Apache基金会下的WEB服务器软件,开源、免费的;
  • Tomcat是用于发布和解析JSP(Java Server Page)网页(基于JAVA语言开发的代码),将Tomcat称为JAVA容器,Tomcat软件本身基于JAVA语言开发。
  • JAVA代码是如何开发的呢?
    • 通过JAVA工具开发(JDK),JDK是JAVA语言开发的软件工具包(平台),基于JDK工具包开发JAVA代码之后,需要通过JDK(JRE)去运行和编译、解析JAVA代码;
  • JAVA开发人员通过JDK(调用JAVA API)工具包,开发了一套JAVA程序(JAVA源代码文件),不能直接被系统使用;
  • 通过JDK软件包中自带的编译程序:JAVAC,将JAVA源代码文件编译生成JAVA字节码(计算机可以识别),通过JRE(JVM虚拟机)运行这些JAVA字节码,从而解析这些字节码,最终将其映射到CPU指令集或OS的系统调用。 — 消耗内存
  • 总结:使用JAVA开发的软件程序、发布JAVA代码、JAVA需要运行等,都需要Linux底层系统部署JDK开发工具包(JAVA工具+JRE)(配置JDK环境);

Tomcat、JAVA、JDK、JRE、JVM、JSP概念的区别,详解如下:

  • Tomcat | Resin

基于JAVA语言开发JAVA程序,WEB容器(服务器);

  • JAVA

主流开发语言,跟PHP、ASP、HTML类似网站设计语言; — web | app

  • JDK

JDK是JAVA语言开发的SDK环境,包括:JAVA工具+JRE运行时环境;

  • JRE

JRE是JAVA运行时的环境,主要用于运行JAVA程序、代码,JRE(JVM+JAVA类和库);

  1. - **JVM**

JVM是JAVA虚拟机,是虚拟出来计算机,包括CPU指令、内存堆等资源,主要是用于运行JAVA字节码(JAVA程序);

  • JSP

JSP是JAVA Server Pages(JAVA服务页面),基于JAVA语言开发的动态网页,网页文件命名以.jsp结尾,例如:index.jsp、about.jsp;

支持 JSP 网站,收费版 web 服务器:oracle 的 weblogic ; IBM 的 websphere 免费:Resin(Java-web容器)
WebLogic 是美国 Oracle 公司出品的一个 application server 确切的说是一个基于 JAVAEE 架构的中间件,WebLogic 是用于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java应用服务器。将 Java 的动态功能和 Java Enterprise 标准的安全性引入大型网络应用的开发、集成、部署和管理之中。 (Java - 三个版本 JavaSE JavaEE JavaME)
WebSphere 是 IBM 的软件平台。它是 Web 应用程序和跨平台、跨产品解决方案所需要的整个中间件基础设施。WebSphere 提供了可靠、灵活和健壮的软件运行服务。
中间件 — 不是说作用 - 说的就是“位置”
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
中间件是一类连接软件组件和应用的计算机软件,它包括一组服务。以便于运行在一台或多台机器上的多个软件通过网络进行交互。该技术所提供的互操作性,推动了一致分布式体系架构的演进,该架构通常用于支持并简化那些复杂的分布式应用程序,它包括web服务器、事务监控器和消息队列软件。

安装JDK

rpm -ivh jdk-8u301-linux-x64.rpm

在/etc/profile下写入

export JAVA_HOME=/usr/java/jdk1.8.0_301-amd64
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/fre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HMOE/jre/bin:$PATH

source /etc/proflie 使环境变量生效
java -version 查看java版本

安装Tomcat

http:#tomcat.apache.org/
https:#tomcat.apache.org/download-80.cgi #tomcat下载页面
下载apacha-tomcat - 解压 - 重命名/usr/local/tomcat

[root@ThinkMo ~]# tar xf apache-tomcat-8.5.69.tar.gz
[root@ThinkMo ~]# mv apache-tomcat-8.5.69 /usr/local/tomcat

启动

[root@ThinkMo ~]# /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/java/jdk1.8.0_191
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

查看

[root@ThinkMo ~]# ps -ef | grep java(tomcat)
root      20790      1 12 02:22 pts/1    00:00:03 /usr/java/jdk1.8.0_191/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root      20821  20621  0 02:23 pts/1    00:00:00 grep --color=auto java

默认端口8080

image.png

三个端口:

8080 — 默认tomcat访问端口
8005 — 用于关闭tomcat的(SHUTDOWN 必须要大写,小写不管用)

[root@ThinkMo ~]# telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
SHUTDOWN
Connection closed by foreign host.
[root@ThinkMo ~]# netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN

8009 — AJP端口 用于Apache和Tomcat内部通讯端口

多实例:

[root@ThinkMo ~]# mv /usr/local/tomcat /usr/local/tomcat1
[root@ThinkMo ~]# cp -a /usr/local/tomcat1/ /usr/local/tomcat2

主配置文件

[root@ThinkMo ~]# vim /usr/local/tomcat2/conf/server.xml
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
改为
    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />


    <Server port="8005" shutdown="SHUTDOWN">
改为
    <Server port="8006" shutdown="SHUTDOWN">

改了之后记得要重新启动
如果还不行,kill  进程号,然后在启动

开启两个tomcat

[root@ThinkMo ~]# /usr/local/tomcat1/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat1
Using CATALINA_HOME:   /usr/local/tomcat1
Using CATALINA_TMPDIR: /usr/local/tomcat1/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_191
Using CLASSPATH:       /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar
Tomcat started.
[root@ThinkMo ~]# /usr/local/tomcat2/bin/startup.sh
Using CATALINA_BASE:   /usr/local/tomcat2
Using CATALINA_HOME:   /usr/local/tomcat2
Using CATALINA_TMPDIR: /usr/local/tomcat2/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_191
Using CLASSPATH:       /usr/local/tomcat2/bin/bootstrap.jar:/usr/local/tomcat2/bin/tomcat-juli.jar
Tomcat started.

查看

[root@ThinkMo ~]# ps -ef | grep tomcat
root      30865      1 11 02:34 pts/1    00:00:03 /usr/java/jdk1.8.0_191/bin/java -Djava.util.logging.config.file=/usr/local/tomcat1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat1 -Dcatalina.home=/usr/local/tomcat1 -Djava.io.tmpdir=/usr/local/tomcat1/temp org.apache.catalina.startup.Bootstrap start
root      30902      1 15 02:34 pts/1    00:00:03 /usr/java/jdk1.8.0_191/bin/java -Djava.util.logging.config.file=/usr/local/tomcat2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat2/bin/bootstrap.jar:/usr/local/tomcat2/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat2 -Dcatalina.home=/usr/local/tomcat2 -Djava.io.tmpdir=/usr/local/tomcat2/temp org.apache.catalina.startup.Bootstrap start
root      30918  20621  0 02:34 pts/1    00:00:00 grep --color=auto tomcat

tomcat默认访问

/usr/local/tomcat1/webapps下 ROOT目录

建立index.jsp测试代码

<html>
<body>
<h1>JSP Test Page tomcat1 </h1>
<%=new java.util.Date()%>
</body>
</html>

/usr/local/tomcat2/webapps下 ROOT目录

建立index.jsp测试代码

<html>
<body>
<h1>JSP Test Page tomcat2 </h1>
<%=new java.util.Date()%>
</body>
</html>

问: 如果一个网站有静态和动态 tomcat可以发布吗? — 可以的,只是性能差

实战:动静分离:

192.168.1.12 — Tomcat1 & Tomcat2

192.168.1.11 — Nginx

安装Nginx 并创建虚拟主机

[root@ThinkMo-LB ~]# wget http://www.nginx.org/download/nginx-1.14.2.tar.gz
[root@ThinkMo-LB ~]# yum -y install openssl-devel
[root@ThinkMo-LB ~]# useradd www
[root@ThinkMo-LB ~]#tar  -xvf  nginx-1.14.2.tar.gz
[root@ThinkMo-LB ~]#cd nginx-1.14.2
[root@ThinkMo-LB nginx-1.14.2]#./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
[root@ThinkMo-LB nginx-1第1课 - Tomcat - JVM 实战集群.14.2]#make && make install

修改配置文件,创建虚拟主机

[root@ThinkMo-LB ~]# cd /usr/local/nginx/conf/
[root@ThinkMo-LB conf]# mv nginx.conf nginx.conf.bak
[root@ThinkMo-LB conf]# egrep -v "#|^$" nginx.conf.bak > nginx.conf
[root@ThinkMo-LB conf]# vim nginx.conf
改为
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include /usr/local/domain/*;
}
[root@ThinkMo-LB ~]# mkdir /usr/local/domain
[root@ThinkMo-LB ~]# touch /usr/local/domain/bbs.thinkmo.com
[root@ThinkMo-LB ~]# vim /usr/local/domain/bbs.thinkmo.com  
upstream tomcat_web {
        server 192.168.1.100:8080 weight=1 max_fails=2 fail_timeout=15;
        server 192.168.1.100:8081 weight=1 max_fails=2 fail_timeout=15;
}       
server {
        listen       80;
        server_name  bbs.thinkmo.com;
        location / {
            root   html;
            index  index.html index.htm;
            proxy_set_header Host $host;
            proxy_pass http://tomcat_web;
        }
        location ~* .*\.(html|htm|js|png|jpg|gif|css|jpeg|txt|gz|bz2|zip|bmp|doc|xls|docx)$ {
            root /var/www/html;
            expires 30d;
        }
}

启动nginx

[root@ThinkMo-LB ~]#/usr/local/nginx/sbin/nginx
[root@ThinkMo-LB ~]#mkdir /var/www/html
[root@ThinkMo-LB ~]#cd /var/www/html
[root@ThinkMo-LB ~]#echo "wo shi nginx web" >index.html

重启tomcat

[root@ThinkMo ~]# /usr/local/tomcat1/bin/shutdown.sh
[root@ThinkMo ~]#/usr/local/tomcat1/bin/startup.sh
[root@ThinkMo ~]# /usr/local/tomcat2/bin/shutdown.sh
[root@ThinkMo ~]#/usr/local/tomcat2/bin/startup.sh

测试一下负载均衡集群

[root@ThinkMo-LB ~]# curl 192.168.1.11
<html>
<body>
<h1>JSP Test Page tomcat1 </h1>
Thu Jul 29 21:47:01 CST 2021
</body>
</html>
[root@ThinkMo-LB ~]# curl 192.168.1.11/index.html
wo shi nginx web

Tomcat配置文件

[root@ThinkMo ~]# vim /usr/local/tomcat1/conf/server.xml
<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
自定义发布目录:在末尾</Host>标签前加入:
<Context path="/" docBase="/data/webapps/www" reloadable="true"/>
并将上放“appBase”重置为空 appBase=""

Tomcat相关目录&文件

tomcat
    |---bin Tomcat:存放启动和关闭tomcat脚本;
    |---conf  Tomcat:存放不同的配置文件(server.xml和web.xml);
    |---lib:包含Tomcat使用的jar文件.unix平台此目录下的任何文件都被加到Tomcat的classpath中;
    |---logs:存放Tomcat执行时的LOG文件;
|---webapps:Tomcat的主要Web发布目录(包括应用程序示例);
    |--- ROOT:tomcat的家目录
        |--- index.jsp:Tomcat的默认首页文件
|---work:存放jsp编译后产生的class文件或servlet文件存放
|---temp:存放Tomcat运行时所产生的临时文件

server.xml配置

元素名
属性
解释
server port 指定一个端口,这个端口负责监听关闭tomcat的请求
shutdown 指定向端口发送的命令字符串
service name 指定service的名字
Connector(表示客户端和service之间的连接) port 指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求
minProcessors 服务器启动时创建的处理请求的线程数
maxProcessors 最大可以创建的处理请求的线程数
enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout 指定超时的时间数(以毫秒为单位)
Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求) defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
定义一些虚拟主机、默认主机、发布目录等
Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范) docBase 应用程序的路径或者是WAR文件存放的路径
path 表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/**
reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序
host(表示一个虚拟主机) name 指定主机名
appBase 应用程序基本目录,即存放应用程序的目录
unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
Logger(表示日志,调试和错误信息) className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
prefix 指定log文件的前缀
suffix 指定log文件的后缀
timestamp 如果为true,则log文件名中要加入时间,如下例:localhost_log.001-10-04.txt
Realm(表示存放用户名,密码及role的数据库) className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样) className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
directory 指定log文件存放的位置
pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多

实战2: jforum论坛部署

[root@ThinkMo ~]# mkdir -p /data/webapps/www/
[root@ThinkMo ~]# mv jforum-2.6.2.war /data/webapps/www/
[root@ThinkMo ~]# cd  /data/webapps/www/
[root@ThinkMo ~]# jar xf jforum-2.6.2.war

重启tomcat

[root@ThinkMo ~]# /usr/local/tomcat1/bin/shutdown.sh
[root@ThinkMo ~]#/usr/local/tomcat1/bin/startup.sh

访问192.168.1.100:8080
image.png

image.png

Tomcat连接器选择

tomcat中一共有三种运行模式,分别是:bio,nio,apr
bio是阻塞式IO操作,使用的是传统的java i/o处理方式,对于每一个请求都要创建一个线程来进行处理,所以开销较大不适合处理高并发的场景
nio是基于java中非阻塞IO操作的API实现,比传统的i/o处理方式有更高的并发运行性能
apr是从操作系统级别解决异步IO问题,大幅度提高服务器的并发处理性能,也是Tomcat生产环境运行的首选方式

安装tomcat-Native

Tomcat 可以使用 apr 来提供更好的伸缩性、性能和集成到本地服务器技术。用来提高 tomcat 的性能。 tomcat native 在具体的运行平台上,提供了一种优化技术,它本身是基于 ARP(Apache Portable(轻便) Runtime)技术
我们应用了 tomcat native 技术之后,tomcat 在跟操作系统级别的交互方面可以做得更好,并且它更像apache 一样,可以更好地作为一台 web server。 tomcat 可以利用 apache 的 apr 接口,使用操作系统的部分本地操作,从而提升性能APR 提升的是静态页面处理能力

注意:这个包在tomcat8的bin目录已经提供

关于tomcat-native的相关介绍及下载: http:#tomcat.apache.org/download-native.cgi

[root@Master ]# yum install apr-devel gcc gcc-c++ openssl-devel openssl
[root@Master ~]# cd /usr/local/tomcat1/bin/
[root@Master bin]# cp tomcat-native.tar.gz /usr/local/
[root@Master bin]# cd /usr/local/
[root@Master local]# tar xf tomcat-native.tar.gz -C /usr/local/src/
[root@Master local]# cd /usr/local/src/
[root@Master src]# cd tomcat-native-1.2.16-src/native/
[root@Master native]# ./configure --with-apr=/usr/ --with-java-home=/usr/java/jdk1.8.0_301-amd64 --with-ssl
[root@Master native]# make && make install

安装完:提示:

image.png

需要添加库文件:

[root@Master native]# vim /etc/ld.so.conf
/usr/local/apr/lib  ##添加此行
[root@Master native]# ldconfig
[root@Master native]# echo "ldconfig" >>/etc/rc.local
添加环境变量:
[root@localhost native]# vim /etc/profile.d/jdk8.sh
最后添加:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
重读生效:
[root@localhost native]#source /etc/profile.d/jdk8.sh

编辑主服务文件,指定处理协议为apr

[root@localhost native]# vim /usr/local/tomcat1/conf/server.xml
将默认的protocol="HTTP/1.1"修改为protocol="org.apache.coyote.http11.Http11AprProtocol"

image.png

引用apr:

[root@localhost native]# vim /usr/local/tomcat1/bin/catalina.sh
269行下面添加:
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

image.png

Tomcat性能调优

线上环境使用默认tomcat配置文件,性能很一般,为了满足大量用户的访问,需要对tomcat进行参数性能优化,具体优化的地方如下:

  • Linux内核的优化
  • 服务器资源配置的优化
  • Tomcat参数优化
  • 配置负载集群优化

这里着重讲解tomcat参数的优化: server.xml文件,关闭DNS查询、配置最大并发等参数。
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat启动的线程数达到最大时,接受排队的请求个数,默认值为100
当然这些值都不是越大越好,需要根据实际情况来设定。可以基于测试的基础上来不断的调优分析。

<Connector port="8080"   
        protocol="org.apache.coyote.http11.Http11AprProtocol"  
           connectionTimeout="20000"  
           redirectPort="443"   
           maxThreads="5000"
           minSpareThreads="20"  
           acceptCount="10000"
           disableUploadTimeout="true"
           enableLookups="false"   
           URIEncoding="UTF-8" />

Bin/catalina.sh JVM参数优化,添加如下内容

CATALINA_OPTS="$CATALINA_OPTS -Xms512M -Xmx1024M -Xmn100M -XX:SurvivorRatio=4 -XX:+UseConcMarkS
weepGC -XX:CMSInitiatingOccupancyFraction=82 -DLOCALE=UTF-16LE  -DRAMDISK=/ -DUSE_RAM_DISK=ture
-DRAM_DISK=true -Djava.rmi.server.hostname=192.168.111.128 -Dcom.sun.management.jmxremote.port
=10000 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"

*PS:JVM虚拟机

JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用,如图所示JDK、JRE、JVM关系图:
image.png

如下为JVM虚拟机主要由堆、栈、本地方法栈、方法区组成,物理架构如图:
image.png
1)堆
所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:
image.png

  • 新生代,新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
  • 旧生代,用于存放新生代中经过多次垃圾回收仍然存活的对象
  • 持久带,(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。

image.png

-Xmx:最大堆内存,如:-Xmx512m;
-Xms:初始时堆内存,如:-Xms256m;
-XX:MaxNewSize:最大年轻区内存;
-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%;
-XX:MaxPermSize:最大持久带内存;
-XX:PermSize:初始时持久带内存;
-XX:+PrintGCDetails。打印 GC 信息;
-XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3;
-XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10。
2)栈
    每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。
   -xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。
3)本地方法栈
用于支持native方法的执行,存储了每个native方法调用的状态
4)方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。
[root@ThinkMo ~]# vim /usr/local/tomcat1/bin/catalina.sh
空行加入
CATALINA_OPTS="$CATALINA_OPTS -Xms512M -Xmx1024M -Xmn100M"

点击manager App,需要一个用户名和密码:
image.png
创建管理Manger App用户

[root@Master ~]# vim /usr/local/tomcat2/conf/tomcat-users.xml
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
#去掉注释<!--    --> 修改为如下,
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="123456" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>

角色说明

1:“manager-gui”:Allows access to the html interface(允许通过web的方式登录查看服务器信息)。
2:“manager-script”: Allows access to the plain text interface(允许以纯文本的方式访问)。
3:“manager-jmx”: Allows access to the JMX proxy interface(允许jmx的代理访问)。
4:“manager-status”: Allows access to the read-only status pages(允许以只读状态访问)。
5:  admin-gui: 允许访问HTML GUI
6 : admin-script: 允许访问文本接口

官方说明http:#tomcat.apache.org/tomcat-9.0-doc/manager-howto.html#Configuring_Manager_Application_Access
tomcat8以上还要增加以下配置

[root@Master ~]# vim /usr/local/tomcat1/conf/Catalina/localhost/manager.xml
内容如下:
<Context privileged="true" antiResourceLocking="false"
         docBase="${catalina.home}/webapps/manager">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>

重启tomcat

[root@Master ~]# /usr/local/tomcat1/bin/shutdown.sh
[root@Master ~]# /usr/local/tomcat1/bin/startup.sh


搭建基于域名的虚拟主机

1、在192.168.1.11上对应的域名如下

  [root@hd1 ~]# cat /etc/hosts|grep thinks
  192.168.1.11thinkmo.com
  192.168.1.11 thinkmo.cn

2、建立虚拟主机存放网页的根目录,并设置首页index.html

[root@hd1 ~]# mkdir -p /var/www/html/{web1,web2}
[root@hd1 ~]# echothinkmo.com> /var/www/html/web1/index.html
[root@hd1 ~]# echo thinkmo.cn> /var/www/html/web2/index.html

3、修改server.xml配置文件

[root@hd1 ~]# vim /usr/local/tomcat/conf/server.xml
<Host name="thinkmo.com"  appBase="/var/www/html">
<Context path="" docBase="/var/www/html/web1" />
</Host>
<Host name="thinkmo.cn"  appBase="/var/www/html">
<Context path="" docBase="/var/www/html/web2" />
</Host>

#在末尾的</Engine>上面添加上面这几行

appBase指定应用程序(网站)的基本路径,这里可以存放多个程序(网站),一般是相对路径,相对于tomcat的安装目录。
Context path=""为虚拟目录,如果是空,表示直接就是/,如果是如path="aa",那么访问的时候就是site:8080/aa
docBase="……" 为实际目录,就是可以是绝对路径,如果是相对路径就是基于appBase

4、重启tomcat ,杀死tomcat程序(很多时候shutdown.sh脚本不好用),然后启动tomcat

image.png

image.png

5、测试

image.png