标签:java语言 sticky cep 避免 yum 绑定 配置文件 rpm -ivh grep
jdk jre jvm 介绍据说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。
[root@node1 ~]# yum -y install java-1.8.0-openjdk-devel.x86_64
[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
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
[root@node1 ~]# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
[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))
[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))
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 能关闭服务 所以只监听在本地 -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
[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
配置虚拟机都是在内存中,重启就没了
[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"/>
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 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 "%r" %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 - 处理请求的时间,以秒为单位[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/;
}
}
<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>
<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>
需要加载模块,后几项是算法,按需加载
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>
依赖包
[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>
相比程序实现优点,无需检测哪个节点故障,自动选择。
jvm堆内存架构图
内存使用情况
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" #一般分配一个最大值和新生代最大值,老年代自动分配好了
<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" />
标签:java语言 sticky cep 避免 yum 绑定 配置文件 rpm -ivh grep
原文地址:http://blog.51cto.com/marvin89/2129175