<?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 &#187; PHP</title>
	<atom:link href="http://www.gzv8.com/archives/category/php/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>我的服务器攻击别人了！！ (已解决，把肉鸡抓住了！)</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>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>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>
		<item>
		<title>PHP 缓存加速器 eAccelerator 配置参数详解</title>
		<link>http://www.gzv8.com/archives/250</link>
		<comments>http://www.gzv8.com/archives/250#comments</comments>
		<pubDate>Thu, 11 Mar 2010 09:08:46 +0000</pubDate>
		<dc:creator>qbanke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[eaccelerator.shm_only]]></category>
		<category><![CDATA[eaccelerator.shm_prune_period]]></category>
		<category><![CDATA[eaccelerator.shm_ttl]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=250</guid>
		<description><![CDATA[eaccelerator.shm_size=&#8221;32&#8243;
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . &#8220;0&#8243; 是指操作系统的默认值. 默认值是 &#8220;0&#8243;.可根据服务器的实际情况来调整，16，32，64，128都是可以的。
eaccelerator.cache_dir=&#8221;/home/php/tmp&#8221;
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 &#8220;/tmp/eaccelerator&#8221;.
eaccelerator.enable=&#8221;1&#8243;
开启或关闭 eAccelerator。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。
eaccelerator.optimizer=&#8221;1&#8243;
启或关闭内部优化器，可以提升代码执行速度。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。
eaccelerator.check_mtime=&#8221;1&#8243;
打开或者关闭 PHP 的文件修改检查. &#8220;1&#8243; 是指打开, &#8220;0&#8243; 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 &#8220;1&#8243;. 默认值是 &#8220;1&#8243;.
eaccelerator.debug=&#8221;0&#8243;
开启或关闭调试日志记录。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;0&#8243;。会将缓存命中得记录写入日志。
eaccelerator.filter=&#8221;"
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型（如 &#8220;*.php *.phtml&#8221;等）
如果参数以 &#8220;!&#8221; 开头，则匹配这些参数的文件被忽略缓存。默认值为 &#8220;&#8221;，即，所有 PHP 文件都将被缓存。
eaccelerator.shm_max=&#8221;0&#8243;
当使用 &#8221; eaccelerator_put() &#8221; 函数时禁止其向共享内存中存储过大的文件。该参数指定允许存储的最大值，单位：字节 (10240, 10K, 1M)。&#8221;0&#8243; 为不限制。默认值为 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>eaccelerator.shm_size=&#8221;32&#8243;</strong><br />
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . &#8220;0&#8243; 是指操作系统的默认值. 默认值是 &#8220;0&#8243;.可根据服务器的实际情况来调整，16，32，64，128都是可以的。</p>
<p><strong>eaccelerator.cache_dir=&#8221;/home/php/tmp&#8221;</strong><br />
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 &#8220;/tmp/eaccelerator&#8221;.</p>
<p><strong>eaccelerator.enable=&#8221;1&#8243;</strong><br />
开启或关闭 eAccelerator。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。</p>
<p><strong>eaccelerator.optimizer=&#8221;1&#8243;</strong><br />
启或关闭内部优化器，可以提升代码执行速度。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;1&#8243;。</p>
<p><strong>eaccelerator.check_mtime=&#8221;1&#8243;</strong><br />
打开或者关闭 PHP 的文件修改检查. &#8220;1&#8243; 是指打开, &#8220;0&#8243; 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 &#8220;1&#8243;. 默认值是 &#8220;1&#8243;.</p>
<p><strong>eaccelerator.debug=&#8221;0&#8243;</strong><br />
开启或关闭调试日志记录。&#8221;1&#8243; 为开启，&#8221;0&#8243; 为关闭。默认值为 &#8220;0&#8243;。会将缓存命中得记录写入日志。</p>
<p><strong>eaccelerator.filter=&#8221;"</strong><br />
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型（如 &#8220;*.php *.phtml&#8221;等）<br />
如果参数以 &#8220;!&#8221; 开头，则匹配这些参数的文件被忽略缓存。默认值为 &#8220;&#8221;，即，所有 PHP 文件都将被缓存。</p>
<p><strong>eaccelerator.shm_max=&#8221;0&#8243;</strong><br />
当使用 &#8221; eaccelerator_put() &#8221; 函数时禁止其向共享内存中存储过大的文件。该参数指定允许存储的最大值，单位：字节 (10240, 10K, 1M)。&#8221;0&#8243; 为不限制。默认值为 &#8220;0&#8243;。</p>
<p><strong>eaccelerator.shm_ttl=&#8221;0&#8243;</strong><br />
当 eAccelerator 获取新脚本的共享内存大小失败时，它将从共享内存中删除所有在最后 &#8220;shm_ttl&#8221; 秒内没有存取的脚本缓存。默认值为 &#8220;0&#8243;，即：不从共享内春中删除任何缓存文件。</p>
<p><strong>eaccelerator.shm_prune_period=&#8221;0&#8243;</strong><br />
当 eAccelerator 获取新脚本的共享内存大小失败时，他将试图从共享内存中删除早于&#8221;shm_prune_period&#8221; 秒的缓存脚本。默认值为 &#8220;0&#8243;，即：不从共享内春中删除任何缓存文件。</p>
<p><strong>eaccelerator.shm_only=&#8221;0&#8243;</strong><br />
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认值为 &#8220;0&#8243;，即：使用磁盘和共享内存进行缓存。</p>
<p><strong>eaccelerator.compress=&#8221;1&#8243;</strong><br />
允许或禁止压缩内容缓存。默认值为 &#8220;1&#8243;，即：允许压缩。</p>
<p><strong>eaccelerator.compress_level=&#8221;9&#8243;</strong><br />
指定内容缓存的压缩等级。默认值为 &#8220;9&#8243;，为最高等级。</p>
<p><strong>eaccelerator.keys = &#8220;disk_only&#8221;</strong><br />
<strong>eaccelerator.session = &#8220;disk_only&#8221;</strong><br />
<strong>eaccelerator.content = &#8220;disk_only&#8221;</strong><br />
设置内容缓存的存放的地方，可以设置为：<br />
<strong>shm_and_disk</strong> 在共享缓存和硬盘(默认值)<br />
<strong>shm </strong>默认存在共享内存，如果共享内存已满或大小超过 &#8220;eaccelerator.shm_max&#8221; 的值，就存到硬盘<br />
<strong>shm_only </strong>只存放在共享内存<br />
<strong>disk_only </strong>只存放在硬盘<br />
<strong>none </strong>不缓存数据</p>
<p><strong>eaccelerator.allowed_admin_path = &#8220;/var/www/html/21andy.com/eaccelerator&#8221;</strong><br />
这是控制面板的地址<br />
安装包里有个control.php，你把它复制到网站的任意目录，可以用它查看和管理，这个必须指定，否则查看缓存内容的时候会出错</p>
<p>最后，来看一下我的 eAccelerator 设置</p>
<p>; eaccelerator<br />
[eaccelerator]<br />
zend_extension=&#8221;/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so&#8221;<br />
eaccelerator.shm_size=&#8221;128&#8243;<br />
eaccelerator.cache_dir=&#8221;/tmp/eaccelerator&#8221;<br />
eaccelerator.enable=&#8221;1&#8243;<br />
eaccelerator.optimizer=&#8221;1&#8243;<br />
eaccelerator.check_mtime=&#8221;1&#8243;<br />
eaccelerator.debug=&#8221;0&#8243;<br />
eaccelerator.filter=&#8221;"<br />
eaccelerator.shm_max=&#8221;0&#8243;<br />
eaccelerator.shm_ttl=&#8221;3600&#8243;<br />
eaccelerator.shm_prune_period=&#8221;3600&#8243;<br />
eaccelerator.shm_only=&#8221;0&#8243;<br />
eaccelerator.compress=&#8221;1&#8243;<br />
eaccelerator.compress_level=&#8221;9&#8243;<br />
eaccelerator.keys = &#8220;disk_only&#8221;<br />
eaccelerator.sessions = &#8220;disk_only&#8221;<br />
eaccelerator.content = &#8220;disk_only&#8221;<br />
eaccelerator.allowed_admin_path = &#8220;/var/www/html/21andy.com/eaccelerator&#8221;</p>
<p>另外，再说下 eAccelerator 的安装</p>
<p># wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2<br />
# tar -jxvf eaccelerator-0.9.6.tar.bz2<br />
# cd eaccelerator-0.9.6<br />
# /usr/local/php/bin/phpize<br />
# ./configure &#8211;enable-eaccelerator=shared &#8211;with-php-config=/usr/local/php/bin/php-config<br />
# make &amp;&amp; make install</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/250/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache CPU 无端端卡住在 100%</title>
		<link>http://www.gzv8.com/archives/229</link>
		<comments>http://www.gzv8.com/archives/229#comments</comments>
		<pubDate>Thu, 11 Mar 2010 07:35:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[100%]]></category>
		<category><![CDATA[cpu]]></category>
		<category><![CDATA[eaccelerator]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[卡]]></category>
		<category><![CDATA[慢]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=229</guid>
		<description><![CDATA[这个问题实在好怪，折腾了的一个多月。
情况是这样的：
新配了一台服务器，全新 RedHat 5.4 X64 的OS ，Intel 5500系列的CPU
Apache 2.2.14  + PHP 5.2.6 + Zend 3.3.x + eaccelerator 0.9.4
每到了一段时间，八核CPU就会有2核 始终恒定在 100% 占用进程是 httpd 即 apache
由于还有其他6核的资源，所以访问没有任何影响。
找了好久原因，一度怀疑是 mod_mpm 的问题，调整了无数次参数。
后来由于流量越来越高，出现的频率越来越频繁，差不多2天就又变成这样了。
查看 error_log 看到不断有提示：
child pid ***** exit signal Segmentation fault (11)
child pid ***** exit signal Segmentation fault (11)
child pid ***** exit signal Segmentation fault (11)
重启 Apache 的时候还更会一堆过来。
好不容易找到原因，原来是因为 PHP 加速器 eaccelerator 0.9.4 跟 [...]]]></description>
			<content:encoded><![CDATA[<p>这个问题实在好怪，折腾了的一个多月。<br />
情况是这样的：</p>
<p>新配了一台服务器，全新 RedHat 5.4 X64 的OS ，Intel 5500系列的CPU<br />
Apache 2.2.14  + PHP 5.2.6 + Zend 3.3.x + eaccelerator 0.9.4</p>
<p>每到了一段时间，八核CPU就会有2核 始终恒定在 100% 占用进程是 httpd 即 apache<br />
由于还有其他6核的资源，所以访问没有任何影响。<br />
找了好久原因，一度怀疑是 mod_mpm 的问题，调整了无数次参数。<br />
后来由于流量越来越高，出现的频率越来越频繁，差不多2天就又变成这样了。<br />
查看 error_log 看到不断有提示：</p>
<p>child pid ***** exit signal Segmentation fault (11)<br />
child pid ***** exit signal Segmentation fault (11)<br />
child pid ***** exit signal Segmentation fault (11)</p>
<p>重启 Apache 的时候还更会一堆过来。<br />
好不容易找到原因，原来是因为 PHP 加速器 eaccelerator 0.9.4 跟 As5.4 X64 内核的兼容有问题。<br />
之前在 As5.3 X64 上是完全正常的</p>
<p>于是下载了最新的 eaccelerator V0.9.6<br />
重新编译 eaccelerator 升级覆盖，问题解决！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/229/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 cacti 批量监控服务器以及其 PHP 运作环境配置</title>
		<link>http://www.gzv8.com/archives/89</link>
		<comments>http://www.gzv8.com/archives/89#comments</comments>
		<pubDate>Thu, 11 Mar 2010 04:24:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Cacti]]></category>
		<category><![CDATA[Linux & Unix]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=89</guid>
		<description><![CDATA[本文转载自：http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/index.html?ca=drs-cn-0430
级别： 初级
范 绰耘 (qbanke@163.com), 系统管理员, 广州市摩网信息技术有限公司
2009 年 4 月 30 日
本文主要介绍说明用于支持 Cacti 运作的 PHP+RRDtool 环境的详细配置方法。使其能集中式监控多台，不同平台类型的服务器。以及支持 SNMP 网络设备运作状态。前言
Cacti 功能类似于我们所熟悉的 MRTG 。 MRTG 确实是非常好的老牌系统监控工具，但由于他历史实在很久了，使得许多功能以及配置等方面都比较落后。实现得比较费劲，管理起来很麻烦。比如我有几百个被监测点，分布在不同的机房，而且我需要将这些服务器和网络设备分类，这样的话我就要将这些被监测点放在不同的 mrtg 配置文件中，运行多个 crontab，而且还要自己写了一些 html 页面对其进行管理。
Cacti 其实是一套 php 程序，一个 rrdtool 工具。它运用 snmpget 采集数据，使用 rrdtool 绘图。界面非常漂亮，它提供了强大的数据管理和用户管理功能，一张图是属于一个 host 的，每一个 host 又可以挂载到一个树状的结构上。
用户的管理上，作为一个开源软件，它做到为指定一个用户能查看的“树”、host、甚至每一张图，还可以与 LDAP 结合进行用户的验证。 Cacti 还提供自己增加模板的功能，让你添加自己的 snmp_query 和 script 。功能相当强大！
本文前半部分是教程，主要介绍了 Cacti 以及其 PHP 运行环境的安装配置。后半部分将实际举例如何使用 Cacti 监控诸如 Linux，Windows [...]]]></description>
			<content:encoded><![CDATA[<p>本文转载自：<a href="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/index.html?ca=drs-cn-0430">http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/index.html?ca=drs-cn-0430</a></p>
<p>级别： 初级</p>
<p><a href="http://www.oschina.net/bbs/thread/432?lp=5#author">范 绰耘</a> (<a href="mailto:qbanke@163.com?subject=使用 cacti 批量监控服务器以及其 PHP 运作环境配置">qbanke@163.com</a>), 系统管理员, 广州市摩网信息技术有限公司</p>
<p>2009 年 4 月 30 日</p>
<blockquote><p>本文主要介绍说明用于支持 Cacti 运作的 PHP+RRDtool 环境的详细配置方法。使其能集中式监控多台，不同平台类型的服务器。以及支持 SNMP 网络设备运作状态。<a name="1.前言|outline">前言</a></p></blockquote>
<p>Cacti 功能类似于我们所熟悉的 MRTG 。 MRTG 确实是非常好的老牌系统监控工具，但由于他历史实在很久了，使得许多功能以及配置等方面都比较落后。实现得比较费劲，管理起来很麻烦。比如我有几百个被监测点，分布在不同的机房，而且我需要将这些服务器和网络设备分类，这样的话我就要将这些被监测点放在不同的 mrtg 配置文件中，运行多个 crontab，而且还要自己写了一些 html 页面对其进行管理。</p>
<p>Cacti 其实是一套 php 程序，一个 rrdtool 工具。它运用 snmpget 采集数据，使用 rrdtool 绘图。界面非常漂亮，它提供了强大的数据管理和用户管理功能，一张图是属于一个 host 的，每一个 host 又可以挂载到一个树状的结构上。</p>
<p>用户的管理上，作为一个开源软件，它做到为指定一个用户能查看的“树”、host、甚至每一张图，还可以与 LDAP 结合进行用户的验证。 Cacti 还提供自己增加模板的功能，让你添加自己的 snmp_query 和 script 。功能相当强大！</p>
<p>本文前半部分是教程，主要介绍了 Cacti 以及其 PHP 运行环境的安装配置。后半部分将实际举例如何使用 Cacti 监控诸如 Linux，Windows 。以及支持 SNMP 管理协议的路由器等网络设备。</p>
<p> Cacit 运行环境需要 PHP + Mysql + rrdtool 以及 snmp 工具的支持。</p>
<p>下边是本次配置需要用到的软件。</p>
<p><strong>Catci:</strong></p>
<ol type="1">
<li>cacti-0.8.6j.tar.gz</li>
<li>rrdtool-1.2.27.tar</li>
<li>net-snmp-5.0.9-2.30E.15</li>
<li>net-snmp-devel-5.0.9-2.30E.15</li>
<li>net-snmp-libs-5.0.9-2.30E.15</li>
<li>net-snmp-utils-5.0.9-2.30E.15</li>
</ol>
<p><strong>PHP:</strong></p>
<ol type="1">
<li>php-5.2.6.tar.gz</li>
<li>curl-7.15.0.tar.gz</li>
<li>freetype-2.1.9.tar.gz</li>
<li>gettext-0.16.1.tar.gz</li>
<li>gd-2.0.35.tar.gz</li>
<li>jpegsrc.v6b.tar.gz</li>
<li>libart_lgpl-2.3.17.tar.gz</li>
<li>libpng-1.2.18.tar.gz</li>
<li>libxml2-2.6.32.tar.gz</li>
<li>ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz</li>
<li>zlib-1.2.3.tar.gz</li>
<li>libxml2-2.6.32.tar.gz</li>
</ol>
<p><strong>Apache：</strong></p>
<p>httpd-2.2.6.tar.gz</p>
<p><strong>Mysql:</strong></p>
<p>mysql-5.1.24-rc.tar.gz</p>
<p>开始构建完整的 PHP 运行的环境，我们以全新安装的 RedHatAs4 updata4 操作系统环境为例。</p>
<p><strong>首先编译安装</strong><strong>Apache httpd server</strong></p>
<ol type="1">
<li># tar zxvf httpd-2.2.6.tar.gz</li>
<li># cd httpd-2.2.6</li>
<li># ./configure &#8211;prefix=/usr/local/apache26 &#8211;enable-module=so &#8211;with-mpm=worker &#8211;enable-module=rewrite</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>第二步安装 PHP+GD 等所需的支持插件</strong></p>
<p><strong>编译安装</strong><strong>libxml</strong></p>
<ol type="1">
<li># tar zxvf libxml2-2.6.32.tar.gz</li>
<li># cd libxml2-2.6.32.tar.gz</li>
<li># ./configure &#8211;prefix=/usr/local/libxml2/</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装</strong><strong>zlib</strong></p>
<ol type="1">
<li># tar zxvf zlib-1.2.3.tar.gz</li>
<li># cd zlib-1.2.3</li>
<li>#./configure &#8211;prefix=/usr/local/zlib2/</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装</strong><strong>jpeg</strong><strong>支持</strong></p>
<ol type="1">
<li># tar -zxf jpegsrc.v6b.tar.gz</li>
<li># cd jpeg-6b/</li>
<li># ./configure &#8211;prefix=/usr/local/jpeg6</li>
<li># make</li>
<li># make install-lib</li>
<li># make install</li>
</ol>
<p>( 该版本的 jpeg 在实际安装过程中，make install 的时候会出现好几个找不到目录，或目录不存在的 error 。只需按照提示人手创建缺失目录，然后再令其 make install 直到无任何错误提示且顺利完成为止。 )</p>
<p><strong>编译安装 libpng</strong></p>
<ol type="1">
<li># tar zxvf libpng-1.2.18.tar.gz</li>
<li># cd libpng-1.2.18.tar.gz</li>
<li>#cp scripts/makefile.gcmmx makefile</li>
<li>#./configure &#8211;disable-shared &#8211;prefix=/usr/local/libpng2/</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装 freetype</strong></p>
<ol type="1">
<li># tar zxvf freetype-2.1.9.tar.gz</li>
<li># cd freetype-2.1.9</li>
<li>#./configure &#8211;disable-shared &#8211;prefix=/usr/local/freetype2/</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装 libart_lgpl</strong></p>
<ol type="1">
<li># tar zxvf libart_lgpl-2.3.17.tar.gz</li>
<li># cd ibart_lgpl-2.3.17</li>
<li>#./configure &#8211;disable-shared &#8211;prefix=/usr/local/libart/</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装 gettext</strong></p>
<ol type="1">
<li># tar zxvf gettext-0.16.1.tar.gz</li>
<li># cd gettext-0.16.1</li>
<li># ./configure &#8211;prefix=/usr/local/gettext/</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装 gd 库 :</strong></p>
<ol type="1">
<li># tar zxvf gd-2.0.35.tar.gz</li>
<li># cd gd-2.0.35</li>
<li># ./configure &#8211;prefix=/usr/local/gd2 &#8211;with-zlib=/usr/local/zlib2/ &#8211;with-png=/usr/local/libpng2/ &#8211;with-jpeg=/usr/local/jpeg6/ &#8211;with-freetype=/usr/local/freetype2/ &#8211;with-libart=/usr/local/libart/ &#8211;with-gettext=/usr/local/gettext/ &#8211;with-libxml=/usr/local/libxml2</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装 Curl 支持</strong></p>
<ol type="1">
<li># tar zxvf curl-7.15.0.tar.gz</li>
<li># cd curl-7.15.0</li>
<li># ./configure &#8211;prefix=/usr/local/curl</li>
<li># make &amp;&amp; make install</li>
</ol>
<p><strong>编译安装 PHP</strong></p>
<ol type="1">
<li># tar zxvf php-5.2.6.tar.gz</li>
<li># cd php-5.2.6</li>
<li># ./configure &#8211;prefix=/usr/local/php &#8211;with-apxs2=/usr/local/apache26/bin/apxs &#8211;with-jpeg-dir=/usr/local/jpeg6/ &#8211;with-png-dir=/usr/local/libpng2/ &#8211;with-gd=/usr/local/gd2/ &#8211;with-freetype-dir=/usr/local/freetype2/ &#8211;with-zlib-dir=/usr/local/zlib2/ &#8211;with-mysql=/usr/local/mysql &#8211;with-curl=/usr/local/curl &#8211;with-gettext=/usr/local/gettext</li>
<li># make &amp;&amp; make install</li>
<li># cp php.ini-dist /usr/local/php/lib/php.ini ( 拷贝 PHP 配置文件至安装目录 )</li>
<li># vi /usr/local/apach26/conf/httpd.conf ( 修改 apache 配置文件并加载 PHP 支持 )</li>
</ol>
<p>要改的有如下几处</p>
<ol type="1">
<li>一般都在 #AddType application/x-tar .tgz 下加一行 :<br />
#LoadModule php5_module modules/libphp5.so    AddType application/x-httpd-php .php</li>
<li>如果你搜索其它地方没有以下这行 :<br />
LoadModule php5_module modules/libphp5.so</li>
</ol>
<p>请把上面的 # 号去掉，还有找到<br />
DirectoryIndex index.html index.html.var<br />
在后面加 index.php 让它把 index.php 做为默认页</p>
<ol type="1">
<li>保存 httpd.conf 文件 .<br />
启动 apache<br />
# /usr/local/apache2/bin/apachectl start<br />
如果没有出错 , 写一个测试页放到你网页目录下 . 访问就应该可以看到 php 的版本等信息了 !</li>
</ol>
<p><strong>用</strong> <strong>ZendOptimizer</strong> <strong>加速</strong> <strong>PHP</strong></p>
<ol type="1">
<li>#tar zxvf ZendOptimizer-2.5.3-linux-glibc21-i386.tar.gz</li>
<li>#cd ZendOptimizer-2.5.3-linux-glibc21-i386</li>
<li>#./install.sh</li>
</ol>
<p>安装的时候注意输入正确的安装 apache 的路径等内容 !<br />
安装完毕 , 再看看 phpinfo 页面的 zend 选项就发现了 !!</p>
<p> 安装MYSQL<br />
# groupadd mysql   <br />
# useradd -g mysql mysql   <br />
# tar zxvf mysql-5.1.24-rc.tar.gz   <br />
# cd mysql-5.1.24-rc   <br />
# ./configure &#8211;prefix=/usr/local/mysql    &#8211;localstatedir=/data/mysql ( 指定数据文件目录 )    &#8211;without-innodb &#8211;without-debug &#8211;with-extra-charsets=gbk    &#8211;with-extra-charsets=all &#8211;enable-assembler &#8211;with-pthread    &#8211;enable-thread-safe-client  &#8211;with-client-ldflags=-all-static   <br />
# make &amp;&amp; make install     <br />
# cp ./support-files/mysql.server /etc/init.d/mysql ( 复制 Mysql 启动服务至系统 )    # chmod 777 /etc/init.d/mysql ( 赐予可执行权限 )    # chown mysql:mysql /data/mysql  ( 设置数据文件目录属性 )</p>
<p>设置数据文件目录属性这一步相当重要，许多朋友第一次使用 tar 包安装 Mysql 的时候就因该目录权限问题导致 Mysql 无法启动。相当头大 . </p>
<pre># /usr/local/mysql/bin/mysql_install_db 	 ( 初始化数据库 )
# service mysql start 				 ( 启动 Mysql)
# /usr/local/mysql/bin/mysqladmin -u root -p password 'xxxxx' ( 设置管理员密码 xxx 默认值为空 )</pre>
<p>好了，至此 mysql 安装完毕 .</p>
<p>这样构建 Cacit 运行的 PHP+Mysql 环境就基本上完成了。</p>
<p>下边开始安装 Cacit 所需要的 rrdtools 图形工具以及 snmp 工具</p>
<p><strong>编译安装 rrdtools</strong></p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre># tar zxvf rrdtool-1.2.27.tar    # cd rrdtool-1.2.27
# ./configure --prefix=/usr/local/rrdtool
# make &amp;&amp; make install</pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>如果 ./configure 时出现下面这个错误</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td>
<pre>configure: error: Please fix the library issues listed above and try again.</pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>表明系统有功能缺失，需安装 libart_lgpl-devel.rpm 这个包</p>
<p>如果还是提示听样的错误，有可能是找不到 FreeType</p>
<p>把 /usr/local/freetype2/lib/pkgconfig 下的 .pc 文件拷贝到 /usr/lib/pkgconfig 下即可</p>
<p>如果 make install 时出现 [tclrrd.o] 错误</p>
<p>就安装 tcl-8.4.7-2.i386.rpm 以及 tcl-devel-8.4.7-2.i386.rpm 这 2 个包</p>
<p>安装 net-snmp、snmpwalk 和 snmpget 命令  <br />
# rpm -qa | grep net-snmp<br />
( 查看系统中有否已经装有所需的软件 )   <br />
net-snmp-5.0.9-2.30E.15   <br />
net-snmp-devel-5.0.9-2.30E.15   <br />
net-snmp-libs-5.0.9-2.30E.15   <br />
net-snmp-utils-5.0.9-2.30E.15</p>
<p>没有或者缺少的话都需要逐一安装上。</p>
<p>而且还很有可能会因 rpm 的依存关系无法顺利安装，须使用 &#8211; - nodeps 参数。</p>
<p>以上所需的 rpm 安装包都能在 RedHatAs4 安装光盘上找到 .</p>
<p> 至此，Cacti 所需的运行环境都已经准备好了，接下来开始进行安装以及配置。</p>
<p>稍微修改系统中 snmp 的配置</p>
<p># vi /etc/snmp/snmpd.conf</p>
<ol type="1">
<li>com2secnotConfigUser default public<br />
改为：com2secnotConfigUser 127.0.0.1 public</li>
<li>access  notConfigGroup &#8221;"  any   noauth    exact  systemview  none none<br />
改为：accessnotConfigGroup&#8221;"anynoauthexact all none none</li>
<li>#view all    included  .1         80<br />
将前面的 # 注释 去掉。<br />
保存退出 :wq</li>
<li>重新启动 snmp 服务<br />
# service snmpd restart</li>
</ol>
<p><strong>安装 / 配置 cacti</strong></p>
<ol type="1">
<li># tar zxvf cacti-0.8.6j.tar.gz</li>
<li># mv cacti-0.8.6j /data/web_server/admin/cacti<br />
( 把 cacit 剪切到自定的 web 目录下 )</li>
<li># chmod 777 – Rf /data/web_server/admin/cacti<br />
( 设置目录权限 , 避免因权限问题而导致目录无法写入 )</li>
<li># cd /data/web_server/admin/cacti<br />
在Mysql中创建一个新的库，并导入cacti 目录中cacti.sql 并设置好该表的用户权限，然后编辑 cacti 的数据库配置文件。</li>
<li># vi /data/web_server/admin/cacti/include/config.php
<pre>$database_type= “ mysql ” ;
$database_default = “数据库名称” ;
$database_hostname = “默认是 localhost ” ;
$database_username = “用户名” ;
$database_password = “密码” ;</pre>
<p>更改用户、密码等项与上面给出的对应保存退出</li>
<li># crontab – e （加入自动执行规则，每 5 分钟执行。）
<pre>*/5 * * * * /usr/local/php/bin/php /data/web_server/admin/cacti/poller.php  \         &gt; /dev/null 2&gt;&amp;1
（其中 /usr/local/php/bin/php 这个为 php 的安装目录）</pre>
</li>
<li>保存退出：wq</li>
<li>在 apache 上设置好 cacti 所在 web 目录</li>
<li>打开浏览器 <a href="http://youhostname/cacti">http://</a><a href="http://youhostname/cacti">youhostname/cacti</a></li>
<li>进入 cacti 的初始设置页面<br />
第一次默认登陆账号：admin 密码 admin<br />
登陆后它就会让你立即修改新密码</li>
</ol>
<p><strong>说一下 cacti 设置页中各项“零件”的路径。</strong></p>
<p>当修改好新密码进入，第一个显示出的页面就是让你设置 rrdtool，snmp 等工具的路径。这是个很重要的环节，必须无误，要不然 cacti 将无法生成出统计图。</p>
<pre>snmpwalk Binary Path ： /usr/bin/snmpwalk
snmpget Binary Path： /usr/bin/snmpget
RRDTool Binary Path： /usr/local/rrdtool/bin/rrdtool
PHP Binary Path： /usr/local/php/bin/php
Cacti Log File Path： /data/web_server/admin/cacti/log/cacti.log
Cactid Poller File Path： /data/web_server/admin/cacti/poller.php</pre>
<p>默认的配置中会出现许多“ NotFound ”</p>
<p>按照上边的路径把“ NotFound ”的项都重新填上。</p>
<p>手动运行一次</p>
<p>/usr/local/php/bin/php /data/web_server/admin/cacti/poller.php &gt; /dev/null 2&gt;&amp;1</p>
<p>你就能在顶上 graphs 中 localhost 里头看到本机的内存，CPU，登陆用户等的统计图 .<br />
<a name="N10391"><strong>图 1. Cacti 统计图</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image001.jpg" alt="Cacti 统计图" width="515" height="356" /></p>
<p>但默认 Cacti 是没有创建网卡流量的监控图的。要我们自己来加。</p>
<p>回到 console 菜单</p>
<p>选择 Devices 监控设备。<br />
<a name="N103A9"><strong>图 2. 设备监控</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image002.jpg" alt="设备监控" width="515" height="356" /></p>
<p><a name="N103B8"><strong>图 3. 添加设备</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image003.jpg" alt="添加设备" width="515" height="356" /></p>
<p>然后点击右上角的 Add 进行添加</p>
<p><strong>Description</strong> 设备名称 ( 可随意输入 )</p>
<p><strong>Hostname</strong> 设备地址 ( 如果是本机就填 127.0.0.1 )</p>
<p><strong>Host Template</strong> 设备的类型 ( 选择 ucd/net SNMP Host )</p>
<p>然后其他按照默认即可，如下图<br />
<a name="N103DB"><strong>图 4. 添加的新设备</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image004.jpg" alt="添加的新设备" width="515" height="313" /></p>
<p>点 create 创建。</p>
<p>如果刚才填写的地址无误，创建成功后，会在该页面左上方出现所新建设备的 <strong>SNMP Information</strong></p>
<p>然后点击隔壁醒目的 <strong>* Create Graphs for this Host</strong> 即开始创建监控图表<br />
<a name="N103F7"><strong>图 5. 创建图表-1</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image005.jpg" alt="创建图表-1" width="515" height="356" /></p>
<p><a name="N10406"><strong>图 6. 创建图表-2</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image006.jpg" alt="创建图表-2" width="515" height="343" /></p>
<p>如图 6，沟选你所要监控的网卡以及 IP，点 create 。</p>
<p>这样就完成了你所指定设备统计图的创建。</p>
<p><a name="N1041A"><strong>图 7. 添加的设备统计图</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image007.jpg" alt="添加的设备统计图" width="515" height="356" /></p>
<p>点击菜单中的 <a href="http://s1.someqone.com/cacti/graphs.php">Graph Management</a> 即可浏览到你刚才所创建的图表，如图 7 箭头所示。<br />
<a name="N10432"><strong>图 8. 统计图表</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image008.jpg" alt="统计图表" width="515" height="334" /></p>
<p>有一个小技巧，初次要求 cacti 创建指定设备的统计图表，通过 <a href="http://s1.someqone.com/cacti/graphs.php">Graph Management</a> 进入图 8 所示页面时，统计表图片会是一个 X ( 叉 ) 。这是因为在配置初期指定系统中每 5 分钟执所行的 php 语句还没到点运作。要么你就等 5 分钟，要么你就直接进入系统手动执行：</p>
<p> /usr/local/php/bin/php /data/web_server/admin/cacti/poller.php &gt; /dev/null 2&gt;&amp; </p>
<p>然后曲线表中就能出现第一个峰值，每 5 分钟自动更新。 24 小时后，曲线图就能完整地出现在你眼前。</p>
<p>回到图 7 <a href="http://s1.someqone.com/cacti/graphs.php">Graph Management</a> 的界面勾选新建的图表项，然后在下边</p>
<p>Choose an action 框中选择 Place on a Tree(default Tree)</p>
<p>就能把该图表类似快捷方式的样子张贴到本文图 1 所示的 Graphs，Default tree 栏目中。然而你也能自己在菜单栏的 <a href="http://s1.someqone.com/cacti/tree.php">Graph Trees</a>中新建定制栏目，然后用相同的方法把新建的统计图往你所定制的栏目中放。</p>
<p>Cacti 的强大功能不单止可以通过 snmp 获取装有 Linux，Unix 操作系统服务器的运行状态，还能监控 Windows 系统服务器。跟诸如 Cisco，Linksys， 路由器，交换机，无线 AP 。或者其他支持 snmp 管理协议的网络设备。</p>
<p><a name="4.实际应用|outline">实际应用</a></p>
<p>下边我们举出实应用的例子。<br />
设备结构：</p>
<ol type="1">
<li><strong>网络入口路由器 Linksys RV042</strong>。<br />
Linksys 的一款路由器，主要负责，外网接入路由，防火墙，以及端口映射。</li>
<li><strong>server1 WEB 应用服务器</strong><br />
操作系统： Linux RedHat As4<br />
Eth0，Eth1 双网卡工作。前者接入路由器映射至外网。后者直连至 server2<br />
进行反向代理 ( proxy ) 以及数据备份以及同步等功能。<br />
IP 分别为 192.168.3.2 以及 192.168.10.2</li>
<li><strong>server2</strong><strong>储存，</strong><strong>FTP</strong><strong>与</strong><strong>WEB</strong> <strong>应用服务器</strong><br />
操作系统： Windows2003 r2<br />
与 server1 网络环境相仿，双网卡工作。<br />
IP 分别为 192.168.3.3 以及 192.168.10.3</li>
</ol>
<p>Cacti 已经配置完成，安装在 server1 上。第一台添加到监控表里边的是路由器 RV042 。打开路由器的 WEB 设置页面，勾选并启用 SNMP 功能。如图 9</p>
<p>Send SNMP Trap to： 192.168.3.2（ server1 的 IP ）</p>
<p>然后其他输入框按照默认留空即可，但需留意 Get Community Name: 所填写的组名： public 。保存设置。<br />
<a name="N104A4"><strong>图 9. 保存设置</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image009.jpg" alt="保存设置" width="512" height="331" /></p>
<p>登陆 Cacti ，console 菜单栏中点击 <a href="http://s1.someqone.com/cacti/host.php">Devices</a>。跟前边图 1 至 8 添加新设备以及创建统计图表的步骤相同</p>
<p><strong>Description</strong> 设备名称 ( 我们这里自定为 Linksys RV042)</p>
<p><strong>Hostname</strong> 设备地址 ( 路由器的地址 192.168.3.1 )</p>
<p><strong>Host Template</strong> 设备的类型 ( 选择 ucd/net SNMP Host 或者是 Cisco Router )</p>
<p>然后其他按照默认即可。</p>
<p>创建成功后，也会在该页面左上方出现所新建设备的 Linksys RV042 SNMP Information</p>
<p>点击隔壁 <strong>*Create Graphs for this Host</strong> 创建监控图表<br />
<a name="N104D4"><strong>图 10. 创建监控图表</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image010.jpg" alt="创建监控图表" width="512" height="296" /></p>
<p>路由器 RV042 的端口以及 IP 等数据都取出来了。</p>
<p>勾选好所要监控的端口，点击 create 就能完成路由器监控图表的建立。</p>
<p>Cacti 运行在 Server1 上，所以配置方式跟前边所介绍是一样的，这里就掠过了。但顺带说一下，如果环境中还存在 Server3，而且跟 Server1 一样都是 Linux 系统，需要添加到 cacti 里头。哪么只需在该服务器上修改 snmp 配置，修改的内容也跟 server1 上几乎一样，不同的是。</p>
<p>编辑 /etc/snmp/snmpd.conf 的时候，原来填 127.0.0.1 ( 本机地址 ) 的地方换成 Cacti 所在运行的服务器 IP，即 server1: 192.168.3.2</p>
<ol type="1">
<li>com2secnotConfigUser default public<br />
改为：com2secnotConfigUser 192.168.3.2（server1 地址） public</li>
</ol>
<ol type="1">
<li>access  notConfigGroup &#8221;"  any   noauth    exact  systemview  none none</li>
</ol>
<p>改为：accessnotConfigGroup&#8221;"anynoauthexact all none none</p>
<ol type="1">
<li>#view all    included  .1         80<br />
将前面的 # 注释 去掉。</li>
</ol>
<ol type="1">
<li>保存退出 :wq</li>
</ol>
<p>重新启动 snmp 服务</p>
<p># service snmpd restart</p>
<p>在 Cacti ，<a href="http://s1.someqone.com/cacti/host.php">Devices</a>中创建新设备，</p>
<p>填写 Server3 IP 地址，设备类型： ucd/net SNMP Host , 创建图表 , 完成。</p>
<p>到 Server2 的 win2003 系统了。</p>
<ol>
<li><strong>给 Windows 安装 SNMP 协议支持</strong>通常由于 SNMP 是一个建议关闭的协议 ( 因为有安全漏洞 )，所以 Windows 2003 不是缺省安装的。但 Cacti 用的就是 SNMP 协议，而且服务器处于内网中，有路由器防火墙对外隔着，所以装吧。
<p>控制面板– &gt; 添加或删除程序– &gt; 添加 / 删除 Windows 组件– &gt; 管理和监视工具– &gt; 简单网络管理协议 (SNMP)</li>
<li><strong>修改 SNMP 的安全设置</strong> 这台服务是被监控方，所以需要像刚才举例的 Server3 那样修改 SNMP 的配置。否则在 server 1 里头的 Cacti 则永远也收不到 SNMP 的消息。打开 Services 窗口并找到 SNMP 服务，打开右键菜单，选择属性。在打开的窗口中找到“安全”选项页。在选项页中有两部分设置，上半部分是指 SNMP 服务接受哪种 Community 指示字，缺省情况下 Windows 2003 不对任何指示字反馈，我一般都添加设置为。
<p>团体名称：public， 权限：只读</p>
<p>下半部分添加可信任的主机名、IP 或是 IPX 名称。这里就也是添加 server1 的 IP 192.168.3.2 如图 11<br />
<a name="N10571"><strong>图 11. 修改 SNMP 的安全设置 </strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image011.jpg" alt="修改 SNMP 的安全设置" width="456" height="425" /></li>
<li><strong>修改防火墙</strong>如果你安装了防火墙，还要记得打开 UDP 161 端口。
<p>完成后重新启动 SNMP server 服务</p>
<p>登陆 Cacti 点 <a href="http://s1.someqone.com/cacti/host.php">Devices</a> 创建新设备。</p>
<p>填写 Server2 IP 地址，设备类型：Windows 2000/XP hosts</p>
<p>从 Windows 上获取到的 SNMP 信息也挺多，CPU，内存，虚拟内存，硬盘空间使用，网卡流量，一应俱全。最后创建图表 , 完成。<br />
<a name="N105A7"><strong>图 12. 修改防火墙</strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/linux/l-cn-cacti/images/image012.jpg" alt="修改防火墙" width="515" height="352" /></li>
</ol>
<p> Cacti 真是一个世界。在正式使用 Cacti 接管原来的 MRTG 负责服务器状态监控的这段时间， 我所能最深刻感受到的，不止是它漂亮的界面跟图表。而且是对监控设备的创建，跟管理，都有着史无前例地简单，高效。作为系统管理员，我真相当感激 Cacti 的作者能开发出这一套如此拔尖的监控程序。</p>
<p>虽然它所运行的 PHP 环境以及 RRDtool 在前期配置的时候要花好多的时间跟功夫，</p>
<p>但也未尝不是一个新的选择。试想一下，你只需一阵子的功夫在一台服务器上把环境配好，Cacti 装好。以后，无论你要再添更多的服务器，要了解他们的”情绪”，就只需简单地在浏览器上登陆 Cacti – &gt; 新建设备 – &gt; 新建图表。区区几步，整整有条的服务器列表，CPU，硬盘，网卡等等读数的曲线都能一清二楚地显示在你面前。</p>
<p>当然！ Cacti 带来的强大功能以及方便还远不止这些，就交由大家之后去使用，去体验了。</p>
<p><a name="resources">参考资料 </a></p>
<ul>
<li>开源中国社区：<a href="http://www.oschina.net/">http://www.oschina.net</a></li>
<li>Cacti 中文站点：<a href="http://www.cacti.com.cn/">http://www.cacti.com.cn/</a></li>
<li>Cacti 英文站点：<a href="http://www.cacti.net/">http://www.cacti.net/</a></li>
<li>RRDtool 下载：<a href="http://oss.oetiker.ch/rrdtool/">http://oss.oetiker.ch/rrdtool/</a></li>
<li>PHP 官方站点：<a href="http://www.php.net/">http://www.php.net/</a></li>
<li>在 <a href="http://www.ibm.com/developerworks/cn/linux/">developerWorks Linux 专区</a> 寻找为 Linux 开发人员（包括 <a href="http://www.ibm.com/developerworks/cn/linux/newto/">Linux 新手入门</a>）准备的更多参考资料，查阅我们 <a href="http://www.ibm.com/developerworks/cn/linux/top10/index.html">最受欢迎的文章和教程</a>。</li>
<li>在 developerWorks 上查阅所有 <a href="http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?search_by=Linux+%E6%8A%80%E5%B7%A7">Linux 技巧</a> 和 <a href="http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?type_by=%E6%95%99%E7%A8%8B">Linux 教程</a>。</li>
</ul>
<p> </p>
<p>范绰耘，服务器软硬件技术架构、开源软件的热衷者，现任职广州市摩网信息技术有限公司系统管理员，您可以通过开源中国社区网站 http://www.oschina.net 来联系我。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/89/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 Nginx + Apache For Discuz 7.0(PHP) 均衡负载环境分享。</title>
		<link>http://www.gzv8.com/archives/76</link>
		<comments>http://www.gzv8.com/archives/76#comments</comments>
		<pubDate>Thu, 11 Mar 2010 04:12:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Discuz]]></category>

		<guid isPermaLink="false">http://www.gzv8.com/?p=76</guid>
		<description><![CDATA[近日把原来网站运行的 Discuz 论坛由 4.1 连跳 5 级 ( 5.0, 5.5, 6.0, 6.1, 7.0)。
Discuz 7.0 的功能很强大, 但后续的问题比较多, 原来的软硬件环境运行 4.1 是绰绰有余的，但升级到7.0  的时候,随着改版,用户的活跃度，以及搜索引擎的优化都带来了流量激增。
原本单台服务器平均 CPU 6~10 增高到 30~40 晚上高峰期明显感到点击的反应的延迟。
是需要用到集群的时候了。
在脑中设计该集群的思路, 使用 Nginx 用于流量分发以及静态文件处理，多Apache 负责处理PHP程序。

这是一种很简单的均衡负载方式，在Nginx中配置好 upteam，Localhost 与APP0 服务器的文件同步采用NFS，再公用一个单独的Mysql_server主机。
脑子中的这个设计蓝图，一下子就能配置出来。但我所要分享的，是一些细微但作用确相当重要的技巧。
首先说一下文件同步，NFS。
Discuz 7.0 的程序根目录下有个 attachments 目录，用于写入存放上传的附件，除此之外为了优化反应速度以及减少传输量，我把除此以外根目录下的所有程序文件都复制到 APP0 的本地硬盘上。
好了，一开始就是这么一架构，开始试验。
发生的第一个问题是当论坛站长(管理员) 登陆后台的时候, 由于均衡负载在不停的 2 个 apache 上跳，所以导致输入密码之后怎样都进不了后台。(后台的 cookies 在一关闭浏览器之后就会自动清除)
怎么办? 你可以使用另一个二级域名域名，指到同一个目录，但不绑到 Nginx 的 upteam，proxy 的时候直接写的是 但一台主机apache 的地址.  例如：proxy_pass http://127.0.0.1:8080;
但还有一个方法是我现在所用的，直接把后台的php程序过滤出来，绑定在localhost 的Apache上，不参与均衡负载。
        location [...]]]></description>
			<content:encoded><![CDATA[<p>近日把原来网站运行的 Discuz 论坛由 4.1 连跳 5 级 ( 5.0, 5.5, 6.0, 6.1, 7.0)。</p>
<p>Discuz 7.0 的功能很强大, 但后续的问题比较多, 原来的软硬件环境运行 4.1 是绰绰有余的，但升级到7.0  的时候,随着改版,用户的活跃度，以及搜索引擎的优化都带来了流量激增。</p>
<p>原本单台服务器平均 CPU 6~10 增高到 30~40 晚上高峰期明显感到点击的反应的延迟。</p>
<p>是需要用到集群的时候了。</p>
<p>在脑中设计该集群的思路, 使用 Nginx 用于流量分发以及静态文件处理，多Apache 负责处理PHP程序。</p>
<p><img src="http://www.oschina.net/uploads/bbs/2009/0402/111313_IJvg_390.gif" alt="" /></p>
<p>这是一种很简单的均衡负载方式，在Nginx中配置好 upteam，Localhost 与APP0 服务器的文件同步采用NFS，再公用一个单独的Mysql_server主机。</p>
<p>脑子中的这个设计蓝图，一下子就能配置出来。但我所要分享的，是一些细微但作用确相当重要的技巧。</p>
<p>首先说一下文件同步，NFS。</p>
<p>Discuz 7.0 的程序根目录下有个 attachments 目录，用于写入存放上传的附件，除此之外为了优化反应速度以及减少传输量，我把除此以外根目录下的所有程序文件都复制到 APP0 的本地硬盘上。</p>
<p>好了，一开始就是这么一架构，开始试验。</p>
<p>发生的第一个问题是当论坛站长(管理员) 登陆后台的时候, 由于均衡负载在不停的 2 个 apache 上跳，所以导致输入密码之后怎样都进不了后台。(后台的 cookies 在一关闭浏览器之后就会自动清除)</p>
<p>怎么办? 你可以使用另一个二级域名域名，指到同一个目录，但不绑到 Nginx 的 upteam，proxy 的时候直接写的是 但一台主机apache 的地址.  例如：proxy_pass <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080</a>;</p>
<p>但还有一个方法是我现在所用的，直接把后台的php程序过滤出来，绑定在localhost 的Apache上，不参与均衡负载。</p>
<p>        location ~ admincp.php$ {<br />
            proxy_pass   <a href="http://host_apps/">http://127.0.0.1:8080</a>;<br />
            include proxy.conf;<br />
        }</p>
<p> 把以上这配置加插在Nginx php的过滤语法之上， 其实原理跟过滤PHP是一样的。<br />
凡是 admincp.php  的文件，都proxy 送至 <a href="http://host_apps/">http://127.0.0.1:8080</a><br />
下边这段是 Nginx 用于过滤处理 php  的语法。</p>
<p>        location ~ \.php$ {<br />
            proxy_pass   <a href="http://server_gznow/">http://server_gznow</a>;<br />
            include proxy.conf;<br />
        }</p>
<p>这么一来，Nginx 负责出来所有除 php 以外的请求，而php 就交由后方 apache 处理。并配置了 upteam 均衡负载，因此会分配到各个apache 处理达到流量分摊。而  admincp.php 在Nginx 过滤所有php进行均衡负载之前已绑定在单一个apache 上，就是说该程序并没设置到均衡复制，所以刚才无法登陆后台的问题解决。</p>
<p>好了，这么做下一个继续测试，上传文件，出问题了。</p>
<p>Discuz 7.0 的上传文件为了标明版权或者防盗链，可以在后台中设置为图片打上水印。</p>
<p>在均衡负载的情况下，使用批量上传功能upload的图片会发生一部分有水印，一部分没有的情况。这就肯定跟配置了均衡负载的原因有关。</p>
<p>水印功能需要用到 GD 的JPEG函数，经检测，2台用于均衡负载的服务器 GD支持 JPEG 的环境是没问题的。不使用均衡负载的情况下所有图片都能打上水印，这是为什么呢？ 这跟 Discuz 7.0 的批量上传构造有关。也不大好说明，但通过以下方法能解决。</p>
<p>从web日志观察所得，用户发帖，会用到 post.php 这个程序文件，而上传，即会用到 misc.php</p>
<p>于是我们就跟之前解决后台登陆的方法一样，先把 misc.php 绑定在localhost上，经测试。不成功，图片上传依旧一部分图片没有水印。看来 misc.php 只负责上传，而打水印的函数应用恐怕就是 post.php 负责的。</p>
<p>所以我就干脆把 misc.php 跟 post.php 都绑定在单独的一台 localhost 上。</p>
<p>这么有个好处，更加省了 APP0  NFS 同步的流量。原来上传图片，用户都需要兜圈 Nginx &#8211;&gt; APP0 &#8211;&gt; NFS &#8211;&gt; local &#8211;&gt; Nginx</p>
<p>现在直接就能  Nginx &lt;&#8211;&gt; local</p>
<p>坏处就是，post.php 跟 misc.php 都不能参与均衡复制了，如果用户发帖上传得厉害，这就要以后再想别的办法了&#8230;.</p>
<p>但就又悟出了一个道理，如果日后Mysql 撑不住了，想进行读写分离的时候！可以用同样的方法。</p>
<p>例子：先把Mysql 配置为主从复制</p>
<p>把帖子浏览或板块浏览的程序  viewthread.php  forumdisplay.php 等紧紧读数据的程序 绑在 APP0 ，然后 conf.inc.php 配置文件中 mysql 的地址指定为mysql 从服务器的地址。</p>
<p>因为帖子浏览紧紧需要在 mysql 进行读的操作，而写的操作，例如 post.php 以及一些版主管理的页面都帮到 localhost 然后在conf.inc.php 配置中配置 mysql 主 的服务器地址。这么读写就能分开了！</p>
<p>然后还有一个问题，是后台设置后，Discuz 是有缓存的，往往需要更新缓冲设置才能在前台中显示出来。</p>
<p>但由于设置的admincp.php被绑在单独一台服务器上，所以就算更新缓存，也只更新了一台服务器的缓存。</p>
<p>你可以有2个方法。</p>
<p>1，修改 Nginx  的配置把 admincp.php 指向到另外一台服务器，更新完之后再换回来。</p>
<p>2，用 Rsync ! 配置好同步的参数，写成 shell 程序，一执行即刻往主机上同步，这样就什么 cache 也跟主机上一样了。</p>
<p>############################</p>
<p>4.3 更新</p>
<p>############################</p>
<p>经过数天的观察，发现有个比较奇怪的现象。</p>
<p>Localhost服务器(即Nginx的本地服务器)硬件配置为Intel奔腾D2.8G 双核。</p>
<p>里边运行的服务也不算多，会占些资源的应用，Awstats，Cacti，Nginx，Apache，也就这么几个。</p>
<p>而APP0 机其实是个 VMware 的虚拟机安装的系统，主机的配置是双路的 Xeon 2.8G 1M 。</p>
<p>先撇开双路对性能的强化，就Vmware来说，虚拟出来的从系统性能上已经是有一定的折扣。</p>
<p>PHP 所测得的CPU整数运算能力以及浮点运算成绩都跟真实的机器相差甚远。</p>
<p>但当我把Nginx upteam 的负载量更多地调配到 APP0 上的时候，虽然Discuz 页尾显示的PHP执行的耗时比Localhost多，但的页面反应速度确高于前者。</p>
<p>现在暂时还在研究成因，但既然是这样，我就尝试在Vmware上再模拟多一个应用服务器，APP1。现在+上Localhost就总共有3个Apache 的后端。</p>
<p><img src="http://www.oschina.net/uploads/bbs/2009/0403/095300_q1Lk_0.gif" alt="" /></p>
<p>速度再有明显的提高！我的看法，是多线程的处理大大有利于Web的应用，这跟多核心CPU有利于WEB服务器性能的道理一样。因为现在算上Xeon2.8 的HT超线程技术3个Apache后端就总共有 6 个CPU在处理应用。</p>
<p>而且经过实际的测试，发觉NFS的缓存是足够能减少APP跟Localhost之间的数据传输，而且缓存还能提高读写性能！比直接在 Vmware 虚拟机的虚拟硬盘上读写的速度快得多。二来也方便得多，不用好像之前那样有更新Discuz 缓存的同步麻烦。于是就直接使用 NFS 把Localhost的web_server 目录直接 mount 到2个 APP上。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gzv8.com/archives/76/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

