<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GzV8.com</title>
	<atom:link href="http://www.gzv8.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.gzv8.com</link>
	<description>互联网引擎</description>
	<lastBuildDate>Thu, 06 Jan 2011 04:08:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MariaDB VS MySQL 性能小测。</title>
		<link>http://www.gzv8.com/archives/378</link>
		<comments>http://www.gzv8.com/archives/378#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:08:28 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=378</guid>
		<description><![CDATA[我使用的是 MySQL 自带的性能测试工具 mysqlslap，200 并发，25次循环，
运行5次取平均数值所得。
测试数据库所用的版本是 MariaDB 5.2.0 Beta &#38; MySQL 5.1.36 使用相同的 my.ini 配置
下边是测试结果：
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 36.261 seconds
Minimum number of seconds to run all queries: 36.162 seconds
Maximum number of seconds to run all queries: 36.336 seconds
以上是 MariaDB  ，MyISAM 引擎的测试结果
Benchmark
Running for engine myisam
Average number of seconds to run [...]]]></description>
			<content:encoded><![CDATA[<p>我使用的是 MySQL 自带的性能测试工具 mysqlslap，200 并发，25次循环，<br />
运行5次取平均数值所得。</p>
<p>测试数据库所用的版本是 MariaDB 5.2.0 Beta &amp; MySQL 5.1.36 使用相同的 my.ini 配置</p>
<p>下边是测试结果：</p>
<p>Benchmark<br />
Running for engine myisam<br />
Average number of seconds to run all queries: 36.261 seconds<br />
Minimum number of seconds to run all queries: 36.162 seconds<br />
Maximum number of seconds to run all queries: 36.336 seconds</p>
<p>以上是 MariaDB  ，MyISAM 引擎的测试结果</p>
<p>Benchmark<br />
Running for engine myisam<br />
Average number of seconds to run all queries: 35.774 seconds<br />
Minimum number of seconds to run all queries: 35.438 seconds<br />
Maximum number of seconds to run all queries: 36.130 seconds<br />
Number of clients running queries: 200<br />
Average number of queries per client: 25</p>
<p>以上是 MySQL  ，MyISAM 引擎的测试结果<br />
MariaDB 与 MySQL 在 MyISAM 引擎的性能上存在差别，MySql 快了一个小身位。<br />
InnoDB 的情况也一样麽？</p>
<p>Benchmark<br />
Running for engine innodb<br />
Average number of seconds to run all queries: 36.113 seconds<br />
Minimum number of seconds to run all queries: 36.025 seconds<br />
Maximum number of seconds to run all queries: 36.233 seconds<br />
Number of clients running queries: 200<br />
Average number of queries per client: 25</p>
<p>以上是 MariaDB  ，InnoDB 引擎的测试结果</p>
<p>Benchmark<br />
Running for engine innodb<br />
Average number of seconds to run all queries: 36.412 seconds<br />
Minimum number of seconds to run all queries: 36.208 seconds<br />
Maximum number of seconds to run all queries: 36.663 seconds<br />
Number of clients running queries: 200<br />
Average number of queries per client: 25</p>
<p>以上是 MySQL  ，InnoDB 引擎的测试结果<br />
测试所得，使用 InnoDB 引擎时，情况就扭转了，MariaDB 要比 MySQL 快上了好几毫秒。<br />
看来2位虽然同宗同源，但所侧重的方面不不一样啊。<br />
将继续留意他们的发展。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/378/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>怎么设置linux时区</title>
		<link>http://www.gzv8.com/archives/375</link>
		<comments>http://www.gzv8.com/archives/375#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:05:35 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Linux & Unix]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=375</guid>
		<description><![CDATA[Local vs. UTC
首先重要的问题是你使用utc还是local time.
UTC(Universal Time Coordinated)=GMT(Greenwich Mean Time)
Local time 是你手表上的时间
传统的POSIX计算机(Solaris,bsd,unix)使用UTC格式
linux可以处理UTC时间和蹩脚的Windows所使用的local time
到底是使用UTC还是local time可以这样来确定：
如果机器上同时安装有Linux和Windows，建议使用local time
如果机器上只安装有Linux，建议使用utc
确定后编辑/etc/sysconfig/clock, UTC=0 是local time; UTC=1 是UTC(GMT)
确定timezone
运行tzselect,回答问题后会告诉你时区的名称，比如&#8221;Asia/Shanghai&#8221;,把他记下来(后面我用$timezone代替)
设定timezone
# cp /usr/share/zoneinfo/$timezone /etc/localtime
重新启动或者运行时钟设置脚本使之发生作用
版本差异
由于发行版的差异，以上文件位置可能不同。
一般设置时钟所使用的启动脚本为/etc/rc.d/init.d/setclock
redhat是在/etc/rc.d/rc.sysinit中设置时钟，所以一般要重新启动
]]></description>
			<content:encoded><![CDATA[<p>Local vs. UTC<br />
首先重要的问题是你使用utc还是local time.<br />
UTC(Universal Time Coordinated)=GMT(Greenwich Mean Time)<br />
Local time 是你手表上的时间</p>
<p>传统的POSIX计算机(Solaris,bsd,unix)使用UTC格式<br />
linux可以处理UTC时间和蹩脚的Windows所使用的local time</p>
<p>到底是使用UTC还是local time可以这样来确定：<br />
如果机器上同时安装有Linux和Windows，建议使用local time<br />
如果机器上只安装有Linux，建议使用utc<br />
确定后编辑/etc/sysconfig/clock, UTC=0 是local time; UTC=1 是UTC(GMT)</p>
<p>确定timezone<br />
运行tzselect,回答问题后会告诉你时区的名称，比如&#8221;Asia/Shanghai&#8221;,把他记下来(后面我用$timezone代替)</p>
<p>设定timezone<br />
# cp /usr/share/zoneinfo/$timezone /etc/localtime</p>
<p>重新启动或者运行时钟设置脚本使之发生作用</p>
<p>版本差异<br />
由于发行版的差异，以上文件位置可能不同。<br />
一般设置时钟所使用的启动脚本为/etc/rc.d/init.d/setclock<br />
redhat是在/etc/rc.d/rc.sysinit中设置时钟，所以一般要重新启动</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/375/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CST 时区问题</title>
		<link>http://www.gzv8.com/archives/373</link>
		<comments>http://www.gzv8.com/archives/373#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:04:55 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Linux & Unix]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=373</guid>
		<description><![CDATA[在很多unix下用date命令都能看到当前的时区。很多unix下中国时区都是用CST表示的。但是这个表示方法非常不合理。因为CST同时代表了下面4个时区。
CST Central Standard Time (USA) UT-6:00
CST Central Standard Time (Australia) UT+9:30
CST China Standard Time UT+8:00
CST Cuba Standard Time UT-4:00
在unix下通过/etc/localtime这个硬连接指向的/usr/share/zoneinfo下的时区文件表示当前的真正时区。比如 /etc/localtime指向了/usr/share/zoneinfo/Asia/Shanghai这个文件的时候，CST就代表了中国标准时间。
但是很多语言的时间函数库根本不做这个判断，往往就是用一个独立的时区配置文件做时区关键字和GMT的转换。因此很多系统里面CST都变成了GMT-6，也就是美国中部时间。
在zope里面也是如此。而且很奇怪的是有的地方做了正确的判断，有的地方没做正确判断。
比如文件的最后修改时间就是错的，但是如果对一个页面做comment的时候，comment时间就是正确的。
修改Zope中DateTime\DateTime.py的定义为：&#8217;cst&#8217;:'GMT+8&#8242;，就能够解决这个问题。
但是这样做就需要改代码，然后重新编译。
我试着在zope的启动脚本里面加上TZ的环境变量设置，但是没有效果。我想，最根本的解决方法应该是改变unix服务器的时区设置方法吧。
]]></description>
			<content:encoded><![CDATA[<p>在很多unix下用date命令都能看到当前的时区。很多unix下中国时区都是用CST表示的。但是这个表示方法非常不合理。因为CST同时代表了下面4个时区。</p>
<p>CST Central Standard Time (USA) UT-6:00<br />
CST Central Standard Time (Australia) UT+9:30<br />
CST China Standard Time UT+8:00<br />
CST Cuba Standard Time UT-4:00</p>
<p>在unix下通过/etc/localtime这个硬连接指向的/usr/share/zoneinfo下的时区文件表示当前的真正时区。比如 /etc/localtime指向了/usr/share/zoneinfo/Asia/Shanghai这个文件的时候，CST就代表了中国标准时间。</p>
<p>但是很多语言的时间函数库根本不做这个判断，往往就是用一个独立的时区配置文件做时区关键字和GMT的转换。因此很多系统里面CST都变成了GMT-6，也就是美国中部时间。</p>
<p>在zope里面也是如此。而且很奇怪的是有的地方做了正确的判断，有的地方没做正确判断。</p>
<p>比如文件的最后修改时间就是错的，但是如果对一个页面做comment的时候，comment时间就是正确的。</p>
<p>修改Zope中DateTime\DateTime.py的定义为：&#8217;cst&#8217;:'GMT+8&#8242;，就能够解决这个问题。</p>
<p>但是这样做就需要改代码，然后重新编译。</p>
<p>我试着在zope的启动脚本里面加上TZ的环境变量设置，但是没有效果。我想，最根本的解决方法应该是改变unix服务器的时区设置方法吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/373/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的服务器攻击别人了！！ (已解决，把肉鸡抓住了！)</title>
		<link>http://www.gzv8.com/archives/370</link>
		<comments>http://www.gzv8.com/archives/370#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:02:39 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Linux & Unix]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=370</guid>
		<description><![CDATA[在星期五的时候，上着上着，突然页面打开相当慢。
原本以为是网络问题，没大留意。但频繁出现数次，还居然一直持续。
在Cacti中查看，网卡占用居然达到机房百兆宽带的所有，12m/s
查看网卡的实时流量，得到了相同结果。
而且 CPU 也有点不正常，用 Top 命令查看，占用最高的是 Httpd 进程。即 Apache
原以为是受到了页面攻击，但这样在进程里头出现的，还应该有 Nginx 跟 Mysql 才对。
不会就这么孤独地只有 Apache。
正在我继续查找原因，攻击停下来了，网卡流量恢复正常。
查看了所有的 WEB 访问日志，无一是有能够解释到该现状的记录。
因为如果是 页面攻击，就好比是压力测试般，肯定会有某个或几个地址有重复不断的垃圾请求。
但日志上显示得相当悠然。
好了，没过多久，流量又来了！httpd 进程把 2个 cpu核心占用到 100%
网卡冲到 12m/s
使用网络命令 netstat -ant 查看，没有 DDOS 之类攻击所产生的 wait 。
而且链接IP还越来越少，这时候从本地 Ping 服务器的响应基本上是 timeout 了
一但把 Apache 停下来，流量就会消失。再次启动！没过多久又会再来。
为了知道到底是哪个 IP 令我产生这样的事，我安装了既时流量检测工具 iftop
iftop介绍详见：http://www.oschina.net/p/iftop
经检测，传输量最大的 IP 是 60.219.100.3 这个IP，直接访问能打开到网站。
使用 IPtables 命令禁止该IP访问本机！！无效，流量继续！
哟？？？？！！ 再次使用 IPtables 命令禁止本机访问该IP ！！！这下流量终于停了。
哟！！这事情就明白多了，绝对能断点我的服务器成为了肉鸡，受到操控对特定目标进行了攻击。
而进行攻击的木马，不是啥米东西，而是 PHP 程序！
应该是在服务器里头某个虚拟主机网站有漏洞，被放入了 PHP DDOS 攻击木马！
然而，剩下的问题就更加复杂了，如何在海量文件的目录里头找到那个木马？
希望是有一个杀毒程序能帮我扫描到&#8230;.但我还没能找到这个，如果网友们有的不妨推荐推荐。
我的思路是，开启 Apache 的 Server [...]]]></description>
			<content:encoded><![CDATA[<p>在星期五的时候，上着上着，突然页面打开相当慢。</p>
<p>原本以为是网络问题，没大留意。但频繁出现数次，还居然一直持续。</p>
<p>在Cacti中查看，网卡占用居然达到机房百兆宽带的所有，12m/s</p>
<p>查看网卡的实时流量，得到了相同结果。</p>
<p>而且 CPU 也有点不正常，用 Top 命令查看，占用最高的是 Httpd 进程。即 Apache</p>
<p>原以为是受到了页面攻击，但这样在进程里头出现的，还应该有 Nginx 跟 Mysql 才对。</p>
<p>不会就这么孤独地只有 Apache。</p>
<p>正在我继续查找原因，攻击停下来了，网卡流量恢复正常。</p>
<p>查看了所有的 WEB 访问日志，无一是有能够解释到该现状的记录。</p>
<p>因为如果是 页面攻击，就好比是压力测试般，肯定会有某个或几个地址有重复不断的垃圾请求。</p>
<p>但日志上显示得相当悠然。</p>
<p>好了，没过多久，流量又来了！httpd 进程把 2个 cpu核心占用到 100%</p>
<p>网卡冲到 12m/s</p>
<p>使用网络命令 netstat -ant 查看，没有 DDOS 之类攻击所产生的 wait 。</p>
<p>而且链接IP还越来越少，这时候从本地 Ping 服务器的响应基本上是 timeout 了</p>
<p>一但把 Apache 停下来，流量就会消失。再次启动！没过多久又会再来。</p>
<p>为了知道到底是哪个 IP 令我产生这样的事，我安装了既时流量检测工具 iftop</p>
<p>iftop介绍详见：<a href="http://www.oschina.net/p/iftop">http://www.oschina.net/p/iftop</a></p>
<p>经检测，传输量最大的 IP 是 60.219.100.3 这个IP，直接访问能打开到网站。</p>
<p>使用 IPtables 命令禁止该IP访问本机！！无效，流量继续！</p>
<p>哟？？？？！！ 再次使用 IPtables 命令禁止本机访问该IP ！！！这下流量终于停了。</p>
<p>哟！！这事情就明白多了，绝对能断点我的服务器成为了肉鸡，受到操控对特定目标进行了攻击。</p>
<p>而进行攻击的木马，不是啥米东西，而是 PHP 程序！</p>
<p>应该是在服务器里头某个虚拟主机网站有漏洞，被放入了 PHP DDOS 攻击木马！</p>
<p>然而，剩下的问题就更加复杂了，如何在海量文件的目录里头找到那个木马？</p>
<p>希望是有一个杀毒程序能帮我扫描到&#8230;.但我还没能找到这个，如果网友们有的不妨推荐推荐。</p>
<p>我的思路是，开启 Apache 的 Server Status。 这家伙能实时查看到 Apache 正在执行那个程序。</p>
<p>而且详细到执行时间，输出数据量等等&#8230;</p>
<p>详细可见：<a href="http://www.oschina.net/bbs/thread/12650">http://www.oschina.net/bbs/thread/12650</a></p>
<p>好了！这下我就可以坐着等兔子再次跑上门来！</p>
<p>还有一个方法，就是把 PHP safe_mod 打开，能禁用掉一些例如 调用 系统 Shell 参数的语法。</p>
<p>来导致木马无法执行。可以我倒还真想把这兔子抓住，所以现在在等待中&#8230;</p>
<p>####################</p>
<p>2010-11-9 更新</p>
<p>####################</p>
<p>PHP safe_mod 不能随意打开！期中一个副作用就是导致 Cacti 无法调用 rrdtools 等参数。</p>
<p>就算设置了例外目录也无效！</p>
<p>最后我在 Apache，PHP 上都配置了 php_admin_value open_basedir 选项。</p>
<p>使得虚拟主机的用户无法越权访问到所属目录外的文件，当然也包括 shell 命令了。</p>
<p>但无效，黑客依然能利用暗藏在目录里头的肉鸡程序发动攻击。</p>
<p>虽然攻击事件在凌晨或者早上！！虽然我没在电脑旁！！</p>
<p>但我使用了 curl 对 ApacheStatus 页面的定时抓取作为了日志！！</p>
<p>与 Cacti 配合，一发现高流量！就追索该时间的日志！！</p>
<p>哈哈！这下子被逮个正着！！！！！</p>
<p>以下是 ApacheStatus 的截图，Req 项特别高的！就是 PHP肉鸡程序送发送的  UDP 攻击数据包。</p>
<p><a href="http://www.oschina.net/uploads/bbs/2010/1109/175859_xwAY_17.jpg" target="_blank"><img src="http://www.oschina.net/uploads/bbs/2010/1109/175859_xwAY_17.jpg" alt="" /></a></p>
<p>在此也顺便公布攻击来源，辽宁省盘锦市 联通 119.115.80.102 但也有可能是一台跳板肉鸡。</p>
<p>至此，我服务器上存在漏洞的网站被暂时关闭了，经查看文件修改日期，黑客还放了不少后门程序。</p>
<p>看了得好好清除清除才能再次上线了。</p>
<p>而抓到的肉鸡！用 VI 打开，居然是使用 Zend 加密的！！</p>
<p>有没朋友对加密这东西有办法解决的，短信我，我给你发去研究研究。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/370/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Zlib (GZIP) 压缩优化开启配置</title>
		<link>http://www.gzv8.com/archives/368</link>
		<comments>http://www.gzv8.com/archives/368#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:01:28 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=368</guid>
		<description><![CDATA[GZIP 的实现有好多种方法。包括有
1，Nginx 的 GZIP 配置
2，Apache 的 mod_deflate.so  模块
3，各种 PHP 程序中通过 PHP自身 实现压缩。
等等&#8230;
期中使用 PHP 自身也有2种实现方法，一种是开启zlib.output_compression，一种是 ob_gzhandler编码
在默认情况下，zlib.output_compression是关闭的，如需开启需编辑php.ini文件，找到以下选项并开启：
zlib.output_compression = On
zlib.output_compression_level = 6
完成后可以通过phpinfo()函数检测结果，当zlib.output_compression的Local Value和MasterValue的值同为On时，表示已经生效，这时候访问的PHP页面（包括伪静态页面）已经GZIP压缩了，通过Firebug或者在线网页GZIP压缩检测工具可检测到压缩的效果。
但如果需要使用ob_gzhandler(默认)，则需关闭zlib.output_compression(2个同时开启会出乱子)，把php.ini文件内容更改为：
zlib.output_compression = Off
zlib.output_compression_level = -1
ob_gzhandler是多数程序(discuz,phpwind等)推荐的用法
]]></description>
			<content:encoded><![CDATA[<p>GZIP 的实现有好多种方法。包括有</p>
<p>1，Nginx 的 GZIP 配置</p>
<p>2，Apache 的 mod_deflate.so  模块</p>
<p>3，各种 PHP 程序中通过 PHP自身 实现压缩。</p>
<p>等等&#8230;</p>
<p>期中使用 PHP 自身也有2种实现方法，一种是开启zlib.output_compression，一种是 ob_gzhandler编码</p>
<p>在默认情况下，zlib.output_compression是关闭的，如需开启需编辑php.ini文件，找到以下选项并开启：</p>
<p>zlib.output_compression = On<br />
zlib.output_compression_level = 6</p>
<p>完成后可以通过phpinfo()函数检测结果，当zlib.output_compression的Local Value和MasterValue的值同为On时，表示已经生效，这时候访问的PHP页面（包括伪静态页面）已经GZIP压缩了，通过Firebug或者<a href="http://tool.chinaz.com/Gzips/Default.aspx">在线网页GZIP压缩检测工具</a>可检测到压缩的效果。</p>
<p>但如果需要使用ob_gzhandler(默认)，则需关闭zlib.output_compression(2个同时开启会出乱子)，把php.ini文件内容更改为：</p>
<p>zlib.output_compression = Off<br />
zlib.output_compression_level = -1</p>
<p>ob_gzhandler是多数程序(discuz,phpwind等)推荐的用法</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/368/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx 目录中的off文件增大原因</title>
		<link>http://www.gzv8.com/archives/366</link>
		<comments>http://www.gzv8.com/archives/366#comments</comments>
		<pubDate>Thu, 06 Jan 2011 04:00:57 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Nginx]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=366</guid>
		<description><![CDATA[在 Nginx 的根目录，有个 off 的文件！(有的是 on)！
注意error_log off并不能关闭日志记录功能，它将日志文件写入一个文件名为off的文件中，如果你想关闭错误日志记录功能，应使用以下配置：
error_log /dev/null crit;
]]></description>
			<content:encoded><![CDATA[<p>在 Nginx 的根目录，有个 off 的文件！(有的是 on)！</p>
<p>注意error_log off并不能关闭日志记录功能，它将日志文件写入一个文件名为off的文件中，如果你想关闭错误日志记录功能，应使用以下配置：</p>
<pre>error_log /dev/null crit;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/366/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开启Apache Server Status</title>
		<link>http://www.gzv8.com/archives/363</link>
		<comments>http://www.gzv8.com/archives/363#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:59:09 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Apache]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=363</guid>
		<description><![CDATA[


Apache的日志又多又杂，如果靠分析日志或者查看服务器进程来监视Apache运行状态的话，比较繁冗。其实在Apache 1.3.2及以后的版本中就自带一个查看Apache状态的功能模块server-status
打开Apache Server Status如果你的Apache配置文件httpd.conf或者extra/httpd-info.conf中有LoadModule status_module modules/mod_status.so话，说明你的Apache已经加载了此模块；或者编译的时候加上了–enable-module=so也表明服务器支持server-status。
如果Apache没有加载这个模块，如果是linux服务器，就得重新编译Apache，加上–enable-module=so参数即可；如果你是windows系统的话，无需任何编译，只要把刚才时候说的LoadModule status_module modules/mod_status.so这句加上，如果前面有带#号，开启的话，需要将#去除。
 
配置Apache Server Status

&#60;location /ccvita-server-status&#62; SetHandler server-status Order Deny,Allow Deny from all Allow from www.ccvita.com&#60;/location&#62;ExtendedStatus On


这是一个完整的server-status的配置。第一行的ccvita-server-status表示以后可以用类似http://www.ccvita.com/ccvita-server-status来访问，同时http://www.ccvita.com/ccvita-server-status?refresh=N将表示访问状态页面可以每N秒自动刷新一次；Deny from表示禁止的访问地址；Allow from表示允许的地址访问；ExtendedStatus On表示的是待会访问的时候能看到详细的请求信息，另外该设置仅能用于全局设置，不能在特定的虚拟主机中打开或关闭。启用扩展状态信息将会导致服务器运行效率降低。



]]></description>
			<content:encoded><![CDATA[<div>
<div>
<div id="_mcePaste"><span style="font-family: 微软雅黑, Verdana, Simsun, sans-serif; line-height: 22px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"></p>
<p style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-indent: 0em; padding: 0px;">Apache的日志又多又杂，如果靠分析日志或者查看服务器进程来监视Apache运行状态的话，比较繁冗。其实在Apache 1.3.2及以后的版本中就自带一个查看Apache状态的功能模块server-status</p>
<p style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-indent: 0em; padding: 0px;"><strong style="padding: 0px; margin: 0px;">打开Apache Server Status</strong><br style="padding: 0px; margin: 0px;" />如果你的Apache配置文件httpd.conf或者extra/httpd-info.conf中有LoadModule status_module modules/mod_status.so话，说明你的Apache已经加载了此模块；或者编译的时候加上了–enable-module=so也表明服务器支持server-status。</p>
<p style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-indent: 0em; padding: 0px;">如果Apache没有加载这个模块，如果是linux服务器，就得重新编译Apache，加上–enable-module=so参数即可；如果你是windows系统的话，无需任何编译，只要把刚才时候说的LoadModule status_module modules/mod_status.so这句加上，如果前面有带#号，开启的话，需要将#去除。</p>
<p style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-indent: 0em; padding: 0px;"><span id="more-333" style="padding: 0px; margin: 0px;"> </span></p>
<p style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-indent: 0em; padding: 0px;"><strong style="padding: 0px; margin: 0px;">配置Apache Server Status</strong></p>
<div class="hl-surround" style="padding: 0px; margin: 0px;">
<div class="hl-main" style="padding: 0px; margin: 0px;">&lt;location /ccvita-server-status&gt;<br style="padding: 0px; margin: 0px;" /> SetHandler server-status<br style="padding: 0px; margin: 0px;" /> Order Deny,Allow<br style="padding: 0px; margin: 0px;" /> Deny from all<br style="padding: 0px; margin: 0px;" /> Allow from www.ccvita.com<br style="padding: 0px; margin: 0px;" />&lt;/location&gt;<br style="padding: 0px; margin: 0px;" />ExtendedStatus On</div>
<div class="hl-main" style="padding: 0px; margin: 0px;"></div>
</div>
<p style="margin-top: 5px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; text-indent: 0em; padding: 0px;">这是一个完整的server-status的配置。<br style="padding: 0px; margin: 0px;" />第一行的ccvita-server-status表示以后可以用类似http://www.ccvita.com/ccvita-server-status来访问，同时<br style="padding: 0px; margin: 0px;" />http://www.ccvita.com/ccvita-server-status?refresh=N将表示访问状态页面可以每N秒自动刷新一次；<br style="padding: 0px; margin: 0px;" />Deny from表示禁止的访问地址；<br style="padding: 0px; margin: 0px;" />Allow from表示允许的地址访问；<br style="padding: 0px; margin: 0px;" />ExtendedStatus On表示的是待会访问的时候能看到详细的请求信息，另外该设置仅能用于全局设置，不能在特定的虚拟主机中打开或关闭。启用扩展状态信息将会导致服务器运行效率降低。</p>
<p></span></div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/363/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP服务器端特性的配置加强PHP的安全</title>
		<link>http://www.gzv8.com/archives/361</link>
		<comments>http://www.gzv8.com/archives/361#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:58:25 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=361</guid>
		<description><![CDATA[通过对php一些服务器端特性的配置加强php的安全
前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题，以及如何通过应用程序漏洞突破系统，这篇文章我们来通过对php的一些服务器端特性来进行配置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题，对用户输入进行严格的过滤，但是常在岸边走哪有不湿鞋，吃烧饼哪有不掉芝麻，人有失蹄马有失手，连著名的phpnuke、phpMyAdmin等程序都出现过很严重的问题，更何况象我等小混混写的脚本。所以现在我们假设php脚本已经出现严重问题，比如象前一阵子 phpnuke的可以上传php脚本的大问题了，我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。
1、编译的时候注意补上已知的漏洞
从4.0.5开始，php的mail函数加入了第五个参数，但它没有好好过滤，使得php应用程序能突破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源码包里ext/standard/mail.c文件，禁止mail函数的第五参数或过滤shell字符。在mail.c文件的第152行，也就是下面这行：
if (extra_cmd != NULL) {
后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php那么我们就修补了这个漏洞。
2、修改php.ini配置文件
以php发行版的php.ini-dist为蓝本进行修改。
1)Error handling and logging
在Error handling and logging部分可以做一些设定。先找到：
display_errors = On
php缺省是打开错误信息显示的，我们把它改为：
display_errors = Off
关闭错误显示后，php函数执行错误的信息将不会再显示给用户，这样能在一定程度上防止攻击者从错误信息得知脚本的物理位置，以及一些其它有用的信息，起码给攻击者的黑箱检测造成一定的障碍。这些错误信息可能对我们自己有用，可以让它写到指定文件中去，那么修改以下：
log_errors = Off
改为：
log_errors = On
以及指定文件，找到下面这行：
;error_log = filename
去掉前面的;注释，把filename改为指定文件，如/usr/local/apache/logs/php_error.log
error_log = /usr/local/apache/logs/php_error.log
这样所有的错误都会写到php_error.log文件里。
2)Safe Mode
php的safe_mode功能对很多函数进行了限制或禁用了，能在很大程度解决php的安全问题。在Safe Mode部分找到：
safe_mode = Off
改为：
safe_mode = On
这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和&#8220;被禁止，其它的一些执行函数如：exec(), system(), passthru(), popen()将被限制只能执行safe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序，找到以下：
safe_mode_exec_dir =
指定要执行的程序的路径，如：
safe_mode_exec_dir = /usr/local/php/exec
然后把要用的程序拷到/usr/local/php/exec目录下，这样，象上面的被限制的函数还能执行该目录里的程序。
关于安全模式下受限函数的详细信息请查看php主站的说明：
http://www.php.net/manual/en/features.safe-mode.php ;
3)disable_functions
如果你对一些函数的危害性不太清楚，而且也没有使用，索性把这些函数禁止了。找到下面这行：
disable_functions =
在”=“后面加上要禁止的函数，多个函数用”,“隔开。
3、修改httpd.conf
如果你只允许你的php脚本程序在web目录里操作，还可以修改httpd.conf文件限制php的操作路径。比如你的web目录是/usr/local/apache/htdocs，那么在httpd.conf里加上这么几行：
&#60;Directory /usr/local/apache/htdocs&#62;
php_admin_value open_basedir /usr/local/apache/htdocs
&#60;/Directory&#62;
这样，如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许，如果错误显示打开的话会提示这样的错误：
Warning: open_basedir restriction in effect. File is in wrong directory in
/usr/local/apache/htdocs/open.php on [...]]]></description>
			<content:encoded><![CDATA[<p>通过对php一些服务器端特性的配置加强php的安全</p>
<p>前面象Shaun Clowes和rfp等都比较详细的介绍了php、cgi程序在编程过程中遇到的问题，以及如何通过应用程序漏洞突破系统，这篇文章我们来通过对php的一些服务器端特性来进行配置加强php的安全。写cgi脚本的时候我们的确一定注意各种安全问题，对用户输入进行严格的过滤，但是常在岸边走哪有不湿鞋，吃烧饼哪有不掉芝麻，人有失蹄马有失手，连著名的phpnuke、phpMyAdmin等程序都出现过很严重的问题，更何况象我等小混混写的脚本。所以现在我们假设php脚本已经出现严重问题，比如象前一阵子 phpnuke的可以上传php脚本的大问题了，我们如何通过对服务器的配置使脚本出现如此问题也不能突破系统。</p>
<p><strong>1、编译的时候注意补上已知的漏洞</strong></p>
<p>从4.0.5开始，php的mail函数加入了第五个参数，但它没有好好过滤，使得php应用程序能突破safe_mode的限制而去执行命令。所以使用4.0.5和4.0.6的时候在编译前我们需要修改php源码包里ext/standard/mail.c文件，禁止mail函数的第五参数或过滤shell字符。在mail.c文件的第152行，也就是下面这行：</p>
<p>if (extra_cmd != NULL) {</p>
<p>后面加上extra_cmd=NULL;或extra_cmd = php_escape_shell_cmd(extra_cmd);然后编译php那么我们就修补了这个漏洞。</p>
<p><strong>2、修改php.ini配置文件</strong></p>
<p>以php发行版的php.ini-dist为蓝本进行修改。</p>
<p>1)Error handling and logging</p>
<p>在Error handling and logging部分可以做一些设定。先找到：</p>
<p>display_errors = On</p>
<p>php缺省是打开错误信息显示的，我们把它改为：</p>
<p>display_errors = Off</p>
<p>关闭错误显示后，php函数执行错误的信息将不会再显示给用户，这样能在一定程度上防止攻击者从错误信息得知脚本的物理位置，以及一些其它有用的信息，起码给攻击者的黑箱检测造成一定的障碍。这些错误信息可能对我们自己有用，可以让它写到指定文件中去，那么修改以下：</p>
<p>log_errors = Off</p>
<p>改为：</p>
<p>log_errors = On</p>
<p>以及指定文件，找到下面这行：</p>
<p>;error_log = filename</p>
<p>去掉前面的;注释，把filename改为指定文件，如/usr/local/apache/logs/php_error.log</p>
<p>error_log = /usr/local/apache/logs/php_error.log</p>
<p>这样所有的错误都会写到php_error.log文件里。</p>
<p>2)Safe Mode</p>
<p>php的safe_mode功能对很多函数进行了限制或禁用了，能在很大程度解决php的安全问题。在Safe Mode部分找到：</p>
<p>safe_mode = Off</p>
<p>改为：</p>
<p>safe_mode = On</p>
<p>这样就打开了safe_mode功能。象一些能执行系统命令的函数shell_exec()和&#8220;被禁止，其它的一些执行函数如：exec(), system(), passthru(), popen()将被限制只能执行safe_mode_exec_dir指定目录下的程序。如果你实在是要执行一些命令或程序，找到以下：</p>
<p>safe_mode_exec_dir =</p>
<p>指定要执行的程序的路径，如：</p>
<p>safe_mode_exec_dir = /usr/local/php/exec</p>
<p>然后把要用的程序拷到/usr/local/php/exec目录下，这样，象上面的被限制的函数还能执行该目录里的程序。</p>
<p>关于安全模式下受限函数的详细信息请查看php主站的说明：</p>
<p><a href="http://www.php.net/manual/en/features.safe-mode.php">http://www.php.net/manual/en/features.safe-mode.php</a> ;</p>
<p>3)disable_functions</p>
<p>如果你对一些函数的危害性不太清楚，而且也没有使用，索性把这些函数禁止了。找到下面这行：</p>
<p>disable_functions =</p>
<p>在”=“后面加上要禁止的函数，多个函数用”,“隔开。</p>
<p><strong>3、修改httpd.conf</strong></p>
<p>如果你只允许你的php脚本程序在web目录里操作，还可以修改httpd.conf文件限制php的操作路径。比如你的web目录是/usr/local/apache/htdocs，那么在httpd.conf里加上这么几行：</p>
<p>&lt;Directory /usr/local/apache/htdocs&gt;</p>
<p>php_admin_value open_basedir /usr/local/apache/htdocs</p>
<p>&lt;/Directory&gt;</p>
<p>这样，如果脚本要读取/usr/local/apache/htdocs以外的文件将不会被允许，如果错误显示打开的话会提示这样的错误：</p>
<p>Warning: open_basedir restriction in effect. File is in wrong directory in</p>
<p>/usr/local/apache/htdocs/open.php on line 4 等等。</p>
<p><strong>4、对php代码进行编译</strong></p>
<p>Zend对php的贡献很大，php4的引擎就是用Zend的，而且它还开发了ZendOptimizer和ZendEncode等许多php的加强组件。优化器ZendOptimizer只需<a href="http://www.zend.com/">http://www.zend.com</a>注册就可以免费得到，下面几个是用于4.0.5和4.0.6的ZendOptimizer，文件名分别对于各自的系统：</p>
<p>ZendOptimizer-1.1.0-PHP_4.0.5-FreeBSD4.0-i386.tar.gz</p>
<p>ZendOptimizer-1.1.0-PHP_4.0.5-Linux_glibc21-i386.tar.gz</p>
<p>ZendOptimizer-1.1.0-PHP_4.0.5-Solaris-sparc.tar.gz</p>
<p>ZendOptimizer-1.1.0-PHP_4.0.5-Windows-i386.zip</p>
<p>优化器的安装非常方便，包里面都有详细的说明。以UNIX版本的为例，看清操作系统，把包里的ZendOptimizer.so文件解压到一个目录，假设是/usr/local/lib下，在php.ini里加上两句：</p>
<p>zend_optimizer.optimization_level=15</p>
<p>zend_extension=&#8221;/usr/local/lib/ZendOptimizer.so&#8221; 就可以了。用phpinfo()看到Zend图标左边有下面文字：</p>
<p>with Zend Optimizer v1.1.0, Copyright (c) 1998-2000, by Zend Technologies</p>
<p>那么，优化器已经挂接成功了。</p>
<p>但是编译器ZendEncode并不是免费的，这里提供给大家一<a href="http://www.phpease.com/">http://www.PHPease.com</a>的马勇设计的 编译器外壳，如果用于商业目的，请<a href="http://www.zend.com/">http://www.zend.com</a>联系取得许可协议。</p>
<p>php脚本编译后，脚本的执行速度增加不少，脚本文件只能看到一堆乱码，这将阻止攻击者进一步分析服</p>
<p>务器上的脚本程序，而且原先在php脚本里以明文存储的口令也得到了保密，如mysql的口令。不过在服务器端改脚本就比较麻烦了，还是本地改好再上传吧。</p>
<p><strong>5、文件及目录的权限设置</strong></p>
<p>web目录里除了上传目录，其它的目录和文件的权限一定不能让nobody用户有写权限。否则，攻击者可以修改主页文件，所以web目录的权限一定要设置好。</p>
<p>还有，php脚本的属主千万不能是root，因为safe_mode下读文件的函数被限制成被读文件的属主必须和当前执行脚本的属主是一样才能被读，否则如果错误显示打开的话会显示诸如以下的错误：</p>
<p>Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not</p>
<p>allowed to access /etc/passwd owned by uid 0 in /usr/local/apache/htdocs/open.php</p>
<p>on line 3</p>
<p>这样我们能防止许多系统文件被读，比如：/etc/passwd等。</p>
<p>上传目录和上传脚本的属主也要设成一样，否则会出现错误的，在safe_mode下这些要注意。</p>
<p><strong>6、mysql的启动权限设置</strong></p>
<p>mysql要注意的是不要用root来启动，最好另外建一个mysqladm用户。可以在/etc/rc.local等系统启动脚本里加上一句：</p>
<p>su mysqladm -c &#8220;/usr/local/mysql/share/mysql/mysql.server start&#8221;</p>
<p>这样系统重启后，也会自动用mysqladmin用户启动mysql进程。</p>
<p><strong>7、日志文件及上传目录的审核及</strong></p>
<p>查看日志和人的惰性有很大关系，要从那么大的日志文件里查找攻击痕迹有些大海捞针，而且也未必有。</p>
<p>web上传的目录里的文件，也应该经常检查，也许程序有问题，用户传上了一些非法的文件，比如执行脚本等。</p>
<p><strong>8、操作系统自身的补丁</strong></p>
<p>一样，给系统打已知漏洞的补丁是系统管理员最基本的职责，这也是最后一道防线。</p>
<p>经过以上的配置，虽然说不上固若金汤，但是也在相当程度上给攻击者的测试造成很多麻烦，即使php脚本程序出现比较严重的漏洞，攻击者也无法造成实际性的破坏。</p>
<p>如果您还有更古怪，更变态的配置方法，希望能一起分享分享；）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/361/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iftop 安装以及相关参数及说明</title>
		<link>http://www.gzv8.com/archives/359</link>
		<comments>http://www.gzv8.com/archives/359#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:56:09 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Linux & Unix]]></category>
		<category><![CDATA[Network]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=359</guid>
		<description><![CDATA[关于 Iftop
iftop 是类似于top的实时流量监控工具。主要用来显示本机网络流量情况及各相互通信的流量集合，如单独同那台机器间的流量大小，非常适合于代理服务器和iptables服务器使用
官方网站：http://www.ex-parrot.com/~pdw/iftop/
安装iftop
安装方法1、编译安装

如果采用编译安装可以到iftop官网下载最新的源码包。
安装前需要已经安装好基本的编译所需的环境，比如make、gcc、autoconf等。安装iftop还需要安装libpcap和libcurses。
CentOS上安装所需依赖包：
yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel
Debian上安装所需依赖包：
apt-get install flex byacc  libpcap0.8 libncurses5
下载iftop
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz
tar zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make &#38;&#38; make install
configure: error: can&#8217;t find pcap.h
You&#8217;re not going to get very far without libpcap.
那你需要先安装libpcap，找到相应的rpm文件，比如：
-rw-r&#8211;r&#8211; 1 root root  108987 Apr  3 08:21 libpcap-0.9.4-8.1.i386.rpm
-rw-r&#8211;r&#8211; 1 root root  119062 Apr  3 08:21 libpcap-devel-0.9.4-8.1.i386.rpm
安装方法2：(懒人办法，最简单)
直接省略上面的步骤
flibpcap-0.9.4-14.el5.x86_64.rpm
CentOS系统：
yum install flex byacc  libpcap ncurses ncurses-devel
wget ftp://fr2.rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/iftop-0.17-1.el5.rf.i386.rpm
rpm [...]]]></description>
			<content:encoded><![CDATA[<p>关于 Iftop</p>
<p>iftop 是类似于top的实时流量监控工具。主要用来显示本机网络流量情况及各相互通信的流量集合，如单独同那台机器间的流量大小，非常适合于代理服务器和iptables服务器使用</p>
<p>官方网站：<a href="http://www.ex-parrot.com/~pdw/iftop/">http://www.ex-parrot.com/~pdw/iftop/</a></p>
<p><strong>安装iftop</strong><br />
<strong>安装方法1、编译安装<br />
</strong><br />
如果采用编译安装可以到iftop官网下载最新的源码包。</p>
<p>安装前需要已经安装好基本的编译所需的环境，比如make、gcc、autoconf等。安装iftop还需要安装libpcap和libcurses。</p>
<p>CentOS上安装所需依赖包：</p>
<p>yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel</p>
<p>Debian上安装所需依赖包：</p>
<p>apt-get install flex byacc  libpcap0.8 libncurses5</p>
<p>下载iftop</p>
<p>wget <a href="http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz">http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz</a></p>
<p>tar zxvf iftop-0.17.tar.gz</p>
<p>cd iftop-0.17</p>
<p>./configure</p>
<p>make &amp;&amp; make install</p>
<p>configure: error: can&#8217;t find pcap.h<br />
You&#8217;re not going to get very far without libpcap.<br />
那你需要先安装libpcap，找到相应的rpm文件，比如：</p>
<p>-rw-r&#8211;r&#8211; 1 root root  108987 Apr  3 08:21 libpcap-0.9.4-8.1.i386.rpm<br />
-rw-r&#8211;r&#8211; 1 root root  119062 Apr  3 08:21 libpcap-devel-0.9.4-8.1.i386.rpm</p>
<p><strong>安装方法2：(懒人办法，最简单)</strong><br />
直接省略上面的步骤<br />
flibpcap-0.9.4-14.el5.x86_64.rpm<br />
CentOS系统：</p>
<p>yum install flex byacc  libpcap ncurses ncurses-devel</p>
<p>wget <a href="ftp://fr2.rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/iftop-0.17-1.el5.rf.i386.rpm">ftp://fr2.rpmfind.net/linux/dag/redhat/el5/en/i386/dag/RPMS/iftop-0.17-1.el5.rf.i386.rpm</a></p>
<p>rpm -ivh iftop-0.17-1.el5.rf.i386.rpm</p>
<p>Debian系统 运行：apt-get install iftop</p>
<p><strong>运行iftop</strong><br />
直接运行： iftop</p>
<p><strong>1、iftop界面相关说明</strong><br />
界面上面显示的是类似刻度尺的刻度范围，为显示流量图形的长条作标尺用的。</p>
<p>中间的&lt;= =&gt;这两个左右箭头，表示的是流量的方向。</p>
<p>TX：发送流量<br />
RX：接收流量<br />
TOTAL：总流量<br />
Cumm：运行iftop到目前时间的总流量<br />
peak：流量峰值<br />
rates：分别表示过去 2s 10s 40s 的平均流量</p>
<p><strong>2、iftop相关参数</strong><br />
常用的参数<br />
-i设定监测的网卡，如：# iftop -i eth1</p>
<p>-B 以bytes为单位显示流量(默认是bits)，如：# iftop -B</p>
<p>-n使host信息默认直接都显示IP，如：# iftop -n</p>
<p>-N使端口信息默认直接都显示端口号，如: # iftop -N</p>
<p>-F显示特定网段的进出流量，如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0</p>
<p>-h（display this message），帮助，显示参数信息</p>
<p>-p使用这个参数后，中间的列表显示的本地主机信息，出现了本机以外的IP信息;</p>
<p>-b使流量图形条默认就显示;</p>
<p>-f这个暂时还不太会用，过滤计算包用的;</p>
<p>-P使host信息及端口信息默认就都显示;</p>
<p>-m设置界面最上边的刻度的最大值，刻度分五个大段显示，例：# iftop -m 100M</p>
<p><strong>进入iftop画面后的一些操作命令(注意大小写)</strong></p>
<p>按h切换是否显示帮助;</p>
<p>按n切换显示本机的IP或主机名;</p>
<p>按s切换是否显示本机的host信息;</p>
<p>按d切换是否显示远端目标主机的host信息;</p>
<p>按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量;</p>
<p>按N切换显示端口号或端口服务名称;</p>
<p>按S切换是否显示本机的端口信息;</p>
<p>按D切换是否显示远端目标主机的端口信息;</p>
<p>按p切换是否显示端口信息;</p>
<p>按P切换暂停/继续显示;</p>
<p>按b切换是否显示平均流量图形条;</p>
<p>按B切换计算2秒或10秒或40秒内的平均流量;</p>
<p>按T切换是否显示每个连接的总流量;</p>
<p>按l打开屏幕过滤功能，输入要过滤的字符，比如ip,按回车后，屏幕就只显示这个IP相关的流量信息;</p>
<p>按L切换显示画面上边的刻度;刻度不同，流量图形条会有变化;</p>
<p>按j或按k可以向上或向下滚动屏幕显示的连接记录;</p>
<p>按1或2或3可以根据右侧显示的三列流量数据进行排序;</p>
<p>按&lt;根据左边的本机名或IP排序;</p>
<p>按&gt;根据远端目标主机的主机名或IP排序;</p>
<p>按o切换是否固定只显示当前的连接;</p>
<p>按f可以编辑过滤代码，这是翻译过来的说法，我还没用过这个！</p>
<p>按!可以使用shell命令，这个没用过！没搞明白啥命令在这好用呢！</p>
<p>按q退出监控。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/359/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql 升级到 5.5 GA 时，PHP 5.2.6 编译出错！已解决！</title>
		<link>http://www.gzv8.com/archives/356</link>
		<comments>http://www.gzv8.com/archives/356#comments</comments>
		<pubDate>Thu, 06 Jan 2011 03:54:47 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=356</guid>
		<description><![CDATA[最近经常有人问我 MySQL Query Cache 相关的问题，就整理一点 MySQL Query Cache 的内容，以供参考。
顾名思义，MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说，Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲，就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。
在大部分的 MySQL 分发版本中，Query Cache 功能默认都是打开的，我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成：

query_cache_limit：允许 Cache 的单条 Query 结果集的最大容量，默认是1MB，超过此参数设置的 Query 结果集将不会被 Cache
query_cache_min_res_unit：设置 Query Cache 中每次分配内存的最小空间大小，也就是每个 Query 的 Cache 最小占用的内存空间大小
query_cache_size：设置 Query Cache 所使用的内存大小，默认值为0，大小必须是1024的整数倍，如果不是整数倍，MySQL 会自动调整降低最小量以达到1024的倍数
query_cache_type：控制 Query Cache 功能的开关，可以设置为0(OFF),1(ON)和2(DEMAND)三种，意义分别如下：

0(OFF)：关闭 Query Cache 功能，任何情况下都不会使用 [...]]]></description>
			<content:encoded><![CDATA[<p>最近经常有人问我 MySQL Query Cache 相关的问题，就整理一点 MySQL Query Cache 的内容，以供参考。</p>
<p>顾名思义，MySQL Query Cache 就是用来缓存和 Query 相关的数据的。具体来说，Query Cache 缓存了我们客户端提交给 MySQL 的 SELECT 语句以及该语句的结果集。大概来讲，就是将 SELECT 语句和语句的结果做了一个 HASH 映射关系然后保存在一定的内存区域中。</p>
<p>在大部分的 MySQL 分发版本中，Query Cache 功能默认都是打开的，我们可以通过调整 MySQL Server 的参数选项打开该功能。主要由以下5个参数构成：</p>
<ul>
<li>query_cache_limit：允许 Cache 的单条 Query 结果集的最大容量，默认是1MB，超过此参数设置的 Query 结果集将不会被 Cache</li>
<li>query_cache_min_res_unit：设置 Query Cache 中每次分配内存的最小空间大小，也就是每个 Query 的 Cache 最小占用的内存空间大小</li>
<li>query_cache_size：设置 Query Cache 所使用的内存大小，默认值为0，大小必须是1024的整数倍，如果不是整数倍，MySQL 会自动调整降低最小量以达到1024的倍数</li>
<li>query_cache_type：控制 Query Cache 功能的开关，可以设置为0(OFF),1(ON)和2(DEMAND)三种，意义分别如下：
<ul>
<li>0(OFF)：关闭 Query Cache 功能，任何情况下都不会使用 Query Cache</li>
<li>1(ON)：开启 Query Cache 功能，但是当 SELECT 语句中使用的 SQL_NO_CACHE 提示后，将不使用Query Cache</li>
<li>2(DEMAND)：开启 Query Cache 功能，但是只有当 SELECT 语句中使用了 SQL_CACHE 提示后，才使用 Query Cache</li>
</ul>
</li>
<li>query_cache_wlock_invalidate：控制当有写锁定发生在表上的时刻是否先失效该表相关的 Query Cache，如果设置为 1(TRUE)，则在写锁定的同时将失效该表相关的所有 Query Cache，如果设置为0(FALSE)则在锁定时刻仍然允许读取该表相关的 Query Cache。</li>
</ul>
<p><strong>Query Cache 如何处理子查询的？</strong><br />
这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的，只要客户端请求的是一个 Query，无论这个 Query 是一个简单的单表查询还是多表 Join，亦或者是带有子查询的复杂 SQL，都被当作成一个 Query，不会被分拆成多个 Query 来进行 Cache。所以，存在子查询的复杂 Query 也只会产生一个Cache对象，子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。</p>
<p><strong>Query Cache 是以 block 的方式存储的数据块吗？</strong><br />
不是，Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据，是结果集。当然，并不仅仅只是结果数据，还包含与该结果相关的其他信息，比如产生该 Cache 的客户端连接的字符集，数据的字符集，客户端连接的 Default Database等。</p>
<p><strong>Query Cache 为什么效率会非常高，即使所有数据都可以 Cache 进内存的情况下，有些时候也不如使用 Query Cache 的效率高？</strong><br />
Query Cache 的查找，是在 MySQL 接受到客户端请求后在对 Query 进行权限验证之后，SQL 解析之前。也就是说，当 MySQL 接受到客户端的SQL后，仅仅只需要对其进行相应的权限验证后就会通过 Query Cache 来查找结果，甚至都不需要经过 Optimizer 模块进行执行计划的分析优化，更不许要发生任何存储引擎的交互，减少了大量的磁盘 IO 和 CPU 运算，所以效率非常高。</p>
<p><strong>客户端提交的 SQL 语句大小写对 Query Cache 有影响吗？</strong><br />
有，由于 Query Cache 在内存中是以 HASH 结构来进行映射，HASH 算法基础就是组成 SQL 语句的字符，所以必须要整个 SQL 语句在字符级别完全一致，才能在 Query Cache 中命中，即使多一个空格也不行。</p>
<p><strong>一个 SQL 语句在 Query Cache 中的内容，在什么情况下会失效？</strong><br />
为了保证 Query Cache 中的内容与是实际数据绝对一致，当表中的数据有任何变化，包括新增，修改，删除等，都会使所有引用到该表的 SQL 的 Query Cache 失效。</p>
<p><strong>为什么我的系统在开启了 Query Cache 之后整体性能反而下降了？</strong><br />
当开启了 Query Cache 之后，尤其是当我们的 query_cache_type 参数设置为 1 以后，MySQL 会对每个 SELECT 语句都进行 Query Cache 查找，查找操作虽然比较简单，但仍然也是要消耗一些 CPU 运算资源的。而由于 Query Cache 的失效机制的特性，可能由于表上的数据变化比较频繁，大量的 Query Cache 频繁的被失效，所以 Query Cache 的命中率就可能比较低下。所以有些场景下，Query Cache 不仅不能提高效率，反而可能造成负面影响。</p>
<p><strong>如何确认一个系统的 Query Cache 的运行是否健康，命中率如何，设置量是否足够？</strong><br />
MySQL 提供了一系列的 Global Status 来记录 Query Cache 的当前状态，具体如下：</p>
<p>mysql&gt; SHOW VARIABLES LIKE &#8216;%query_cache%&#8217;;</p>
<ul>
<li>Qcache_free_blocks：目前还处于空闲状态的 Query Cache 中内存 Block 数目</li>
<li>Qcache_free_memory：目前还处于空闲状态的 Query Cache 内存总量</li>
<li>Qcache_hits：Query Cache 命中次数</li>
<li>Qcache_inserts：向 Query Cache 中插入新的 Query Cache 的次数，也就是没有命中的次数</li>
<li>Qcache_lowmem_prunes：当 Query Cache 内存容量不够，需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数</li>
<li>Qcache_not_cached：没有被 Cache 的 SQL 数，包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL</li>
<li>Qcache_queries_in_cache：目前在 Query Cache 中的 SQL 数量</li>
<li>Qcache_total_blocks：Query Cache 中总的 Block 数量</li>
</ul>
<p>可以根据这几个状态计算出 Cache 命中率，计算出 Query Cache 大小设置是否足够，总的来说，我个人不建议将 Query Cache 的大小设置超过256MB，这也是业界比较常用的做法。<br />
<strong><br />
MySQL Cluster 是否可以使用 Query Cache？</strong><br />
其实在我们的生产环境中也没有使用 MySQL Cluster，所以我也没有在 MySQL Cluster 环境中使用 Query Cache 的实际经验，只是 MySQL 文档中说明确实可以在 MySQL Cluster 中使用 Query Cache。从 MySQL Cluster 的原理来分析，也觉得应该可以使用，毕竟 SQL 节点和数据节点比较独立，各司其职，只是 Cache 的失效机制会要稍微复杂一点。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

