还记得之前写了篇文章http://www.humen1.net/2008/10/dz.html
这篇文章写了我引用dz论坛的文字过滤机制。
最近因为迁移程序到不同的服务器环境下出现了’preg_match() repeated subpattern is too long’ 的问题。原因如下

在php bug 里有这篇文章http://bugs.php.net/bug.php?id=39415&edit;=3
最后由高人指点说是PCRE的版本问题。对比了我两台服务器的PCRE版本,的确新服的版本是6.6而老服的版本是6.7那我就暂定是这个原因导致的。不过新服用的是centos5.2做为OS,使用yum更新PCRE说6.6是最高版本了。大家都知道centos
使用不是"非常新"(bleeding-edge,指一种最新的,因而也并非完美的技术。使用者为了尝鲜,就要付出稳定性和效率的代价。)的软件导致我更新不到6.7
那怎么办呢?
想想人家错误写的很明白subpattern is too long 正则表达式太长了么,那我就分段来咯。
下面这段是老程序
function censorChk($message){
$flag = 0;
$censor = array();//这里的array是所有屏蔽字数组。

$banned = ‘/(’.implode(‘|’, $cell).‘)/i’;
if (preg_match($banned, preg_replace(‘/\s*|\[[^\]]*\]/i’,
‘’, $message))){
$flag = 1;
}

return $flag;
}

修改后成为
function censorChk($message){
$flag = 0;
$censor = array();//这里的array是所有屏蔽字数组。
$allChunk = array_chunk($censor,500);//把原始数组分割为n块,每块的长度500
foreach ($allChunk as $cell){
$banned = ‘/(’.implode(‘|’, $cell).‘)/i’;
if (preg_match($banned, preg_replace(‘/\s*|\[[^\]]*\]/i’,
‘’, $message))){
$flag = 1;
}
}

return $flag;
}

这样从程序上解决PCRE的限制

humen1 Tech

要从语言(Languages)组安装附加语种支持,使用应用程序-添加/删除软件,或者运行命令:

shell> yum groupinstall -support

在上面的命令中, 是下列之一: assamese, bengali, chinese, gujarati, hindi,
japanese, kannada, korean, malayalam, marathi, oriya, punjabi,
sinhala, tamil, thai, 或 telegu。

humen1 Tech

手头有一个网站在线人数增多,访问时很慢。初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种现象就是说明apache最大连接数已经满了,新的访客只能排队等待有空闲的链接,而如果一旦连接上,在keeyalive
的存活时间内(KeepAliveTimeout,默认5秒)都不用重新打开连接,因此解决的方法就是加大apache的最大连接数。

1.在哪里设置?

服务器的为FreeBSD 6.2 ,apache 2.24,使用默认配置(FreeBSD 默认不加载自定义MPM配置),默认最大连接数是250

在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf

可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行
apachectl -l 来查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:

StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0

2.要加到多少?

连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。

查看当前的连接数可以用:
ps aux | grep httpd | wc -l

或:
pgrep httpd|wc -l

计算httpd占用内存的平均数:
ps aux|grep -v grep|awk ‘/httpd/{sum+=$6;n++};END{print sum/n}’

由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。

服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000
= 8053.06368

约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)

控制最大连接数的MaxClients ,因此可以尝试配置为:

StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100

注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。

重启httpd后,通过反复执行pgrep httpd|wc -l
来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。

(MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)

更佳最大值计算的公式:

apache_max_process_with_good_perfermance < (total_hardware_memory /
apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5

参考:

apache的参数设置

Apache 2.0性能优化―MPM的选择与配置

如何避免apache的httpd进程占用比较多的内存

对apache中并发控制参数prefork理解和调优

附:

实时检测HTTPD连接数:
watch -n 1 -d “pgrep httpd|wc -l”

humen1 Tech

RPMForge拥有4000多种CentOS的软件包,被CentOS社区认为是最安全也是最稳定的一个软件仓库。

主页:http://rpmforge.net/

1、确认系统是否安装了priority这个yum的插件,这个插件用来保证安装软件时候软件仓库先后次序,一般是默认先从官方base或者镜像安装,然后从社区用户contribute的软件中安装,再从第三方软件仓库中安装。当然这个次序可以自己更改,为了安全和稳定还是依照这个次序吧…

#yum install yum-priorities

安装完以后查看 /etc/yum/pluginconf.d/priorities.conf 文件,确认文件中有这一行

[main]

enabled=1

2、现在就可以手动编辑 /etc/yum.repos.d/ 目录中后缀为.repos的文件来设置软件仓库的先后次序(感觉我这个翻译不是很适当,priority主要还是个权限问题,但一时找不到更好的词,就这样吧)…

priority=N(N是整数,范围从1-99)

官方推荐配置是

[base], [addons], [updates], [extras] … priority=1

[centosplus],[contrib] … priority=2

Third Party Repos such as rpmforge … priority=N  (where N is > 10 and based on your preference)

3、现在开始安装rpmforge的软件仓库

a 先下载rpmforge的安装包

i386 http://apt.sw.be/redhat/el5/en/i386/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

x86_64 http://apt.sw.be/redhat/el5/en/x86_64/RPMS.dag/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

*不知道什么架构的用 uname -i 命令查看

b 安装DAG的PGP Key

rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

c 验证下载包的完整性

rpm -K rpmforge-release-0.3.6-1.el5.rf.*.rpm

d 安装包

rpm -i rpmforge-release-0.3.6-1.el5.rf.*.rpm

e 更改 /etc/yum.repos.d/rpmforge.repo 配置文件,就是添加

priority=3(或者1.2.4.…)这一句

f 现在就可以使用rpmforge这个软件仓库了…

humen1 Tech

tar命令 
tar 文件是几个文件和(或)目录在一个文件中的集合。这是创建备份和归档的佳径。

tar 使用的选项有:

-c ― 创建一个新归档。

-f ― 当与 -c 选项一起使用时,创建的 tar 文件使用该选项指定的文件名;当与 -x 选项
一起使用时,则解除该选项指定的归档。

-t ― 显示包括在 tar 文件中的文件列表。

-v ― 显示文件的归档进度。

-x ― 从归档中抽取文件。

-z ― 使用 gzip 来压缩 tar 文件。

-j ― 使用 bzip2 来压缩 tar 文件。

要创建一个 tar 文件,键入:

tar -cvf filename.tar directory/file

可以使用 tar 命令同时处理多个文件和目录,方法是将它们逐一列出,并用空格间隔:

tar -cvf filename.tar /home/mine/work /home/mine/school

上面的命令把 /home/mine 目录下的 work 和 school 子目录内的所有文件都放入当前
目录中一个叫做 filename.tar 的新文件里。

要列出 tar 文件的内容,键入:
tar -tvf filename.tar

要抽取 tar 文件的内容,键入
tar -xvf filename.tar

这个命令不会删除 tar 文件,但是它会把被解除归档的内容
复制到当前的工作目录下,并保留归档文件所使用的任何
目录结构。譬如,如果这个 tar 文件中包含一个叫做
bar.txt 的文件,而这个文件包含在 foo/ 目录中,那么,
抽取归档文件将会导致在你当前的工作目录中创建
foo/ 目录,该目录中包含 bar.txt 文件

tar 默认不压缩文件。

要创建一个使用 tar 和 bzip 来归档压缩的文件,使用 -j 选项:
tar -cjvf filename.tbz file

以上命令创建了一个归档文件,然后将其压缩为 filename.tbz 文件。如果你使用 bunzip2 命令为 filename.tbz 文件解压,filename.tbz 文件会被删除,继之以 filename.tar 文件。

你还可以用一个命令来扩展并解除归档 bzip tar 文件:
tar -xjvf filename.tbz

要创建一个用 tar 和 gzip 归档并压缩的文件,使用 -z 选项: 
tar -czvf filename.tgz file

这个命令创建归档文件 filename.tar,然后把它压缩为 filename.tgz 文件(文件 filename.tar 不被保留)。
如果你使用 gunzip 命令来给 filename.tgz 文件解压,filename.tgz 文件会被删除,并被
替换为 filename.tar。

你可以用单个命令来扩展 gzip tar 文件:
tar -xzvf filename.tgz

一. tar

1.压缩一组文件为tar.gz后缀。
# tar cvf backup.tar /etc
#gzip -q backup.tar

# tar cvfz backup.tar.gz /etc/
tar zxvf XXXX.tar.gz

tar jxvf XXXX tar.bz2

2.释放一个后缀为tar.gz的文件。
#gunzip backup.tar.gz
#tar xvf backup.tar

# tar xvfz backup.tar.gz

3.用一个命令完成压缩
#tar cvf - /etc/ | gzip -qc > backup.tar.gz

4.用一个命令完成释放
# gunzip -c backup.tar.gz | tar xvf -

5.如何解开tar.Z的文件?
# tar xvfz backup.tar.Z

# uncompress backup.tar.Z
#tar xvf backup.tar

6.如何解开.tgz文件?
#gunzip backup.tgz

7.如何压缩和解压缩.bz2的包?
#bzip2 /etc/smb.conf
这将压缩文件smb.conf成smb.conf.bz2
#bunzip2 /etc/smb.conf.bz2
这将在当前目录下还原smb.conf.bz2为smb.conf
注: .bz2压缩格式不是很常用,你可以man bzip2

humen1 Tech

# cd /usr/local

# tar cf - * | (cd /data/local; tar xf -)

将/usr/local内所有数据转移到 /data/local

为了保证数据安全,用tar将数据复制到另一个目录中,之所以使用tar而非cp -R命令,是为了保证复制文件和目录时保留它们的属主、权限控制属性的一致性。

humen1 Tech

df命令详细用法

a:显示全部的档案系统和各分割区的磁盘使用情形

i:显示i -nodes的使用量

k:大小用k来表示 (默认值)

t:显示某一个档案系统的所有分割区磁盘使用量

x:显示不是某一个档案系统的所有分割区磁盘使用量

T:显示每个分割区所属的档案系统名称

常用命令:df -hi

操作详解

指令 df 可以显示目前所有档案系统的最大可用空间及使用情形,请看下列这个例子:

# df -h

Filesystem Size Used Avail Capacity Mounted on

/dev/ad0s1a 1.9G 389M 1.4G 21% /

devfs 1.0K 1.0K 0B 100% /dev

/dev/ad0s1d 989M 54K 910M 0% /tmp

/dev/ad0s1f 4.8G 3.8G 657M 86% /usr

/dev/ad0s1e 1.9G 149M 1.6G 8% /var

/dev/ad0s1g 26G 890K 24G 0% /volume2

/dev/da0s1d 325G 261G 38G 87% /volume1

我们加了参数 -h 表示使用「Human-readable」的输出,也就是在档案系统大小使用 GB、MB 等易读的格式。

上面的指令输出的第一个字段及最后一个字段分别是档案系统及其挂入点。我们可以看到 /dev/ad0s1a 这个分割区被挂在根目录下。我们在上一小节提到过 ad 所代表的是 IDE 的硬盘,而 s1 表示第一个主要扇区。我另外有一个 SCSI 硬盘,它的代号是 da,它的容量很大,主要用来存放数据。devfs 是一个特别的档案系统,该档案系统并非真的磁盘,而是 FreeBSD 用来管理系统硬件装置的虚拟档案系统。

接下来的四个字段 Size、Used、Avail、及 Capacity 分别是该分割区的容量、已使用的大小、剩下的大小、及使用的百分比。当硬盘容量已满时,您可能会看到已使用的百分比超过 100%,因为 FreeBSD 会留一些空间给 root,让 root 在档案系统满时,还是可以写东西到该档案系统中,以进行管理。

另外,我们还可以使用参数 -i 来查看目前档案系统 inode 的使用情形。有的时候虽然档案系统还有空间,但若没有足够的 inode 来存放档案的信息,一样会不能增加新的档案。

# df -ih

Filesystem Size Used Avail Capacity iused ifree %iused Mounted on

/dev/ad0s1a 1.9G 389M 1.4G 21% 20495 262127 7% /

devfs 1.0K 1.0K 0B 100% 0 0 100% /dev

/dev/ad0s1d 989M 62K 910M 0% 24 141286 0% /tmp

/dev/ad0s1f 4.8G 3.8G 657M 86% 311439 348015 47% /usr

/dev/ad0s1e 1.9G 149M 1.6G 8% 1758 280864 1% /var

/dev/ad0s1g 26G 890K 24G 0% 12 3532786 0% /volume2

/dev/da0s1d 325G 261G 38G 87% 707277 43311409 2% /volume1

我们可以看到根目录的已经用掉的 inode 数量为 20495,还有 262127 的可用 inode。

小提示

还记得什么是 inode 吗?所谓的 inode 是用来存放档案及目录的基本信息 (metadata),包含时间、档名、使用者及群组等。在分割扇区时,系统会先做出一堆 inode 以供以后使用,inode 的数量关系着系统中可以建立的档案及目录总数。如果要存的档案大部分都很小,则同样大小的硬盘中会有较多的档案,也就是说需要较多的 inode 来挂档案及目录。

du:查询档案或目录的磁盘使用空间

a:显示全部目录和其次目录下的每个档案所占的磁盘空间

b:大小用bytes来表示 (默认值为k bytes)

c:最后再加上总计 (默认值)

s:只显示各档案大小的总合

x:只计算同属同一个档案系统的档案

L:计算所有的档案大小

常用命令:du -a

操作详解

指令 du 能以指定的目录下的子目录为单位,显示每个目录内所有档案所占用的磁盘空间大小。例如:

# du -h /etc

104K /etc/defaults

6.0K /etc/X11

8.0K /etc/bluetooth

4.0K /etc/gnats

52K /etc/isdn

388K /etc/mail

68K /etc/mtree

2.0K /etc/ntp

38K /etc/pam.d

44K /etc/periodic/daily

6.0K /etc/periodic/monthly

42K /etc/periodic/security

16K /etc/periodic/weekly

110K /etc/periodic

6.0K /etc/ppp

318K /etc/rc.d

2.0K /etc/skel

130K /etc/ssh

10K /etc/ssl

1.7M /etc

我们目样使用 -h 参数来显示 human-readable 的格式。在应用时,我们可以使用 du 这个指令来查看哪个目录占用最多的空间。不过,du 的输出结果通常很长,我们可以加上 -s 参数来省略指定目录下的子目录,而只显示该目录的总合即可:

# du -sh /etc

1.7M /etc

在查看目录的使用情形时,我们可以将输出结果导到 sort 指令进行排序,以了解哪个档案用了最多的空间:

# du /etc | sort -nr | more

1746 /etc

388 /etc/mail

318 /etc/rc.d

130 /etc/ssh

110 /etc/periodic

104 /etc/defaults

68 /etc/mtree

52 /etc/isdn

44 /etc/periodic/daily

42 /etc/periodic/security

38 /etc/pam.d

16 /etc/periodic/weekly

10 /etc/ssl

8 /etc/bluetooth

6 /etc/ppp

6 /etc/periodic/monthly

6 /etc/X11

4 /etc/gnats

2 /etc/skel

2 /etc/ntp

sort 的参数 -nr 表示要以数字排序法进行反向排序,因为我们要对目录大小做排序,所以不可以使用 human-readable 的大小输出,不然目录大小中会有 K、M 等字样,会造成排序不正确。

humen1 Tech

0%