jdk jre jvm 介绍

  • jdk(Java Development Kit): 是Java语言的开发工具包,提供了Java语言的开发工具,它里面包含了JRE,同时也就包含JVMJava虚拟机。
    • jre(Java Runtime Environment):是Java语言的运行环境,它包含了Java虚拟机,也就是JVM,同时还包含了Java语言运行需要的核心类库。
      • jvm (Java Virtual Machine): 实现跨平台需要依赖Java的虚拟机

java架构图

Linux Tomcat介绍

据说java最早是用来做电视机机顶盒,后来出现了web,jdk+ servlet,jsp模式让java一下子流行起来,servlet的功能就跟cgi类似,用来解释websocket,jsp是将为了更好的书写html,将java语句以标签形式写在jsp中,jasper将.jsp的文件翻译称.java。传统的.java通过javac编译器翻译为.class,运行在jvm上,所以.class并不是真正的计算机二进制代码,而是jvm在次编译.class才能解释成计算机认识的二进制代码。
tomcat实现了java 2 EE的部分功能,如servlet,jsp,是一款开源软件,接下去主要介绍tomcat。

openjdk与jdk的关系,前者开源,后者是oracle公司拥有,红帽的base仓库中收录的是openjdk。

openjdk 安装

[root@node1 ~]# yum -y install java-1.8.0-openjdk-devel.x86_64

JAVA_HOME配置

[root@node1 alertscripts]# which java
/usr/bin/java
[root@node1 alertscripts]# ll /usr/bin/java
lrwxrwxrwx 1 root root 22 Jun 12 15:03 /usr/bin/java -> /etc/alternatives/java
[root@node1 alertscripts]# ll /etc/alternatives/java
lrwxrwxrwx 1 root root 73 Jun 12 15:03 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64/jre/bin/java

[root@node1 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.x86_64

jdk安装

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

[root@node2 ~]# wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.rpm

[root@node2 ~]# rpm -ivh jdk-8u171-linux-x64.rpm

JAVA_HOME配置

[root@node1 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH

tomcat 安装

[root@node1 jvm]# yum install tomcat
会依赖tomcat-jsp-2.2-api   tomcat-servlet-3.0-api 还有其他很多

#web相关安装
[root@node1 jvm]# yum install tomcat-webapps tomcat-admin-webapps tomcat-doc-webapps
[root@node1 jvm]# systemctl start tomcat
[root@node1 jvm]# ss -lntup|grep java
tcp    LISTEN     0      100      :::8080                 :::*                   users:(("java",pid=103600,fd=49))
tcp    LISTEN     0      1      ::ffff:127.0.0.1:8005                 :::*                   users:(("java",pid=103600,fd=54))
tcp    LISTEN     0      100      :::8009                 :::*                   users:(("java",pid=103600,fd=50))

tomcat 二进制安装

[root@node2 ~]# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.88/bin/apache-tomcat-7.0.88.tar.gz

[root@node2 ~]# tar xf apache-tomcat-7.0.88.tar.gz  -C /usr/local/
[root@node2 local]# pwd
/usr/local
[root@node2 local]# ln -sv apache-tomcat-7.0.88 tomcat
‘tomcat’ -> ‘apache-tomcat-7.0.88’

[root@node2 local]# cd tomcat/
[root@node2 tomcat]# ls
bin  conf  lib  LICENSE  logs  NOTICE  RELEASE-NOTES  RUNNING.txt  temp  webapps  work

环境变量配置

[root@node2 tomcat]# vim /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PAHT=$CATALINA_HOME/bin:$PATH

启动脚本

[root@node2 tomcat]# catalina.sh -h
[root@node2 tomcat]# catalina.sh configtest #配置文件测试

[root@node2 tomcat]# catalina.sh start
[root@node2 tomcat]# ss -lntup|grep java
tcp    LISTEN     0      100      :::8080                 :::*                   users:(("java",pid=39807,fd=45))
tcp    LISTEN     0      1      ::ffff:127.0.0.1:8005                 :::*                   users:(("java",pid=39807,fd=51))
tcp    LISTEN     0      100      :::8009                 :::*                   users:(("java",pid=39807,fd=46))

tomcat的配置文件构成

Linux Tomcat介绍

server.xml:主配置文件;
web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置;
context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置;
tomcat-users.xml:用户认证的账号和密码文件;
catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略;
catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数;
logging.properties:日志系统相关的配置;

SHUTDOWN

SHUTDOWN 能关闭服务 所以只监听在本地 -1 不监听,生产环境最好关掉。

[root@node1 tomcat]# vim /etc/tomcat/server.xml
<Server port="8005" shutdown="SHUTDOWN">  

#[root@node1 usr]# telnet 127.0.0.1 8005
#SHUTDOWN
#[root@node1 usr]# ss -lntup|grep 8080
#[root@node1 usr]# ss -lntup|grep 8005

manager-gui

 [root@node1 Catalina]# vim /etc/tomcat/tomcat-users.xml
    <role rolename="manager-gui"  />
  <user username="tomcat" password="tomcat" roles="manager-gui"/>
[root@node1 Catalina]# systemctl restart tomcat

Linux Tomcat介绍

admin-gui

配置虚拟机都是在内存中,重启就没了

[root@node1 Catalina]# vim /etc/tomcat/tomcat-users.xml

<role rolename="admin-gui"/>
<!-- <role rolename="admin-script"/> -->
<!-- <role rolename="manager"/> -->
 <role rolename="manager-gui"  />
  <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>

Linux Tomcat介绍

connector

Connector可以定义多个

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

       <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

属性:

port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
address:监听的IP地址;默认为本机所有可用地址;
maxThreads:最大并发连接数,默认为200;
enableLookups:是否启用DNS查询功能; 必须false,反接客户端ip
acceptCount:等待队列的最大长度; 半链接池
secure:
sslProtocol:

Host - Context -Valve

<Host name="www.test.deve" appBase="/www/data/test.dev" unpackWARs="true" autoDeploy="true">
            <Context path="/abc" docBase="/www/data/test.dev/ROOT/abc/abc" reloadable=""/> #Context 跟 alias类似效果

      <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常用属性说明:

(1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;
(2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;

log

·common - %h %l %u %t "%r" %s %b
combined - %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"
fileDateFormat="yyyy-MM-dd.HH"
%a - 远端IP地址
· %A - 本地IP地址
· %b - 发送的字节数,不包括HTTP头,如果为0,使用"-"
· %B - 发送的字节数,不包括HTTP头
· %h - 远端主机名(如果resolveHost=false,远端的IP地址)
· %H - 请求协议
· %l - 从identd返回的远端逻辑用户名(总是返回 '-')
· %m - 请求的方法(GET,POST,等)
· %p - 收到请求的本地端口号
· %q - 查询字符串(如果存在,以 '?'开始)
· %r - 请求的第一行,包含了请求的方法和URI
· %s - 响应的状态码
· %S - 用户的session ID
· %t - 日志和时间,使用通常的Log格式
· %u - 认证以后的远端用户(如果存在的话,否则为'-')
· %U - 请求的URI路径
· %v - 本地服务器的名称
· %D - 处理请求的时间,以毫秒为单位
· %T - 处理请求的时间,以秒为单位
Linux Tomcat介绍

[root@node1 data]# cat /var/log/tomcat/test.deve_access_log.2018-06-13.log
192.168.1.104 - - [13/Jun/2018:08:27:02 +0800] "GET /abc/index2.jsp HTTP/1.1" 200 91
192.168.1.104 - - [13/Jun/2018:08:27:02 +0800] "GET /robots.txt HTTP/1.1" 404 971
192.168.1.104 - - [13/Jun/2018:08:27:05 +0800] "GET / HTTP/1.1" 200 91

反代

nginx反代,负载均衡请参考http://blog.51cto.com/marvin89/2122976

server {
        listen       80;
        server_name  www.test.deve;
        index index.php;
        location  / {
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://192.168.1.200:8080/;   
         }  
}

apache,proxy_http_module代理配置示例

    <VirtualHost *:80>
        ServerName      www.test.deve
        ProxyRequests Off           #关闭正向代理
        ProxyVia        On
        ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
        ProxyPass / http://192.168.1.200:8080/
        ProxyPa***everse / http://192.168.1.200:8080/   #它一般和ProxyPass指令配合使用,此指令使Apache调整HTTP重定向应答中Location, Content-Location, URI头里的URL,这样可以避免在Apache作为反向代理使用时。    
        <Location />
            Require all granted
        </Location>
    </VirtualHost>

apache,proxy_ajp_module代理配置示例

    <VirtualHost *:80>
        ServerName      www.test.deve
        ProxyRequests Off
        ProxyVia        On
        ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
            ProxyPass / ajp://192.168.1.200:8009/ 
            ProxyPa***everse / ajp://192.168.1.200:8009/ 
        <Location />
            Require all granted
        </Location>
    </VirtualHost>

apache 负载均衡

需要加载模块,后几项是算法,按需加载

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so

介绍session绑定负载

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED  #session
<Proxy balancer://tcsrvs>
        BalancerMember http://192.168.1.201:8080  route=TomcatA loadfactor=1     #route session
        BalancerMember http://192.168.1.200:8080 route=TomcatB loadfactor=1      #route session
        ProxySet lbmethod=byrequests
        ProxySet stickysession=ROUTEID   #session
</Proxy>
<VirtualHost *:80>
        ServerName www.test.deve
        ProxyRequests Off
        ProxyVia On
        ProxyPreserveHost On
        <Proxy *>
                Require all granted
        </Proxy>
        ProxyPass / balancer://tcsrvs/
        ProxyPa***everse / balancer://tcsrvs/

        <Location />
                Require all granted
        </Location>
        <Location /balancer-manager>
                SetHandler balancer-manager
                ProxyPass !
                Require all granted
        </Location>
</VirtualHost>

Linux Tomcat介绍

memcache session 双写配置

依赖包
[root@node2 ~]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.1.1/memcached-session-manager-2.1.1.jar
[root@node2 ~]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.1.1/memcached-session-manager-tc7-2.1.1.jar
[root@node2 ~]# wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.1/spymemcached-2.12.1.jar
[root@node2 ~]# wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/2.1.1/msm-javolution-serializer-2.1.1.jar
[root@node2 ~]# wget http://www.java2s.com/Code/JarDownload/javolution/javolution-5.4.3.1.jar.zip

依赖包文件位置

[root@node1 tomcat]# rpm -ql tomcat-lib
/usr/share/java/tomcat/ ******

配置文件

<Context path="/test" docBase="test" reloadable="true">
      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:192.168.1.200:11211,n2:192.168.1.202:11211"
        failoverNodes="n1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
      />
</Context>

各节点配置测试脚本

[root@node1 conf]# mkdir -pv /www/data/test.dev/WEB-INF/{classes,lib}
[root@node1 conf]# vim /www/data/test.dev/test/index.jsp
<%@ page language="java" %>
<html>
  <head><title>TomcatA</title></head>
  <body>
    <h1><font color="red">TomcatA.zander.com</font></h1>
    <table align="centre" border="1">
      <tr>
        <td>Session ID</td>
    <% session.setAttribute("zander.com","zander.com"); %>
        <td><%= session.getId() %></td>
      </tr>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

Linux Tomcat介绍
Linux Tomcat介绍
相比程序实现优点,无需检测哪个节点故障,自动选择。

优化---内存

jvm堆内存架构图
Linux Tomcat介绍

内存使用情况
Linux Tomcat介绍

jstat:

[root@node1 conf]# jstat -gc 116986
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
37376.0 37376.0  0.0   24164.8 99840.0  27025.7   349696.0   55422.0   18432.0 17770.9 2048.0 1809.8      7    0.217   0      0.000    0.217

参数说明

S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时

显示内容说明如下(部分结果是通过其他其他参数显示的,暂不说明):
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)

S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数 很严重的回收机制(所有内存用完),会卡住
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制

rpm安装的话,配置参数位置

[root@node1 conf]# vim /etc/sysconfig/tomcat

参数说明

JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= -XX:PermSize= -XX:MaxPermSize="
-server:服务器模型
-Xms:堆内存初始化大小;
-Xmx:堆内存空间上限;
-XX:NewSize=:新生代空间初始化大小;
-XX:MaxNewSize=:新生代空间最大值;
-XX:PermSize=:持久代空间初始化大小; jdk8之后 后面2项无需指定
-XX:MaxPermSize=:持久代空间最大值;

demo(测试demo): 单java 单个serve内存最大32G.实际java还是很吃内存的,尽量多分配

JAVA_OPTS="-Xmx512m -Xms512m"   #一般分配一个最大值和新生代最大值,老年代自动分配好了

Linux Tomcat介绍

优化---线程池

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

常用属性:

maxThreads:最大线程数;
minSpareThreads:最小空闲线程数;
maxSpareThreads:最大空闲线程数;
acceptCount:等待队列的最大长度;
URIEncoding:URI地址编码格式,建议使用UTF-8;
enableLookups:是否启用dns解析,建议禁用;
compression:是否启用传输压缩机制,建议“on";
compressionMinSize:启用压缩传输的数据流最小值,单位是字节;
compressableMimeType:定义启用压缩功能的MIME类型;
text/html, text/xml, text/css, text/javascript

优化---隐藏版本信息

<Connector port="8080"   protocol="HTTP/1.1" Server="SOME STRING"  connectionTimeout="20000" redirectPort="8443" />