实时观察Apache访问情况的工具Apachetop (Linux/Unix)
发布于 2009-02-11 20:39 阅读:31056 评论:1 标签: apachetop log

    Linux服务器的负载、进程等信息可以通过top命令查看。而Apache的运转如何实时的观察呢?“tail -f”log文件?这是个好方法,但是太累了!

    所以,感谢Chris Elsworth为我们提供了类似top命令的apachetop命令!官网地址:http://www.webta.org/projects/apachetop/

    apachetop可以查看最近一段时间和自命令执行以来的apache访问情况,信息包括被访问的文件、次数、流量大小。

    命令安装、使用可以查看官网提供的说明:http://www.webta.org/projects/apachetop/browser/README,或者查看一个中文的解释:《实时跟踪log变化的工具Apachetop》。

    在此我对命令显示信息和一些好用的参数做一下说明。

    先看命令显示:

以下是引用片段:

last hit: 11:19:12         atop runtime:  0 days, 07:12:27             11:19:13
All:      1553476 reqs (  59.9/sec)       3566.4M (  140.7K/sec)    2407.3B/req
2xx: 1458916 (93.9%) 3xx:   93768 ( 6.0%) 4xx:   787 ( 0.1%) 5xx:     5 ( 0.0%)
R ( 30s):    1692 reqs (  56.4/sec)       4342.8K (  144.8K/sec)    2628.3B/req
2xx:    1606 (94.9%) 3xx:      85 ( 5.0%) 4xx:     1 ( 0.1%) 5xx:     0 ( 0.0%)

 REQS REQ/S    KB KB/S URL
  916 30.53  1202 40.1*/api/chk.php
   71  2.37 433.7 14.5 /login.php
   50  1.67  44.6  1.5 /css/css.css
   39  1.50 506.4 19.5 /js/js.js

    第一行的“last hit: 11:19:12”和“11:19:13”分别显示此次显示时的最后观察时间,和现在的时间。不过我对这个时间很不理解,因为这个世界和系统的时间是不一致的。不知道是我理解有误还是怎么回事,忘有知情的朋友留言告诉我。

    第一行中间的部分表示这个命令运行了多长时间。

    第二、三行显示的是自命令执行以来观察到的所有数据汇总。第四、五行显示的是近30表的数据汇总。前一行表示:总请求数、每秒处理的请求数、总的数据传输量、每个请求的数据传输量。后一行显示http响应类型、此类型的总数、每秒的此类型的响应数。这个还是很好理解的。

    再往后的数据则从访问量大小排列出了是哪些程序在被访问。格式照上也很好理解。

    有几个很有用的参数值的学习一下。

    -f:这个参数指定了apachetop命令观察的对象。并不是每个人的apache的日志都在默认的位置,甚至你为了统计的方便,使用多个日志文件来区分不同的端口(80、443)、正确和错误的访问日志、等等。这个时候可以使用这个参数来指定log文件。尤其有用的是,你可能需要同时查看多个log的情况,这时你可以多次使用-f参数来制定,如: apachetop -f file1 -f file2。

    -d:默认情况下,显示界面每5秒刷新一次,如果你觉得刷新频率不爽,你可以使用这个参数来做改变。

    -T:上面的例子中,我们在最后面看到的是最近30秒的情况。如果你觉得密度不够,可以使用这个参数来做改变。

    -H:还是上面的例子,可以看到最近30秒的请求总数是:1606+85+1+0=1692次。如果你想让每请求N次刷新一次界面怎么办?哈,就是使用这个命令了!

    注意:-T和-H参数是不能同时使用的,否则会提示你:“-T and -H are mutually exclusive. Specify only one.”

    -q:有一些程序,在使用的时候是可以带参数的,即get方式。如果你想看看都是些什么参数,就可以使用这个命令了!

    看完以后,不要忘了,如果你知道第一行的“last hit: 11:19:12”和“11:19:13”分别显示的是什么,别忘了告诉我。。。。。

展开全文  
收起全文  
Linux下查看文件和文件夹大小的df和du命令 (Linux/Unix)
发布于 2009-02-09 18:07 阅读:211377 评论:0 标签: df du 文件大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择。

    df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
    du可以查看文件及文件夹的大小。

    两者配合使用,非常有效。比如用df查看哪个一级目录过大,然后用df查看文件夹或文件的大小,如此便可迅速确定症结。

    下面分别简要介绍

    df命令可以显示目前所有文件系统的可用空间及使用情形,请看下列这个例子:

以下是代码片段:

[yayug@yayu ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3.9G  300M  3.4G   8% /
/dev/sda7             100G  188M   95G   1% /data0
/dev/sdb1             133G   80G   47G  64% /data1
/dev/sda6             7.8G  218M  7.2G   3% /var
/dev/sda5             7.8G  166M  7.2G   3% /tmp
/dev/sda3             9.7G  2.5G  6.8G  27% /usr
tmpfs                 2.0G     0  2.0G   0% /dev/shm

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

    上面的命令输出的第一个字段(Filesystem)及最后一个字段(Mounted on)分别是档案系统及其挂入点。我们可以看到 /dev/sda1 这个分割区被挂在根目录下。

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

    du:查询文件或文件夹的磁盘使用空间

    如果当前目录下文件和文件夹很多,使用不带参数du的命令,可以循环列出所有文件和文件夹所使用的空间。这对查看究竟是那个地方过大是不利的,所以得指定深入目录的层数,参数:--max-depth=,这是个极为有用的参数!如下,注意使用“*”,可以得到文件的使用空间大小.

    提醒:一向命令比linux复杂的FreeBSD,它的du命令指定深入目录的层数却是比linux简化,为 -d。

以下是代码片段:

[root@bsso yayu]# du -h --max-depth=1 work/testing
27M     work/testing/logs
35M     work/testing

[root@bsso yayu]# du -h --max-depth=1 work/testing/*
8.0K    work/testing/func.php
27M     work/testing/logs
8.1M    work/testing/nohup.out
8.0K    work/testing/testing_c.php
12K     work/testing/testing_func_reg.php
8.0K    work/testing/testing_get.php
8.0K    work/testing/testing_g.php
8.0K    work/testing/var.php

[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/
27M     work/testing/logs/

[root@bsso yayu]# du -h --max-depth=1 work/testing/logs/*
24K     work/testing/logs/errdate.log_show.log
8.0K    work/testing/logs/pertime_show.log
27M     work/testing/logs/show.log

    值得注意的是,看见一个针对du和df命令异同的文章:《du df 差异导致文件系统误报解决》。

    du 统计文件大小相加
    df  统计数据块使用情况

    如果有一个进程在打开一个大文件的时候,这个大文件直接被rm 或者mv掉,则du会更新统计数值,df不会更新统计数值,还是认为空间没有释放。直到这个打开大文件的进程被Kill掉。

    如此一来在定期删除 /var/spool/clientmqueue下面的文件时,如果没有杀掉其进程,那么空间一直没有释放。

    使用下面的命令杀掉进程之后,系统恢复。
    fuser -u /var/spool/clientmqueue

展开全文  
收起全文  
不是每个人都和你想的一样 (随便说说)
发布于 2009-02-09 15:57 阅读:42999 评论:0 标签:

    不是每个人都和你想的一样,从上到下皆是。

    大的方面说。

    2008年2月5日晚,央视一套播出2008年《感动中国》人物的颁奖仪式,颁奖仪式打破常规(其实学老外:在这里),将年度特别奖授予了全体中国人(在这里)。白岩松的颁奖说词如下(这里有):

以下是引用片段:

我们每一个人都有权接过这个奖杯,因为我们都是获奖者。然而,我们每一个人都没有理由,让这个奖杯,在我们的身边停留得太久,因为我们只是十三亿分之一。历史会认同,2008年这份特殊的奖励,此刻我们看到这个奖杯,真的觉得它意味深长,这是因为它是在孩子手里。

    可是,很多有独立思考的人并不这么想。

    著名律师刘晓原在博文《拒领“2008感动中国”年度特别奖》里以一个中国普通公民身份表达自己的声音:

以下是引用片段:

  我是一个无贡献者,也是一个守法公民。与有功绩者一起获奖,我感到受之有愧;与腐败分子一同获奖,我感到无地自容。作为一个有自知之明的公民,我在此郑重地声明,拒绝领取中央电视台颁发的“感动中国”年度特别奖。基于奖项是授予全体中国人的,我拒绝领取其中的十三亿分之一“份额”。
  我只是一名普通公民,做不了感动国家的事情,敬请中央电视台予以谅解!

                    北京市忆通律师事务所刘晓原律师

    童话大王郑渊洁似乎也赞同这个观点。当然,搞文学的比较含蓄,于是借咬文嚼字的提出了抗议:(“抗议”是我的臆断)(原文在这里

以下是引用片段:

“中国人”的概念应该是所有持有中华人民共和国护照(包括台湾护照)的人。“全体中国人”当选2008年感动中国年度特别奖,自然也必须包括陈水扁和两岸所有东窗事发和尚未穿帮的贪官。

........................

    我国今年的《国防白皮书》就因为使用错了一个标点符号,引起外国误解。那句话是这样的:“中国主张所有核武器国家明确承诺全面、彻底销毁核武器,并承诺停止研发新型核武器,降低核武器在国家安全政策中的作用。”结果外国各大媒体都使用通栏大标题争先恐后报道:中国承诺停止研发新型核武器!

........................

    作为中国人,说好中国话写好中国文很重要。语言是民族的立身之本,秦始皇最伟大的功绩是在中国统一了文字。为什么中国到现在还没分裂?统一的文字是头功。全体中国人在没有充分到位掌握母语之前趋之若鹜本末倒置学外文,对民族不是幸事。无源之水无本之木多了,民族就有成为海市蜃楼的风险。

    如果你不了解“神奇的国度”的含义,你可能理解不了他们为啥要挑刺,“给脸不要脸”。不过你可以看看这个《不是我说的》来理解一下,然后看看《专家又变卦了……》来加深一下理解。

    小的方面说。

    上网的用户都是怎么想的呢?许晓辉说“你和用户其实想得不一样・白天不懂夜的黑”:

以下是引用片段:

 用户不关心流氓。春节回家用大姐的电脑,发现首页是1616.net导航站;刚上一年级的外甥女很流利的打开2144.cn玩flash小游戏;而地址栏搜索是QQ的天下。就在我们高谈阔论流氓推广的时候,广大网民已经在大大小小的网站上乐不思蜀了。对于像大姐家小孩一样的初级网民而言,他们根本就不关心什么流氓推广,只要产品好用就行,即使不好用他们也不知道如何卸载。这也就是网址导航站、网络实名等能够迅速普及的原因。(诸如1616、2144这类网站,你从网上很难找到他们的作者是谁,但却真真实实的安装到了无数电脑之中,并为幕后作者提供着源源不断的广告收入)

    可是我回家在网吧上网看见的不是这样的,用户貌似很明确自己的目的。网吧的系统一般请一个公司来装,然后这个公司就把这个机器的IE主页设置为自己做的。比如我来的这个网吧,他弄的主页类似百度,正中是一个百度的搜索框,四周再整点导航,百度的搜索框很很醒目。然而,我看见左边座位上先后两个人都是打开默认主页后,无视醒目的百度搜索框,而是很熟练的在地址栏里面敲入“www.baidu.com”。动作之熟练,令我汗颜:)

    不过,我和许晓辉看见的用户数很少,不足以作为数据说明。或许,这也就是我一直所想的,做网站不一定要功能全面,能够满足一部分的用户的需求,就已经足够了。

    一直不敢多议他人,皆源于此。

展开全文  
收起全文  
小糊涂了一把,哈哈 (随便说说)
发布于 2009-01-19 19:30 阅读:9599 评论:0 标签: 糊涂

       以前遇到过这种事情,今天又糊涂了一把。

以下是代码片段:

[root@login yayu]# ls -la
.............................
-rw-r--r--  1 root      root        49 Jan 19 19:20 loglog
[root@login yayu]#
[root@login yayu]# cat loglog
Directory "/data2/logs/error" is not exists
[root@login yayu]#
[root@login yayu]# ls -l /data2/logs/error
ls: /data2/logs/error: No such file or directory

展开全文  
收起全文  
PHP的变量也不是随意能转化的及bash的算术运算 (PHP心得)
发布于 2008-12-30 20:47 阅读:11656 评论:0 标签: array bash scalar

      一直以为PHP的变量是很灵活的,类型想怎么变换就怎么变换。

      但实际上并不是这样,当一个变量被赋值为数字时,是变换不了数组的,比如:

以下是代码片段:

[root@localhost shengting]# cat test.php
<?php
$a = 454;
$b = 6;
$a['gfgo'] = $b;

var_dump($a);
?>

[root@localhost shengting]# php test.php
PHP Warning:  Cannot use a scalar value as an array in /usr/home/shengting/test.php on line 4

Warning: Cannot use a scalar value as an array in /usr/home/shengting/test.php on line 4
int(454)

      从var_dump的结果看,不仅有Warning级的错误,赋值也没有成功。而,如果变量一开始是字符串的话,就没这回事情了:

以下是引用片段:

[root@localhost shengting]# cat test.php
<?php
$a = `454`;
$b = 6;
$a['gfgo'] = $b;

var_dump($a);
?>
[root@localhost shengting]# php test.php
sh: 454: command not found
array(1) {
  ["gfgo"]=>
  int(6)
}

      可以看出,赋值是成功的。

      应该,这个是和存储的类型是有联系的。同样,在Shell的Bash中,所有的变量的值都是以字符串方式存储的。尽管这个特性使得bash的数据处理起来很容易,但是也使得数字运算比较困难。原因就是数字也是以字符串的形式存储的,

      在Bash中,如果要对数字进行算术运算和逻辑操作,必须先转化为整数(可视为中间值),得到运算结果后再转化为字符串,以便正确的保存在Bash变量中。

      Bash提供了三种方式的数字数据进行算术变量:

以下是引用片段:

1:使用let命令。
2:使用shell扩展 $((expression))
3:使用expr命令

      具体用法就不说了,哈哈。偶比较喜欢使用第二种。

展开全文  
收起全文  
做个有意思的小网站,看着它长大 (随便说说)
发布于 2008-12-29 21:16 阅读:144598 评论:1 标签: blogread 博客导航 小钱包

    今天通过Google Reader看见一米六二的北漂生活里的一个文章,说他“一直梦想着做一个NB的不行帅到让人拉一裤子的小东西”,看完文章,突然觉得很感动,这不也是我想做的么?!

     他弄的是一个叫做“小钱包”的网站,是“一个好玩的、简单的不能再简单了的在线记账应用”的网站。应用的确是很简单,可是当你自己根据兴趣去做一件事情的时候,难道不觉得很有成就感么?这个也是我从事互联网的引子,可是这种感觉随着工作而消逝,想着不禁觉得茫茫然。

     其实很早以前,我就一直想做一个小应用,管他几个人用,自己觉得爽就行。或许发展以后就成了潮流的东西,比如Google的“friend connect”,不就一个跨网站的友情链接么?这也是两年前我已经想到的东西,哈哈,YY一下!

     今天的一切,来自昨天的努力;明天的一切,来自今天的努力。

     坚持是一种美德,我一直在想根据现有的人力物力做一个小网站,初步功能已经成型,那就是一个博客导航的网站,地址:http://www.blogread.cn/

      这个小网站说白了,一个网址导航。在这里你可以提交你喜欢的博客,记得不要忘记写上博客的标签(又名“tag”),写上标签,你可以找到与之相似的博客。现在的功能很简单,但是我会一步一步在业余时间逐步增加功能,说不定你下次来,会发现它给了你一个惊喜!

     或许你会觉得界面不太好看,这的确是个郁闷的话题。不着急,美工会一步一步好的。您觉得不爽可以下次再来看看:)

     本不想现在介绍我的博客导航,毕竟还不完善。但是看到一米六二的文章,突然有种冲动就写上以上的文字。

      做事情,是需要激情的,不然会一直拖着,直到消逝而去。

展开全文  
收起全文  
Shell进制运算错误:08: value too great for base (Linux/Unix)
发布于 2008-12-19 12:18 阅读:32501 评论:0 标签: bash shell 进制

      昨天发现一个很奇怪的bug,一个分析log的程序,一个小时产生一个log文件,文件名中含有当时的小时数以作标识,其中小时为有前导零的24 小时格式。bug是第08和09小时的log为空,甚为诧异。

      分析程序后,定位于08和09这两个数字上。程序中有一步需要对小时数进行数学运算,问题就在于此,例如:

以下是代码片段:
[root@login yayu]# echo $((08 -2))
bash: 08: value too great for base (error token is "08")

      Google了一下找到了答案:原文点这![建议新窗口打开]

      原因:

以下是代码片段:
Numbers starting with leading 0 are Octal numbers  (base 8) in many programming
languages including C, Perl and shell. Valid octal digits are
0,1,2,3,4,5,6,7 so it barfs if it sees an 8 or a 9. You probably want
to work in straight numbers and make a leading 0 in your output
format with a sprintf("%02d") kind of formatting thing.
Anything starting with 0x or 0X is a hex number.

So the error message means exactly as it says- it's an error from
the let function complaining about the value being too big for the base.

Have fun,
Stuart.

      解决方案:

以下是代码片段:
You can explicitly state the base of a number using base#number
Code:
if [ $((10#$item)) -eq 0 ] ; then
That will have trouble if the number starts with a minus sign.
The '-' needs to be in front of the base like -10#009 for -9.

      原来是进制的问题,C, Perl 和 shell中以0开头的数字是八进制了,而在运算中也是严格如此,不会做自动转化,于是就报错了。如下解决:

以下是引用片段:
[root@login shengting]# echo $((10#08 -2))
6

      纠结问题的根源,还是我的shell写得太烂了......如果命令用得好就不会遇到这个bug了,不过写得好了,又怎么会在以后避免进制导致的问题呢?到底是先有鸡还是先有蛋呢?

展开全文  
收起全文  
查看MySQL创建外键约束失败详细原因的方法 (MySQL学习)
发布于 2008-12-10 12:24 阅读:19863 评论:1 标签: 外键

      首先,目前MySQL的外键约束只适用于InnoDB数据表。

      创建外键约束时,如果把握不好,将无法创建,比如提示你:

以下是引用片段:

ERROR 1005 (HY000): Can't create table './dbname/tablename.frm' (errno: 150)

      为了查看更详细的信息,mysql提供了一个命令:

以下是引用片段:

show innodb status;

或者:

show engine innodb status;

      其中有一项“LATEST FOREIGN KEY ERROR”显示了最近的一次外键约束出错的详细信息,如:

以下是引用片段:

LATEST FOREIGN KEY ERROR
------------------------
081210 11:57:40 Error in foreign key constraint of table dbname/tablename:
foreign key (`gid`, `uid`) references `table2`(`gid`, `uid`)
) ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
for correct foreign key definition.

     提问:不知道mysql其它的错误,有没有方法得到这样的提示?

展开全文  
收起全文  
雷人的网易验证码 (随便说说)
发布于 2008-12-02 12:52 阅读:85963 评论:0 标签: 网易 验证码

      今天去注册一个网易的邮箱,可能对方出现网络繁忙或其他原因,一直就停在注册页面,IE的进度条一直停滞不前,于是又点提交了一下,结果提示email被占用了。

      想必是我的注册名已经进入了对方的数据库,但一直没返回给前端页面信息。于是转而直接登录,或许帐号信息初始化工作未完成,便提示我是选择激活3G容量邮箱或注册另一个邮箱。当然,我选择了激活,为了不给对方有垃圾数据的机会嘛。

      经过漫长的页面加载,雷人的页面出现了,偶看见了前无古人的超长验证码:

    偶一看,彻底无语了,即使是机器人恶意注册,也不能这么难为机器人啊...... 如此超长的验证码,让我连续输入了好几遍都没有成功。

    验证码,对于技术人员而言是面对恶意攻击一个无奈的选择,因为它毕竟带来了低效的用户体验。网易邮箱做出了如此雷人、牛逼的选择,想必是无可奈何到了无以复加的地步了吧:)

展开全文  
收起全文  
SYN Flood攻击、SYN Cookie防御和Linux/FreeBSD的内核参数修改 (Linux/Unix)
发布于 2008-11-28 22:30 阅读:75181 评论:0 标签: FreeBSD Linux SYN

    黑客是个令人向往、有前途的职业。我欣赏好黑客,讨厌坏黑客。所谓坏黑客,就是导致对方有人要加班的那种家伙。

    SYN Flood攻击是一种典型的拒绝服务型(Denial of Service)攻击。所谓拒绝服务型攻击就是通过进行攻击,使受害主机或网络不能够良好的提供服务,从而间接达到攻击的目的。黑客喜欢玩这个,以让对方加班而显示自己有水平、有能力、有魄力,其实呢,啥都不是。

    一:什么是SYN Flood攻击

    SYN Flood攻击利用的是IPv4中TCP协议的三次握手(Three-Way Handshake)过程进行的攻击。这个协议规定,如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN (synchronize)包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK (ACKnowledge Character)包回去,这样三次握手就结束了。

    在上述过程中,还有一些重要的概念:

    未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。或者说TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即把形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态成为半开连接(Half-open Connection)。

    Backlog参数:表示未连接队列的最大容纳数目。

    SYN-ACK 重传次数:服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。

    半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。

    在最常见的SYN Flood攻击中,攻击者在短时间内发送大量的TCP SYN包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCP SYN包分配一个特定的数据区,只要这些SYN包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这把给TCP服务器系统造成很大的系统负担,最终导致系统不能正常工作。

    二:SYN Cookie原理

    能够有效防范SYN Flood攻击的手段之一,就是SYN Cookie。SYN Cookie原理由D. J. Bernstain和 Eric Schenk发明。

    SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

    下面分Linux和FreeBSD来说说如何配置内核参数来实现SYN Cookie

    三:Linux下设置

    如果你的服务器配置不太好,TCP TIME_WAIT套接字数量达到两、三万,服务器很容易被拖死。通过修改Linux内核参数,可以减少服务器的TIME_WAIT套接字数量。

    TIME_WAIT可以通过以下命令查看:

以下是代码片段:
netstat -an | grep "TIME_WAIT" | wc -l

    在Linux下,如CentOS,可以通过修改/etc/sysctl.conf文件来达到目的。

    增加以下几行:

以下是代码片段:
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2


     说明:

  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies,这是个BOOLEAN。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用,这是个BOOLEAN。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,这是个BOOLEAN,默认为0,表示关闭。
  net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。单位为秒。
  net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。单位为秒。
  net.ipv4.ip_local_port_range = 1024    65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
  net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
  net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
  net.ipv4.tcp_synack_retries和net.ipv4.tcp_syn_retries是定义SYN重试次数。

  执行以下命令使配置生效:

以下是代码片段:
 /sbin/sysctl -p

    如果你不想修改/etc/sysctl.conf,你也可以直接使用命令修改:

以下是代码片段:
/sbin/sysctl -w key=value

    四:FreeBSD下设置

    yayu个人学习的观点:FreeBSD中对syn的防御和Linux下可能不一样,配置的参数也不完全相同,相关配置和理解可能不对:)

    TCP链接中有一个MSL(max segment lifetime)的概念,也就是最大生成时间,MSL的值在一般的实现中取30s,有些实现采用2分钟。在TCP的状态机中的“被动关闭”:从CLOSE_WAIT到LAST_ACK中有一个如下的规则:当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL。这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的 FIN)。

    存在这个规则导致一个后果就是在这个2*MSL的时间内,该地址上的链接(客户端地址、端口和服务器端的地址、端口)不能被使用。比如我们在建立一个链接后关闭链接然后迅速重启链接,那么就会出现端口不可用的情况。 

    TIME_WAIT时间是2*MSL。因此可以通过调整net.inet.tcp.msl来减少TIME_WAIT时间。对于Web服务器完全可以将这个值调整为7500或2000(访问一个web,超过4~15秒页面还刷不出来,就可以考虑放弃了-_-)

    参数设置参考:

以下是引用片段:

net.inet.tcp.syncookies=1
防止DOS攻击

net.inet.tcp.msl=7500
防止DOS攻击,默认为30000

net.inet.tcp.blackhole=2
接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包

net.inet.udp.blackhole=1
接收到一个已经关闭的端口发来的所有UDP包直接drop

    FreeBSD下,yayu没看见“/sbin/sysctl -p”这样的命令可以使/etc/sysctl.conf的内容生效,所以直接使用命令了:

以下是代码片段:
sysctl net.inet.tcp.syncookies=1 net.inet.tcp.msl=7500 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1

    五:其他

    除了修改服务器的内核参数,还可以修改apache的配置文件中的Timeout、KeepAlive、MaxClients等参数来防止Dos攻击,如果有接口调用,还要注意控制一下调用的时间。请听下文分解。

    六:总结

    我讨厌让人加班的坏黑客,不过这也促进了我的学习。

    如果哪位看见上面有不对的地方,还请留意告知,谢谢!

    七:参考文章:

以下是引用片段:

SYN Cookie原理及在Linux内核中的实现
http://www.linux-cn.com/html/linux/kernel/20070411/1630.html

减少Linux下Squid服务器的TIME_WAIT套接字数量
http://blog.s135.com/post/338.htm

TCP协议三次握手
http://www.blogjava.net/hallywang/archive/2007/03/12/103327.html

Tcp三次握手与四次挥手
http://skyyue.bokee.com/viewdiary.15883132.html

linux服务器历险之sysctl优化linux网络
http://blog.csdn.net/chinalinuxzend/archive/2007/09/20/1792184.aspx

中国最完整的sysctl.conf优化方案
http://www.bsdlover.cn/html/38/n-138.html

Linux 反 DDOS的几个设置
http://www.pgsqldb.org/mwiki/index.php/Linux_%E5%8F%8D_DDOS%E7%9A%84%E5%87%A0%E4%B8%AA%E8%AE%BE%E7%BD%AE

FreeBSD系统优化部分内核参数调整中文注释
http://fanqiang.chinaunix.net/system/bsd/2005-04-06/3101.shtml

linux系统优化sysctl
http://bbs.linuxsky.org/thread-7161-1-1.html

SYN,ACK的英文全拼是什么?
http://ks.cn.yahoo.com/question/1407072302504.html

展开全文  
收起全文