(精)Linux优化的Tomcat部署

以下配置是基于Centos6.6系统。

1.1.1      优化系统

1.1.1.1              定时校正服务器的时间

手动调整时间:date -s "2015-05-02 10:00:00"

自动同步:

#修改时区

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#修改为中国的东八区

vi /etc/sysconfig/clock

#修改以下内容

ZONE="Asia/Shanghai"

UTC=false  #设置为false,硬件时钟不于utc时间一

ARC=false

#创建自动同步任务

crontab -e

10 5 * * * /usr/sbin/ntpdate ntp.fudan.edu.cn;/usr/sbin/hwclock -w

#可以使用下述命令查看自动任务执行情况

less /var/spool/mail/root

出现类似12 May 09:47:02 ntpdate[46810]: adjust time server 61.129.42.44 offset -0.469862 sec的信息表示成功。

我们在安装完Centos Linux操作系统之后,点击系统的时间发现与现在所使用的时间不一致,相差有8小时,而在安装系统的时候我们选择的时区是上海,但是CentOS Linux默认的bios时间是utc时间(UTC是协调世界时(Universal Time Coordinated)英文缩写,是由国际无线电咨询委员会规定和推荐,并由国际时间局(BIH)负责保持的以秒为基础的时间标度。UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示.北京时间比UTC时间早8小时,以1999年1月1日0000UTC为例,UTC时间是零点,北京时间为1999年1月1日早上8点整。),所以我们在时间上面相隔了8个小时。这个时候bios的时间和系统的时间当然是不一致,一个代表 utc 时间,一个代表cst(+8时区),即上海的时间。

其他网络时间服务器地址如下:

time.nist.gov(美国)

ntp.fudan.edu.cn(复旦)(国内用户推荐使用此服务器)

timekeeper.isi.edu

subitaneous.cpsc.ucalgary.ca

usno.pa-x.dec.com

time.twc.weather.com

swisstime.ethz.ch

ntp0.fau.de

ntp3.fau.de

time-a.nist.gov

time-b.nist.gov

time-nw.nist.gov

nist1-sj.glassey.com

1.1.1.2              配置DNS

配置DNS,连接外网,可以vi /etc/resolv.conf ,编辑nameserver 。

但在centos系统,重启网络后该文件被Network Manager服务重置,所以直接修改网络配置:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0 #指出设备名称

HWADDR=00:15:5d:01:d1:03  #MAC地址

TYPE=Ethernet #网络类型

UUID=12197cc8-b58b-4eb7-83a7-f34ea94ac6a2

ONBOOT=yes #开机自启动

NM_CONTROLLED=yes #是否允许Network Manager管理

BOOTPROTO= static #静态IP

IPADDR=10.10.120.185 #IP地址

NETMASK=255.255.255.0 #子网掩码

GATEWAY=10.10.120.254  #网关

IPV6INIT=no

USERCTL=no

DNS1=10.10.120.50   #DNS

DNS2=10.10.120.51   #DNS

保存后重启网络:service network restart

注意一定要设置为开机启动,否则重启机器后是没有网络连接的。

1.1.1.3              优化网络

cp /etc/sysctl.conf /etc/sysctl.conf.bak

vi /etc/sysctl.conf

#2015-5-2 add

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.ip_local_port_range = 10000 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.tcp_max_syn_backlog = 65536

net.core.somaxconn = 32768

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_wmem = 8192 436600 873200

net.ipv4.tcp_rmem = 32768 436600 873200

net.ipv4.tcp_mem = 94500000 91500000 92700000

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_fin_timeout = 30

#输入下面的命令,让内核参数生效:

sysctl -p

如果遇到错误:

error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key

error: "net.bridge.bridge-nf-call-iptables" is an unknown key

error: "net.bridge.bridge-nf-call-arptables" is an unknown key

则执行:

modprobe bridge

lsmod|grep bridge

sysctl -p

简单的说明上面的参数的含义:

net.ipv4.tcp_syncookies = 1

#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;

net.ipv4.tcp_fin_timeout

#修改系統默认的 TIMEOUT 时间。

在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。

此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.ip_local_port_range = 10000 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

#这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

net.ipv4.tcp_keepalive_time = 1200

#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range = 10000 65000

#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)

net.ipv4.tcp_max_syn_backlog = 8192

#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 6000

#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为6000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT的最大数量,避免Squid服务器被大量的TIME_WAIT拖死。

内核其他TCP参数说明:

net.ipv4.tcp_max_syn_backlog = 65536

#记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.core.netdev_max_backlog = 32768

#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

net.core.somaxconn = 32768

#web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216      #最大socket读buffer,可参考的优化值:873200

net.core.wmem_max = 16777216    #最大socket写buffer,可参考的优化值:873200

net.ipv4.tcp_timestamps = 0

#时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries = 2

#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 2

#在内核放弃建立连接之前发送SYN包的数量。

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

# 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

net.ipv4.tcp_wmem = 8192 436600 873200

# TCP写buffer,可参考的优化值: 8192 436600 873200

net.ipv4.tcp_rmem = 32768 436600 873200

# TCP读buffer,可参考的优化值: 32768 436600 873200

net.ipv4.tcp_mem = 94500000 91500000 92700000

# 同样有3个值,意思是:

net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。

net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。

net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。

上述内存单位是页,而不是字节。可参考的优化值是:786432 1048576 1572864

net.ipv4.tcp_max_orphans = 3276800

#系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。

如果超过这个数字,连接将即刻被复位并打印出警告信息。

这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,

更应该增加这个值(如果增加了内存之后)。

net.ipv4.tcp_fin_timeout = 30

#如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

经过这样的优化配置之后,你的服务器的TCP并发处理能力会显著提高。以上配置仅供参考,用于生产环境请根据自己的实际情况。

1.1.1.4              调整Linux的最大文件打开数

第一处修改 /etc/security/limits.conf 在文件尾部增加

#2015-5-2 add

* soft nofile 65535

* hard nofile 65535

第二处修改 /etc/profile 在文件尾部增加

#2015-5-2 add

ulimit -S 65535

ulimit -H 65535

ulimit -n 65535

ulimit -f unlimited

保存修改后,执行下述命令使profile配置生效

source /etc/profile

执行ulimit -a查看系统限制。

1.1.1.5              关闭无用服务

系统服务管理工具:

chkconfig(所有linux发行版都有),用法很简单,如下:

usage:   chkconfig --list [name]

chkconfig --add <name>

chkconfig --del <name>

chkconfig [--level <levels>] <name> <on|off|reset|resetpriorities>

ntsysv(Redhat系发行版特有),直接运行选择服务是否自启动。

服务器系统服务:

#chkconfig --list

NetworkManager  0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

abrt-ccpp       0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭

abrtd           0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭

acpid           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

atd             0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

auditd          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

autofs          0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

blk-availability        0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭

bluetooth       0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

certmonger      0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

cpuspeed        0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭

crond           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

cups            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

dnsmasq         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

firstboot       0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

haldaemon       0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

htcacheclean    0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

httpd           0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

ip6tables       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

iptables        0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

irqbalance      0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

kdump           0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

lvm2-monitor    0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭

mdmonitor       0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

messagebus      0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

netconsole      0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

netfs           0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

network         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

nfs             0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

nfslock         0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

ntpd            0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

ntpdate         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

oddjobd         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

portreserve     0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

postfix         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

psacct          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

quota_nld       0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

rdisc           0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

restorecond     0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

rngd            0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

rpcbind         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

rpcgssd         0:关闭  1:关闭  2:关闭  3:启用  4:启用  5:启用  6:关闭

rpcsvcgssd      0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

rsyslog         0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

saslauthd       0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

smartd          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

snmpd           0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

snmptrapd       0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

spice-vdagentd  0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:启用  6:关闭

sshd            0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

sssd            0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

sysstat         0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭

udev-post       0:关闭  1:启用  2:启用  3:启用  4:启用  5:启用  6:关闭

wdaemon         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

winbind         0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

wpa_supplicant  0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

ypbind          0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭

关闭无用服务:

#关闭蓝牙服务

service bluetooth stop

chkconfig bluetooth off

#开启ipv4防火墙

chkconfig iptables on

#开启ipv4防火墙,并按照下述章节内容开启端口

service iptables start

#ipv6防火墙默认开启

1.1.1.6              配置hostname

发现服务器问题:

执行hostname -i

返回hostname: 未知的主机

并且在tomcat中启动unieap工程时报错:2015/05/04-11:33:22 >> ERROR >> http-bio-8080-exec-6 >> net.sf.ehcache.Cache.<clinit>(Cache.java:97) >> Unable to set localhost. This prevents creation of a GUID. Cause was: mepsvr03: mepsvr03: 未知的名称或服务

解决方法:更改hosts文件

以mepsvr03为例:

vi /etc/hosts

#把hostname加到127.0.0.1之后

127.0.0.1   mepsvr03 localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

1.1.1.7              覆盖复制配置

使用cp命令复制时,需要覆盖操作时,加参数 -f,但在centos 6系统中仍然会有提示,原来是服务器会默认增加别名 alias cp=‘cp -i‘,当你执行cp时,其实执行的是cp –i。在终端执行alias就可以看出来了。

以下是代码片段:

[[email protected] ~]# alias

alias cp=‘cp -i‘

可以这样解决

以下是代码片段:

[[email protected] ~]# vi ~/.bashrc

在alias cp=‘cp -i‘前加上"#"注释掉这行,:wq!保存推出,然后重新登陆就可以了。

1.1.2      安装tomcat

在mepsvr01、mepsvr03、mepsvr04、mepsvr06、mepsvr08配置tomcat

tar zxvf apache-tomcat-7.0.59.tar.gz -C /opt/

cd /opt/apache-tomcat-7.0.59/conf/

vi context.xml

# <Context>” 改为 “<Context allowLinking="true">”,为了使用软链接

vi web.xml

#增加amrges

<mime-mapping>

<extension>amr</extension>

<mime-type>audio/amr</mime-type>

</mime-mapping>

vi ../bin/catalina.sh

#文件开头加入

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxPermSize=256m"

vi tomcat-users.xml

#设置tomcat用户

<role rolename="manager-gui"/>

<user username="[email protected]" password="[email protected]#" roles="manager-gui"/>

1.1.2.1              APR模式

按照官网描述,开启APR模式需要:

l  APR 1.2+ development headers (libapr1-dev package)

l  OpenSSL 0.9.7+ development headers (libssl-dev package)

l  JNI headers from Java compatible JDK 1.4+

l  GNU development environment (gcc, make)

l  解压bin/tomcat-native.tar.gz

安装过程:

#安装apr-devel

rpm -ivh /usr/local/src/apr-devel-1.3.9-5.el6_2.x86_64.rpm

#安装JNI

cd /opt/apache-tomcat-7.0.59/bin/

tar zxvf tomcat-native.tar.gz

cd tomcat-native-1.1.32-src/jni/native

./configure --with-apr=/usr/bin/

make

make install

#添加环境变量

vi /etc/profile #在文件末尾处添加下面的变量

# apr

export LD_LIBRARY_PATH=/usr/local/apr/lib

然后执行下面命令,使环境变量即时生效

source /etc/profile

#之后启动tomcat

Centos系统默认安装了apr、openssl,只需按照上述命令安装JNI即可。

附,网上的安装方法:

在Linux下安装

1. 下载所需的包

到http://apr.apache.org/下载下面3个包

apr-1.4.5.tar.gz

apr-iconv-1.2.1.tar.gz

apr-util-1.3.12.tar.gz

到 http://archive.apache.org/dist/tomcat/tomcat-connectors/native/1.1.20/source/ 下载

tomcat-native-1.1.20-src.tar.gz

2.  安装

a.  安装 apr

tar zxvf apr-1.4.5.tar

cd apr-1.4.5

./configure --prefix=/usr/local/apr

make

make install

b. 安装 apr-iconv

tar -zxvf apr-iconv-1.2.1.tar.gz

cd apr-iconv-1.2.1

./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr

make

make install

c. 安装 apr-util

tar zxvf apr-util-1.3.12.tar.gz

cd apr-util-1.3.12

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv

make

make install

d. 安装 tomcat-native

tar zxvf tomcat-native-1.1.20-src.tar.gz

cd tomcat-native-1.1.20-src/jni/native

./configure --with-apr=/usr/local/apr --with-java-home=/usr/java/jdk1.6.0_23

make

make install

3. 添加环境变量

vi /etc/profile #在文件末尾处添加下面的变量

# apr

export LD_LIBRARY_PATH=/usr/local/apr/lib

然后执行下面命令,使环境变量即时生效

source /etc/profile

4. 验证

启动Tomcat  :

TOMCAT_HOME/bin/start.sh

more TOMCAT_HOME/logs/catalina.out

看到类似这样的信息

Jul 20, 2011 15:27:32 PM org.apache.catalina.core.AprLifecycleListener init

INFO: Loaded APR based Apache Tomcat Native library 1.1.20.

就证明 apr 启动成功了。

1.1.2.2              线程池

配置tomcat的/conf/server.xml文件

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

maxThreads="1000" minSpareThreads="100" maxSpareThreads="300"/>

<Connector executor="tomcatThreadPool"

port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

maxHttpHeaderSize="8192"

acceptCount="500"

redirectPort="8443" />

参数说明:

maxThreads:Tomcat可创建的最大的线程数,每一个线程处理一个请求;

minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数;

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程;

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,就是被排队的请求数,超过这个数的请求将拒绝连接。

connnectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。默认为20000毫秒。

参考:http://blog.csdn.net/wubai250/article/details/8593525

http://blog.csdn.net/jiangguilong2000/article/details/12523771

http://blog.csdn.net/hulefei29/article/details/3849150

http://piaoling.iteye.com/blog/1260925

1.1.2.3              日志

tomcat默认使用java.util.logging记录日志,catalina.out会每天复制一个日志文件,而其本身持续增长。想要catalina.out文件中只记录当天的日志,按照官网http://tomcat.apache.org/tomcat-7.0-doc/logging.html 进行配置log4j。

1、  创建文件log4j.properties,放到$CATALINA_BASE/lib目录中

log4j.rootLogger = INFO, CATALINA

# Define all the appenders

log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender

log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina

log4j.appender.CATALINA.Append = true

log4j.appender.CATALINA.Encoding = UTF-8

# Roll-over the log once per day

log4j.appender.CATALINA.DatePattern = ‘.‘yyyy-MM-dd‘.log‘

log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout

log4j.appender.CATALINA.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.LOCALHOST = org.apache.log4j.DailyRollingFileAppender

log4j.appender.LOCALHOST.File = ${catalina.base}/logs/localhost

log4j.appender.LOCALHOST.Append = true

log4j.appender.LOCALHOST.Encoding = UTF-8

log4j.appender.LOCALHOST.DatePattern = ‘.‘yyyy-MM-dd‘.log‘

log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout

log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.MANAGER = org.apache.log4j.DailyRollingFileAppender

log4j.appender.MANAGER.File = ${catalina.base}/logs/manager

log4j.appender.MANAGER.Append = true

log4j.appender.MANAGER.Encoding = UTF-8

log4j.appender.MANAGER.DatePattern = ‘.‘yyyy-MM-dd‘.log‘

log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout

log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.HOST-MANAGER = org.apache.log4j.DailyRollingFileAppender

log4j.appender.HOST-MANAGER.File = ${catalina.base}/logs/host-manager

log4j.appender.HOST-MANAGER.Append = true

log4j.appender.HOST-MANAGER.Encoding = UTF-8

log4j.appender.HOST-MANAGER.DatePattern = ‘.‘yyyy-MM-dd‘.log‘

log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout

log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.Encoding = UTF-8

log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout

log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# Configure which loggers log to which appenders

log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost] = INFO, LOCALHOST

log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] =\

INFO, MANAGER

log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager] =\

INFO, HOST-MANAGER

2、  在http://archive.apache.org/dist/logging/log4j/1.2.17/  下载log4j-1.2.17.jar

3、  在http://tomcat.apache.org/download-70.cgi 的Extras下载tomcat-juli.jar和tomcat-juli-adapters.jar。

4、  把log4j和tomcat-juli-adapters.jar放到$CATALINA_HOME/lib

5、  用新下载的tomcat-juli.jar替换$CATALINA_HOME/bin/tomcat-juli.jar

6、  删除$CATALINA_BASE/conf/logging.properties

7、  修改 $CATALINA_HOME/conf/context.xml,添加 swallowOutput="true" 如下:

<Context swallowOutput="true">

<WatchedResource>WEB-INF/web.xml</WatchedResource>

</Context>

8、  启动tomcat

1.1.2.4              防火墙

服务器开启防火墙后执行下述命令

/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

/etc/rc.d/init.d/iptables save

/etc/init.d/iptables status

1.1.2.5              tomcat开机启动

vi /etc/init.d/tomcat

#!/bin/sh

# chkconfig: 345 99 10

# description: Auto-starts tomcat

# /etc/init.d/tomcatd

# Tomcat auto-start

# Source function library.

#. /etc/init.d/functions

# source networking configuration.

#. /etc/sysconfig/network

RETVAL=0

#java

export JAVA_HOME=/usr/local/java/jdk1.7.0_79

#tomcat

export CATALINA_HOME=/opt/apache-tomcat-7.0.59

export CATALINA_BASE=/opt/apache-tomcat-7.0.59

export CATALINA_TMPDIR=/opt/apache-tomcat-7.0.59/temp

export CLASSPATH=.:/opt/apache-tomcat-7.0.59/bin/bootstrap.jar:/opt/apache-tomcat-7.0.59/bin/tomcat-juli.jar

#apr

export LD_LIBRARY_PATH=/usr/local/apr/lib

#字符集,根据系统字符串设定。不设置该项,service启动后,tomcat日志、文件乱码

export LANG=zh_CN.UTF-8

start()

{

if [ -f $CATALINA_HOME/bin/startup.sh ];

then

echo $"Starting Tomcat"

$CATALINA_HOME/bin/startup.sh

RETVAL=$?

echo " OK"

return $RETVAL

fi

}

stop()

{

if [ -f $CATALINA_HOME/bin/shutdown.sh ];

then

echo $"Stopping Tomcat"

$CATALINA_HOME/bin/shutdown.sh

RETVAL=$?

sleep 1

#ps -fwwu tomcat | grep apache-tomcat|grep -v grep | grep -v PID | awk ‘{print $2}‘|xargs kill -9

#由于没有创建tomcat用户,故使用tomcat目录判断

#注意$CATALINA_HOME后面追加/,否则当有多个tomcat启动时,会匹配出apache-tomcat-7.0.59和apache-tomcat-7.0.59-test

ps -ef | grep $CATALINA_HOME/|grep -v grep | grep -v PID | awk ‘{print $2}‘|xargs kill -9 2> /dev/null

echo " OK"

# [ $RETVAL -eq 0 ] && rm -f /var/lock/...

return $RETVAL

fi

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

echo $"Restaring Tomcat"

$0 stop

sleep 1

$0 start

;;

*)

echo $"Usage: $0 {start|stop|restart}"

exit 1

;;

esac

exit $RETVAL

#保存脚本后,赋予执行权限

chmod +x /etc/init.d/tomcat

#将这个shell文件的link连到/etc/rc2.d/目录下。linux的/etc/rcX.d/目录中的数字代表开机启动时不同的run level,也就是启动的顺序,Ubuntu9.10下有0-5六个level,不能随便连到其他目录下,可能在那个目录中的程序启动时Tomcat所需要的一些库尚未被加载,用ln命令将tomcat的链接链过去

ln -s /etc/init.d/tomcat /etc/rc2.d/S16Tomcat

#设置成系统启动时自动执行

chkconfig --add tomcat

1.1.2.6              遇到问题

启动tomcat时产生了多个进程。

解决方法:

vi /etc/profile

#加入下述内容

#系统内核,解决tomcat启动多个进程问题

export LD_ASSUME_KERNEL=2.6.32

#使配置生效

source /etc/profile

以下是摘自 http://blog.csdn.net/yohoph/article/details/41947623 的说明:

我们在日常使用tomcat的时候有时候启动tomcat莫名其妙的就会产生多个java进程,而且这些进程还是有效的。这样会导致端口冲突进而使tomcat假死或者挂掉。有时候强行杀掉进程还会出现defunct现象,导致java进程在好久的时间内无法杀掉。

这个问题进过调查,暂时发现可能与jdk调用的linux内核的LD_ASSUME_KERNEL参数有关。在经过不断在网上查了些资料显示:

首先介绍下LD_ASSUME_KERNEL参数主要跟linux的线程实现方式有关。

那么它到底是怎么一回事了呢?在系统中起到一个什么作用了呢?且往下看:

其实就是一个linux对于线程thread的支持, 就目前的发展而言,有如下三种。

In current Linux implementations, a thread is supported with the Portable Operating System Interface for UNIX (POSIX) compliant library (pthread). Several thread implementations are available in the Linux operating system. The

following are the widely used.

1、 LinuxThreads

LinuxThreads have been the default thread implementation since Linux kernel 2.0. The LinuxThread has some noncompliant implementations with the POSIX standard. Native POSIX Thread Library (NPTL) is taking the place of LinuxThreads. The LinuxThreads will not

be supported in future release of Enterprise Linux distributions.

2、 Native POSIX Thread Library (NPTL)

The NPTL was originally developed by Red Hat. NPTL is more compliant with POSIX

standards. By taking advantage of enhancements in kernel 2.6 such as the new clone() system call, signal handling implementation, and so on, it has better performance and scalability than LinuxThreads.NPTL has some incompatibility with LinuxThreads. An application

which has a dependence on LinuxThread might not work with the NPTL implementation.

3、 Next Generation POSIX Thread (NGPT)

NGPT is an IBM developed version of POSIX thread library. It is currently under

maintenance operation and no further development is planned.

简单的讲我们下载JDK的时候下载的都是释放包,无论SUN在发布JDK时考虑得如何完美,当时jdk本地库都可能和当前系统的版本号不一致。举个例子,假如System.gc()调用了本地库glic6.0.2.so那么在当前系统上没有这个版本的库或没有这个版本的库的链结,那么gc()方法肯定不能正确工作。当然sun在发布的时候可能会把这个本地库打包在JDK发行包中,但glic6.0.2.so中又调用了其它库,如subglic6.0.21.so,即使系统中存在完全相同的glic6.0.2.so,它调用的库又不一定完全匹配,才使得需要调用本地库的JVM底层功可能会产生异常,导致清除/退出进程等工作就可能无法完成,产生了java

defunct,甚至有些时候还会出现tomcat产生多进程的情况

修改方案:强行设置LD_ASSUME_KERNEL参数与当前系统的参数保持一致

首先查看当前linux版本

uname -r

编辑配置文件

vi /etc/profile

添加参数

export LD_ASSUME_KERNEL=2.6.32

时间: 2024-10-21 23:06:57

(精)Linux优化的Tomcat部署的相关文章

在linux下用tomcat部署java web项目的过程与注意事项

在linux下用tomcat部署java web项目的过程与注意事项(原创) 一.安装JDK到http://www.oracle.com/technetwork/java/javase/downloads/index.html下载Java SE 6 Update 27根据操作系统选择Linux x64 - RPM Installer或Linux x86 - RPM Installer下载jdk-6u27-linux-x64-rpm.bin后放在/home目录中,当然其它地方也行.注意:LINUX

在linux下用tomcat部署java web项目

在linux下用tomcat部署java web项目的过程与注意事项(原创) 一.安装JDK 到http://www.oracle.com/technetwork/java/javase/downloads/index.html下载Java SE 6 Update 27 根据操作系统选择Linux x64 - RPM Installer或Linux x86 - RPM Installer 下载jdk-6u27-linux-x64-rpm.bin后放在/home目录中,当然其它地方也行. 注意:L

如何在Linux下使用Tomcat部署Web应用(图文)

学习Java必不可少的视同Tomcat,但是如果不会使用tomcat部署项目,那也是白扯,在这里教大家如果在Linux系统下视同Tomcat部署Web应用. 工具/原料 Apache-tomcat xshell远程软件 Xftp远程上传软件 方法/步骤 1 首先,登录tomcat官方网站.下载tomcat软件,一定要下载解压缩版本的. 2 使用Xftp将Tomcat压缩包上传到服务器中. 3 解压tomcat服务器压缩包 4 等待解压缩成功. 5 tomcat服务器运行时是需要JDK支持的,所以

Linux+java+opencv2.4.13+tomcat部署

花了n多小时终于将opencv编译完,生成的so动态库和jar文件,并将项目用tomcat 部署上了.对于我这个菜鸟来说真心不容易. 之前在windows里用opencv2.4.13.exe 安装完自动生产opencv_java2413.dll 和opencv_java.jar.但是项目要部署到Linux上这个就不行了.结果网上也找不到对应的opencv_java.so可以下下载.结果只能自己编译,现下载虚拟机里安装的ubuntu系统.并在里面把所需要的开发环境搭建好. 参考资料:http://

Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包

Linux tomcat部署War包,Linux在Tomcat部署JavaWeb项目,Linux部署War包 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ©Copyright 蕃薯耀 2017年3月6日 http://www.cnblogs.com/fanshuyao/ 一.Linux快速部署W

linux下实现自动部署tomcat的脚本

linux下实现自动部署tomcat的脚本 由于经常部署war到tomccat上,经常有一些重复的工作要做:停服务.备份war包.上传新的war包.启动服务.索性就写了一个自动部署的脚本. 脚本如下autoDeploy.sh: 1 #! /bin/sh 2 echo '####################开始自动部署####################' 3 path=`pwd` #当前路径 4 tomcatPath=tomcat-7 #指定tomcat文件目录名称 5 cd ../$t

Linux下安装Tomcat服务器和部署Web应用

一.上传Tomcat服务器 二.安装Tomcat服务器 2.1.解压tomcat服务器压缩包 2.2.配置环境变量 tomcat服务器运行时是需要JDK支持的,所以必须配置好JDK用到的那些环境变量 编辑/etc下的profile文件,加上如下内容: 2.3.修改tomcat服务器的启动端口 修改将Tomcat服务器启动时使用的端口,例如改成9999 修改完server.xml文件之后,保存,退出. 三.Tomcat服务器启动和关闭 3.1.启动Tomcat服务器 进入tomcat服务器的bin

Linux:多Tomcat服务, 统一安装部署 unifyDeploy0.2版本发布

下载地址:  unifyDeploy0.1版本  unifyDeploy0.2版本 1       引言 基于JAVA开发项目,随着服务的越来越多,配置文件更是眼花缭乱,每次不知道因为配置问题浪费多少时间,更不知道因为配置问题出过多少问题.多台服务器来回切换,如果服务需要依赖,启动更是问题. 1.1 目的 一次修改,统一安装:操作简单,实用高效. 1.2 范围 本项目使用范围包括: 基于JAVA开发项目 项目相关服务繁多 服务启动有依赖关系 1.3 读者 本需求规格说明书的阅读者或其他文档干系人

linux下安装tomcat和部署web应用

孤傲苍狼 只为成功找方法,不为失败找借口! Linux下安装Tomcat服务器和部署Web应用 一.上传Tomcat服务器 二.安装Tomcat服务器 2.1.解压tomcat服务器压缩包 2.2.配置环境变量 tomcat服务器运行时是需要JDK支持的,所以必须配置好JDK用到的那些环境变量 编辑/etc下的profile文件,加上如下内容: 2.3.修改tomcat服务器的启动端口 修改将Tomcat服务器启动时使用的端口,例如改成9999 修改完server.xml文件之后,保存,退出.