以下配置是基于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