Tomcat多实例集群架构 安全优化和性能优化

Tomcat多实例

复制tomcat目录

#将tar解压出来的tomcat复制出两个实例来cp -a /usr/local/apache-tomcat-8.0.46 /usr/local/tomcat1
cp -a /usr/local/apache-tomcat-8.0.46 /usr/local/tomcat2

修改多实例配置文件

#创建多实例的网页根目录
mkdir -p /data/www/www/ROOT
#修改多实例配置文件的以下三行
vim /usr/local/tomcat/conf/server.xml
 22  <Server port="8005" shutdown="SHUTDOWN">    #管理端口及停止命令
    69      <Connector port="8080" protocol="HTTP/1.1"  #对外提供服务的端口
   123        <Host name="localhost"  appBase="webapps" #网站域名及网页根目录路径

第一个实例
<Server port="8011" shutdown="SHUTDOWN">
    <Connector port="8081" protocol="HTTP/1.1"
      <Host name="localhost"  appBase="/data/www/www"
第二个实例
<Server port="8012" shutdown="SHUTDOWN">
    <Connector port="8082" protocol="HTTP/1.1"
      <Host name="localhost"  appBase="/data/www/www"

启动多实例

/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh 

Tomcat集群

使用nginx+Tomcat反向代理集群

Tomcat安全优化和性能优化

安全优化

  • 降权启动
  • telnet管理端口保护
  • ajp连接端口保护
  • 禁用管理端

(1)降权启动(同nginx优化部分的监牢模式)

降权的原则就是利用普通用户来启动Tomcat :

(1)将Tomcat程序目录拷贝到普通用户家目录下

(2)修改家目录下程序的配置文件(启动端口,检测端口等),并重新指定网页根目录路径。

(3)递归授权拷贝后的Tomcat程序的属主属组为普通用户。

(4)用su命令切换为普通用户,启动Tomcat进程

(5)此时Tomcat进程的权限为普通用户权限

(6)如果利用/etc/rc.local文件配置普通用户程序的开机启动,那么需要利用su -c临时切换身份启动。具体可参考linux基础教案里的用户管理部分

passwd wk                #创建普通用户wk
cp -a /usr/local/apache-tomcat-8.0.46/ /home/wk/tomcat    #复制tar解压的tomcat到wk的家目录
vim conf/server.xml                 #修改配置文件  改启动端口 监听端口 网页家目录位置
<Server port="8111" shutdown="SHUTDOWN">
<Connector port="8888" protocol="HTTP/1.1"
<Host name="localhost"  appBase="/home/wk/tomcat/webapps"
chown -R wk:wk tomcat            #修改权限
su wk            #进入普通影虎
./tomcat/bin/startup.sh    #启动tomcat

(2)telnet管理端口保护

cat /usr/local/tomcat/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN">    #表示通过8005端口来接受SHUTDOWN,用来停止Tomcat进程。默认的方式是非常危险的。需要进行修改
Tomcat默认通过8005端口来接收SHUTDOWN这个字符串来关闭Tomcat进程,但这是非常危险的,因此需要修改端口号来防护。否则,通过telnet命令即可强行关闭Tomcat进程
#利用Telnet来关闭Tomcat进程
telnet 127.0.0.1 8005   #通过telnet连接本地8005端口
[[email protected] ~]$ telnet 127.0.0.1 8005
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is ‘^]‘.
SHUTDOWN          #输入大写shutdown关闭tomcat
Connection closed by foreign host.

(3)ajp连接端口保护

vim tomcat/conf/server.xml
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />    #这是AJP协议打开的端口,我们并不需要开启这个端口,因此注释掉本行
 <!--Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /-->

(4)禁用管理端

Tomcat默认在安装完成后的网页目录里有很多多余的目录,删除所有不需要用到的目录,并清空ROOT网页默认根目录下的所有东西,规避可能的代码漏洞

cd tomcat/webapps/        
mkdir /tmp/webapps.b      
mv * /tmp/webapps.b    
mkdir ROOT    

性能优化

1 屏蔽DNS查询 enableLookups="false"

DNS查询非常消耗时间,如果开启会影响Tomcat性能,因此关闭。

#默认没有,需添加配置文件如下代码段,在Connector标签位置。表示禁止DNS查询
    <Connector  port="8888" protocol="HTTP/1.1"
               connectionTimeout="6000" enableLookups="false" acceptCount="800"
               redirectPort="8443" />

2 jvm调优

Tomcat最吃内存,只要内存足够,这只猫就跑的很快。 
如果系统资源有限,那就需要进行调优,提高资源使用率。

#优化catalina.sh初始化脚本。在catalina.sh初始化脚本中添加以下代码:
#catalina.sh的路径为:/usr/local/tomcat/bin/catalina.sh
#此行优化代码需要加在脚本的最开始,声明位置。不要放在后边
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
#代码说明:
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间

JVM的调优比较复杂,如果想要更详细的理解JVM如何调优,那么请参考网友文章:http://www.cnblogs.com/xingzc/p/5756119.html

企业案例:Linux下java/http进程高解决案例

生产环境下某台tomcat7服务器,在刚发布的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。诸如此类问题,请排查!

问题分析:

(1)程序属于CPU密集型,和开发沟通过,排除此类情况 
(2)程序代码有问题,出现死循环,可能性极大

问题解决:

(1)开发那边无法排查代码某个模块有问题,从日志上也无法分析得出 
(2)我们可以尝试通过jstack命令来精确定位出现错误的代码段,从而拿给开发排查

首先查找进程高的PID号(先找到是哪个PID号的进程导致的)

top -H

查看这个进程所有系统调用(再找到是哪个PID号的线程导致的)

strace -p 进程的PID

如果是Web应用,可以继续打印该线程的堆栈信息(找出有问题的代码块)

printf "%x\n" 线程的PID --->#将有问题的线程的PID号转换成16进制格式
jstack 进程的PID | grep 线程PID号的十六进制格式 -A 30 #过滤出有问题的线程的堆栈信息,找出问题代码块

实际操作演示:

 pgrep -l java
2031 java       #java进程及对应PID号
2295 java
2321 java
 strace -p 2031       #查看PID号为2031的java进程的所有线程调用情况
Process 2031 attached - interrupt to quit
futex(0x7f4cdd0e79d0, FUTEX_WAIT, 2032, NULL    #只有一个线程,线程的PID号为2032
^C <unfinished ...>
Process 2031 detached
printf "%x\n" 2032   #将线程的PID号2032转换成十六进制格式
7f0
jstack 2031 | grep 7f0 -A 30 #追踪进称号为2031的进程的所有线程调用,从里面过滤出16进制为7f0的线程的代码调用情况
"main" #1 prio=5 os_prio=0 tid=0x00007f4cd4008800 nid=0x7f0 runnable [0x00007f4cdd0e5000]
   java.lang.Thread.State: RUNNABLE
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)    #圆括号里显示的是(代码类名:具体调用的代码行号)
    at java.net.ServerSocket.implAccept(ServerSocket.java:545)
    at java.net.ServerSocket.accept(ServerSocket.java:513)
    at org.apache.catalina.core.StandardServer.await(StandardServer.java:446)
    at org.apache.catalina.startup.Catalina.await(Catalina.java:713)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:659)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)
"VM Thread" os_prio=0 tid=0x00007f4cd406d000 nid=0x7f1 runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007f4cd40b8800 nid=0x7f8 waiting on condition
JNI global references: 244

原文地址:https://www.cnblogs.com/ywrj/p/9537754.html

时间: 2024-10-10 02:23:52

Tomcat多实例集群架构 安全优化和性能优化的相关文章

Linux服务器企业集群架构部署搭建(一)----环境配置要求与系统基础优化

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想. 本文作者:燁未央_Estelle版权声明:测试学习,不足之处,欢迎指正.允许转载,转载时请务必以超链接形式标明文章原始出处.作者信息和本声明 第一章 集群架构搭建部署目标1.1 本次架构部署配置概况提示,本次集群架构所使用的服务器均为VM虚拟机进行模拟搭建测试及学习. ①两台linux服务器作为负载均衡服务器(LVS-01/LVS-02),基本模式:LVS-DR+keepalived.负责分发所

Linux服务器企业集群架构部署搭建(二)----linux系统基础脚本优化、内核优化

第四章 linux系统内核优化相关 参考文章: linux内核TCP相关参数解释 http://os.chinaunix.net/a2008/0918/985/000000985483.shtml linux内核参数优化 http://blog.chinaunix.net/uid-29081804-id-3830203.html linux内核调整和内核参数详解 http://blog.csdn.net/cnbird2008/article/details/4419354 linux运维老男孩培

19.Tomcat集群架构

1.Nginx+Tomcat集群架构介绍 2.Nginx+Tomcat集群架构实战 [[email protected] conf.d]# cat proxy_zrlog.cheng.com.conf upstream zrlog { server 172.16.1.7:8080; server 172.16.1.8:8080; } server { listen 80; server_name zrlog.cheng.com; location / { proxy_pass http://zr

Memcached集群架构方面的问题(转)

add by zhj: 这是一个系列中的第二篇,该系列有四篇,英文原文没找到,译文见:http://blog.csdn.net/jarfield/article/details/4336035 ,附上另外三篇链接http://blog.csdn.net/jarfield/article/details/4322953,http://blog.csdn.net/jarfield/article/details/4341819, http://blog.csdn.net/jarfield/artic

LVS+Keepalived+Squid+Nginx+MySQL主从高性能集群架构部署方案

方案一,在tomcat的workers.properties里面配置相关条件 worker.tomcat.lbfactor=50 worker.tomcat.cachesize=10 worker.tomcat.cache_timeout=600 worker.tomcat.socket_keepalive=1 worker.tomcat.socket_timeout=300 Linux内核优化: vi /etc/sysctl.conf   # 编辑sysctl.conf文件添加以下内容net.

LVS+Keepalived+Nginx+Tomcat高可用集群搭建(转)

LVS+Keepalived+Nginx+Tomcat高可用集群搭建 最近公司重整架构,十几台服务器而且还要尽可能节约成本.我就谷歌了一下在几种集群之前进行比较最终采用了Keepalived+Nginx做负债均衡高可用.虽然之前也研究过集群,看过很多集群方面的原理和架构,但毕竟没有真正操作过以下案例是在虚拟机中完成实验其实对于高可用搭建来说只用给出Keepalived和Nginx的配置即可后面的一些安装搭建完全是本人项目需要可以不用理睬仅供参考. 本文只是实验搭建记录方便以后在服务器中实施搭建.

Galera Cluster——一种新型的高一致性MySQL集群架构

原文链接:https://www.sohu.com/a/147032902_505779,最近被分配定位mysql的问题,学习下. 1. 何谓Galera Cluster 何谓Galera Cluster?就是集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,都是基于Galera的,所以这里都统称为Galera Cluster了,

MongoDB分片存储的集群架构实现

MongoDB分片存储的集群架构实现 如果需要存储大量数据,或者系统的读写吞吐量很大的时候,单个server就很难满足需求了.这个时候我们可以使用MongoDB的分片机制来解决这些问题. 分片的基本概念 分片(sharding)是一种水平扩展(horizontal scaling)的方式,把一个大的数据集分散到多个片服务器上,所有的片服务器将组成一个逻辑上的数据库来存储这个大的数据集.分片对用户(应用层)是透明的,用户不会知道数据很被存放到哪个片服务器上. 这种方式有两个好处: 分片之后,每个片

二、ELKStack集群架构设计

一.ELKStack介绍与入门实践 二.Elasticsearch 集群架构图 服务器配置:Centos6.6 x86_64 CPU:1核心 MEM:2G (做实验,配置比较低一些) 注:这里配置elasticsearch集群用了3台服务器,可以根据自己的实际情况进行调整. 三.开始安装配置nginx和logstash 注:这里使用yum安装,如果需要较高版本的,可以使用编译安装. 在10.0.18.144上操作,10.0.18.145配置方式和144是一样的. 1.安装nginx 配置yum源