网站运维、系统运维管理研究
2007/03/29WEB服务器

2条评论
417 views

linux下apache的一个奇怪的问题

这几天服务器总是莫名其妙的负载非常高,而直接导致服务器连接不上,连上服务器后停止apache,可以看到马上负载就降低下来了,主要就是 load非常高,高到机器动不了……

负载降低下来再开启,一段时间后又重复,而且有的时候一分钟前查看状态还非常正常,而一分钟后服务器就断了,怀疑是程序方面的原因,查程序又查不出什么东西来;继续郁闷……

一般这个时候apache错误日志里狂报错误是:

[Tue Nov 21 13:22:33 2006] [notice] child pid 4965 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4974 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4977 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4979 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4981 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4986 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4987 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 4999 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5001 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5003 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5005 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5006 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5008 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5010 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5011 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5014 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5015 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5020 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5021 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5022 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5024 exit signal Segmentation fault (11)

[Tue Nov 21 13:22:33 2006] [notice] child pid 5025 exit signal Segmentation fault (11)

就是apache httpd进行不断的退出, 不断的启动;

昨天实在没办法,以为apahe版本过高(2.2.23) 就降低apache,安装apache 2.0.55,结果安装完还未配置好之前都是正常的,加上某个站点后就又重新报错,看来应该是这个站点影响了……

不过随即发现另外一个站点部分功能也不正常了,经过查找发现提示tmp目录无法写,查找/tmp目录,才5M多,并不大,分区也没满,继续……再查找,/tmp目录文件太多,删除,站点正常,把apache换回原来的高版本,也正常,再加上那个影响的站点,也都正常了,虽然解决了,到现在还不太明白为什么……

遇到这个错误的人不在少数,网络上很多人提问该怎么解决,但都没有一个提到跟/tmp目录有关系的,无意中发现并解决,特此记录,以后有同样错误的人能搜索到这里的话就顶我一下吧……

Stale NFS file handle的解决方法

早上来到公司,发现有两台server有问题。因为用df -k察看磁盘使用情况时,一台机器报如下错误:Stale NFS file handle。另外一台整个就没反应。后来查了一些资料,说是“

当我们已经mount 上的file or directory ,在server上突然被remove or unexport ,就会出现此讯息“。就是说,如果client端mount上了server端的directory之后,如果server端又将这个directory unshare了,那么就会在client端出现这个错误。正文:其实解决办法很简单,就是在client上把那个文件unmount掉。可是其实做起来很难,因为经常会得到 is busy的错误。可以用下面的三个方法:1)用fuser杀掉占用那个目录的进程fuser -k /directory2)在启动的进程里面查找ps -ef |awk '{print $2}' |grep -v PID |xargs /usr/proc/bin/pwdx 这种方法只能在solaris8及以上版本使用3)umount -f /directory强制umount上面的1跟2方法有时候并不能解决问题,可以这三个一起结合着使用。

NFS服务器 配置

NFS服务器

NFS是SUN Microsystem公司开发的网络文件系统,它是一种基于远程过程调用(RPC)的分布式文件系统架构。与Samba相比较,NFS的数据吞吐能力更强。

1、 用命令 # rpm –qa | grep nfs检查软件包NFS是否安装 ,如果输出没有输出,表明没有被安装,请自行安装之。

2、 配置NFS服务器。用任何文本编辑器配置文件/etc/exports,来确定需要给客户共享的目录。它的基本格式为 Directory Host(options) # comments ,这3个字段/列要在一行,directory与host(options)之间要有间隙,# comments 可有可无。主机选项主要是给与挂接用户什么样的权限。目录directory表示要共享出去的目录,值得注意的是,在启用NFS服务以前,系统管理员应该仔细一些,比如不小心共享了根目录/,并且给与用户读写权限,这是十分糟糕的问题。因此,尽可能少的共享目录和赋予较小的访问权限。主机名host是一个很灵活的项目,可以是单个的主机名称(由/etc/hosts得到),主机ip地址,由域名服务器解析的主机名称,IP网络—网络号和子网掩码中间用“/”连接,NIC等。下面列举一个例子。

/home/sery sery(r,w) #把目录/home/sery共享给主机sery,并且主机对目录#/home/sery有读写权限

/tmp 192.168.100.18(ro) #主机192.168.100.18对目录/tmp具备只读共#享权限

/media/cdrom 192.168.100.0/255.255.255.0(r,o) #整个网络有读取挂接在NFS

#服务器上的光驱光盘的读取权限

3、 启用NFS服务。分两步:首先启用portmap,然后启用NFS服务。# service portmap start;

# service nfs start。其中portmap的功能是启用远程过程调用,有时启用NFS不能成功,不妨检查一下portmap服务是否启动(# ps aux | grep portmap)。

4、 在客户端挂接NFS共享出来的目录。先在客户端创建一个挂接点,如 # mkdir /mnt/nfs ,而后使用命令把nfs服务器共享出来的目录挂接上,以第2步那个共享为例,我们挂接目录 /tmp , # mount –t nfs 192.168.100.100:/tmp /mnt/nfs //假定nfs服务器的ip地址是192.168.100.100。

5、 访问NFS共享资源。接上步,改变文件目录 # cd /mnt/nfs就方便地实现了对nfs服务器目录/tmp的远程访问。

6、 卸载NFS文件系统。在客户端执行命令 # umount /mnt/nfs 就卸下了第4步挂接的NFS文件系统。

7、 其他事项。前面我们描述了在客户段用手工挂接NFS文件系统的操作,有的场合可能需要自动实现对NFS的挂接操作;修改文件/etc/fstab,把挂接项插入进去就可以了。对一个有较多连接的NFS服务器而言,有这样一个问题—用户在使用完挂接的文件系统后,并不会总记得卸载掉NFS挂接,这必然会增大NFS服务器的维护工作量以及白白占用有限的系统和网络资源;解决这个问题的办法是使用自动挂接器(automounter)。关于自动挂接器属于性能调优的范畴,在此不做描述。

实例:

/home/xxxxx/lib 10.0.0.1(ro,no_root_squash)

/home/xxxxx/xiaban/log 10.0.0.1(rw,all_squash,anonuid=10001,anongid=10001)

/home/xxxxxx/images/uploads 10.0.0.1(rw,all_squash,anonuid=9999,anongid=9999)

Too many open files 问题解决

如果程序是以root身份运行的,可以直接在root目录下的文件.bashrc 底部加入一行

ulimit -n 10240

就可以把1024限制改成10240

效果可以用ulimit -a 查看,如下:

[root@mx1 ~]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

pending signals (-i) 1024

max locked memory (kbytes, -l) 32

max memory size (kbytes, -m) unlimited

open files (-n) 10240

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 32766

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

Too many open files 问题出现有两种情况:

一种是在搜索的时候出现,多半是由于索引创建完毕之后被移动过,如果创建索引的时候不出现该错误,搜索的时候也一般是不会出现的。如果出现了,有两种处理办法,一种是修改合并因子和最小合并因子,并且使用

IndexWriter.Optimize() 优化索引,这样会将索引文件数量减少到文件系统限制之内;另外一种办法是修改操作系统的打开文件数量限制。方法如下:

{

1. 按照最大打开文件数量的需求设置系统, 并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。

# cat /proc/sys/fs/file-max

如果设置值太小, 修改文件/etc/sysctl.conf的变量到合适的值。 这样会在每次重启之后生效。 如果设置值够大,跳过下步。

# echo 2048 > /proc/sys/fs/file-max

编辑文件/etc/sysctl.conf,插入下行。

fs.file-max = 8192

2. 在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示:

#<domain> <type> <item> <value>

添加如下这行。

* – nofile 8192

o&#114;:soft nofile 1024

hard nofile 4096

这行设置了每个用户的默认打开文件数为2048。 注意&#34;nofile&#34;项有两个可能的限制措施。就是<type>项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用&#34;-&#34;字符设定<type>, 则hard和soft设定会同时被设定。

硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。

当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。

}

另外一种情况是在创建索引的时候,也有两种可能,一种是 合并因子太小,导致创建文件数量超过操作系统限制,这时可以修改合并因子,也可以修改操作系统的打开文件数限制;另外一种是合并因子受虚拟机内存的限制,无法调整到更大,而 需要索引的doc 数量又非常的大,这个时候就只能通过修改操作系统的打开文件数限制来解决了。

假想环境下的NFS设置

假想环境

10.0.0.1 – NFS Server

10.0.0.2 – NFS Client

1)在NFS Server上:

# vi /etc/exports

添加一行:

/var/nfs  10.0.0.2(rw,async,anonuid=65534,anongid=65534)

# mkdir -p /var/nfs

# chown nfsnobody:nfsnobody /var/nfs

# chown -R nfsnobody:nfsnobody /var/nfs/.

# service portmap start

# service nfslock start

# service nfs start

2)在NFS Client上:

# service portmap start

# chown nfsnobody:nfsnobody xxx/xxx/bbs/attachment

# chmod 777 xxx/xxx/bbs/attachment

# mount -t nfs -o soft,intr,bg,timeo=50 10.0.0.1:/var/nfs /xxx/xxx/bbs/attachment

# vi /etc/fstab

加入一行:

10.0.0.1:/var/nfs /xxx/xxx/bbs/attachment nfs soft,intr,bg,timeo=50 0 0

[编辑]说明 &amp; 注意

[编辑]exports参数说明

rw: 读写模式;

async: 异步磁盘读写;

anonu(g)id: 指定NFS在进行操作时所使用的匿名用户uid/gid

[编辑]NFS 管理命令

showmount -e 在NFS Server上执行此命令显示NFS Server上所有的共享卷;

showmount -e 10.0.0.1 在NFS Client上执行此命令显示NFS Server上所有共享卷;

export -av 根据/etc/exports导出所有卷;

export -rv 重新导出所有卷,增加/etc/exports中的新项目、删除不存在的项目、更新改变的项目;

[编辑]NFS 相关文件

/etc/exports

是NFS Server最基本的配置文件之一,文件中列出了共享的文件系统和允许访问这些文件系统的主机。

/proc/fs/nfs/exports

导出文件列表的内核视图,包括导出的参数。

/var/lib/nfs/etab

状态文件,其中列出了当前的高级列表。此文件包含了/etc/exports中相同格式的所有项目,同时包含了由exportfs -i手工导入的项目。

/var/lib/nfs/rmtab

状态文件,列出了挂接导出文件的远程客户机清单。

/var/lib/nfs/xtab

状态文件,当前底层导出清单。

[编辑]/etc/exports 中client的书写规则

(1) 单个主机

可以用短名及完全限定名,或者用IP地址,例如student01、student01.flying.com.cn或者192.168.10.1都是合法的主机名。

(2) Net-Group

可以列出/etc/netgroup文件中或NFS网组映射中定义的整组主机。网组名以@开头。

(3) 通配符主机

.discuz.net *.*.comsenz.com

(4) 掩码

192.168.1.0/255.255.255.0

[编辑]起停顺序

启动:

portmap

nfslock

nfs

停止:

nfslock

nfs

portmap

[编辑]安全性

portmap: 111 NFS: 2049

防止使用IP欺骗和RPC重定向技术通过lo回环进行攻击以及限定授权主机:

iptables -A INPUT -p udp -d 127.0.0.1 –dport 111 -j Dro&#112;

iptables -A INPUT -p udp -d 127.0.0.1 –dport 2049 -j Dro&#112;

iptables -A INPUT -p udp -s 10.0.0.2 –dport 111 -j ACCEPT

iptables -A INPUT -p udp -s 10.0.0.2 –dport 2049 -j ACCEPT

Too many open files 问题出现有两种情况

一种是在搜索的时候出现,多半是由于索引创建完毕之后被移动过,如果创建索引的时候不出现该错误,搜索的时候也一般是不会出现的。如果出现了,有两种处理办法,一种是修改合并因子和最小合并因子,并且使用

IndexWriter.Optimize() 优化索引,这样会将索引文件数量减少到文件系统限制之内;另外一种办法是修改操作系统的打开文件数量限制。方法如下:

{

1. 按照最大打开文件数量的需求设置系统, 并且通过检查/proc/sys/fs/file-max文件来确认最大打开文件数已经被正确设置。

# cat /proc/sys/fs/file-max

如果设置值太小, 修改文件/etc/sysctl.conf的变量到合适的值。 这样会在每次重启之后生效。 如果设置值够大,跳过下步。

# echo 2048 > /proc/sys/fs/file-max

编辑文件/etc/sysctl.conf,插入下行。

fs.file-max = 8192

2. 在/etc/security/limits.conf文件中设置最大打开文件数, 下面是一行提示:

#<domain> <type> <item> <value>

添加如下这行。

* – nofile 8192

o&#114;:soft nofile 1024

hard nofile 4096

这行设置了每个用户的默认打开文件数为2048。 注意&#34;nofile&#34;项有两个可能的限制措施。就是<type>项下的hard和soft。 要使修改过得最大打开文件数生效,必须对这两种限制进行设定。 如果使用&#34;-&#34;字符设定<type>, 则hard和soft设定会同时被设定。

硬限制表明soft限制中所能设定的最大值。 soft限制指的是当前系统生效的设置值。 hard限制值可以被普通用户降低。但是不能增加。 soft限制不能设置的比hard限制更高。 只有root用户才能够增加hard限制值。

当增加文件限制描述,可以简单的把当前值双倍。 例子如下, 如果你要提高默认值1024, 最好提高到2048, 如果还要继续增加, 就需要设置成4096。

}

另外一种情况是在创建索引的时候,也有两种可能,一种是 合并因子太小,导致创建文件数量超过操作系统限制,这时可以修改合并因子,也可以修改操作系统的打开文件数限制;另外一种是合并因子受虚拟机内存的限制,无法调整到更大,而 需要索引的doc 数量又非常的大,这个时候就只能通过修改操作系统的打开文件数限制来解决了。

ulimit -n 10240

就可以把1024限制改成10240

效果可以用ulimit -a 查看,如下:

[root@mx1 ~]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

pending signals (-i) 1024

max locked memory (kbytes, -l) 32

max memory size (kbytes, -m) unlimited

open files (-n) 10240

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 32766

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

cronolog 中的日期格式

其LogFormat中日期格式可用%{ format }t自定义,如下参考:

%A 星期名全称(本地的)

%a 3个字符的星期名(本地的)

%B 月份名的全称(本地的)

%b 3个字符的月份名(本地的)

%c 日期和时间(本地的)

%d 2位数的一个月中的日期数

%H 2位数的小时数(24小时制)

%I 2位数的小时数(12小时制)

%j 3位数的一年中的日期数

%M 2位数的分钟数

%m 2位数的月份数

%p am/pm 12小时制的上下午(本地的)

%S 2位数的秒数

%U 2位数的一年中的星期数(星期天为一周的第一天)

%W 2位数的一年中的星期数(星期一为一周的第一天)

%w 1位数的星期几(星期天为一周的第一天)

%X 时间 (本地的)

%x 日期 (本地的)

%Y 4位数的年份

%y 2位数的年份

%Z 时区名

%% 符号`%&#39;本身

重启apache后,服务器会以半天为单位产生日志,下面进行日志合并然后同步

合并3个日志文件log1 log2 log3并输出到log_all中比较好方法是:

sort -m -t &#34; &#34; -k 4 -o log_all log1 log2 log3

注释:

m: 使用 merge优化算法

-t &#34; &#34;: 日志字段分割符号是空格

-k 4: 按第4个字段排序,也就是:[03/Apr/2002:10:30:17 +0800] 这个字段

-o log_all: 输出到log_all这个文件中

并且服务器负载迅速升高

当时临时把日志改名了再起用新日志文件,今天上网查了一下,找到个资料

引用内容

CHOST=&#34;i686-pc-linux-gnu&#34;

CFLAGS=&#34;-march=i686 -O3 -pipe -fomit-frame-pointer -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE&#34;

CXX=gcc CXXFLAGS=&#34;-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE&#34;

./configure –prefix=/usr/local/cronolog-1.6.2

因为日志是通过cronolog来处理所以只要重新编译cronolog就可以了

关键是这一行代码…-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE

他会让你编译后的程序调用系统支持的64bit的操作..就不会有2G文件的限制了…

也重新编译了一下cronolog,希望不再有这个错误产生,观察中^

如果apache支持2G以上文件的下载呢,下面有一方法,现在还没测试

引用自

Linux下apache支持最大文件为2G,如果要让它支持更大文件,在编译前加上:

export CFLAGS=&#34;-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64&#34;

不加此参数的话,GCC默认是不支持大于2G的文件的。不光Apache2,其他的软件应该也适用

让apache日志超2G….:)

www.xmfish.com 服务器这几天访问量也飚升,原来每天大约1.8G的日志,现在要2、3G,于是就报错了,日志超过2G的时候会提示

[Wed Jan 17 20:57:27 2007] [notice] child pid 31299 exit signal File size limit exceeded (25)

piped log program &#39;/usr/local/cronolog/sbin/cronolog /usr/local/apache2/logs/access_log.%Y%m%d&#39; failed unexpectedly

并且服务器负载迅速升高

当时临时把日志改名了再起用新日志文件,今天上网查了一下,找到个资料

引用自

CHOST=&#34;i686-pc-linux-gnu&#34;

CFLAGS=&#34;-march=i686 -O3 -pipe -fomit-frame-pointer -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE&#34;

CXX=gcc CXXFLAGS=&#34;-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE&#34;

./configure –prefix=/usr/local/cronolog-1.6.2

因为日志是通过cronolog来处理所以只要重新编译cronolog就可以了

关键是这一行代码…-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE

他会让你编译后的程序调用系统支持的64bit的操作..就不会有2G文件的限制了…

也重新编译了一下cronolog,希望不再有这个错误产生,观察中^

如果apache支持2G以上文件的下载呢,下面有一方法,现在还没测试

引用自

Linux下apache支持最大文件为2G,如果要让它支持更大文件,在编译前加上:

export CFLAGS=&#34;-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64&#34;

不加此参数的话,GCC默认是不支持大于2G的文件的。不光Apache2,其他的软件应该也适用。

返回顶部