<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post/972/</link>
<title><![CDATA[工具控 InfluxDB+Grafana快速搭建自己的NewRelic,分析应用运行情况]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Thu, 12 Jan 2017 06:59:51 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/972/</guid> 
<description>
<![CDATA[ 
	NewRelic 估计很多人都用过，但是这货非常贵，贵的一般人买不起，尤其是个人项目，可咱也要性能指标分析啊！那来自己搭建一个<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=222" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=222" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>你需要三个工具:<br/><a href="http://influxdb.com/" target="_blank">InfluxDB</a> - Go 写的一个 Time series (不知道怎么翻译) 数据库，用于存储指标、事件、分析等数据；<br/><a href="http://grafana.org/" target="_blank">Grafana</a> - 一个纯静态的项目，用于访问 InfluxDB，自定义报表，也就是上面那个图的内容，可以自由编辑；<br/><a href="https://github.com/influxdb/influxdb-ruby" target="_blank">influxdb-ruby</a> - InfluxDB 的 Ruby 客户端库，用来写数据<br/>安装 InfluxDB<br/>InfluxDB 安装非常简单<br/>Mac<br/><div class="code">Homebrew 就可以安装<br/>$ brew update<br/>$ brew install influxdb</div><br/>Ubuntu<br/><div class="code"># for 64-bit systems<br/>wget http://s3.amazonaws.com/influxdb/influxdb_latest_amd64.deb<br/>sudo dpkg -i influxdb_latest_amd64.deb<br/><br/># for 32-bit systems<br/>wget http://s3.amazonaws.com/influxdb/influxdb_latest_i386.deb<br/>sudo dpkg -i influxdb_latest_i386.deb</div><br/>然后启动就可以了，帐号默认 root 密码 root 你可以打开它的 Web Admin 界面: http://127.0.0.1:8083/ 并创建一个数据库 rails_app<br/>Grafana 安装<br/>由于 Grafana 是存静态的，你只需要下载源代码解压，将它部署在 Nginx 上面就可以了，或者可以用 Python 的 SimpleHTTPServer 来跑<br/><div class="code">$ wget http://grafanarel.s3.amazonaws.com/grafana-1.9.1.tar.gz<br/>$ tar zxf grafana-1.9.1.tar.gz<br/>$ cd grafana-1.9.1<br/>$ python -m SimpleHTTPServer<br/>Serving HTTP on 0.0.0.0 port 8000 ...<br/></div><br/>然后打开 http://127.0.0.1:8000 就可以看到 Grafana 的界面了，剩下的事情自己摸索。<br/>数据埋点<br/>gem install influxdb<br/>或 Gemfile 加入 influxdb<br/>Rails 项目 config/initializers/influxdb.rb<br/><textarea name="code" class="c" rows="15" cols="100">
require &#039;influxdb&#039;
influx_config&nbsp;&nbsp;= YAML.load_file(&quot;#&#123;Rails.root&#125;/config/influxdb.yml&quot;)[Rails.env]
$influxdb = InfluxDB::Client.new(&quot;rails_app&quot;, hosts: [&quot;127.0.0.1&quot;], port: 8086, username: &quot;root&quot;, password: &quot;root&quot;)

# 关注 ActionController 的 process_action 通知，会收到所有的请求
ActiveSupport::Notifications.subscribe(&#039;process_action.action_controller&#039;) do &#124;*args&#124;
&nbsp;&nbsp;event = ActiveSupport::Notifications::Event.new(*args)

&nbsp;&nbsp;info = &#123;
&nbsp;&nbsp;&nbsp;&nbsp;action: &quot;#&#123;event.payload[:controller]&#125;##&#123;event.payload[:action]&#125;&quot;, 
&nbsp;&nbsp;&nbsp;&nbsp;runtime: event.duration,
&nbsp;&nbsp;&nbsp;&nbsp;db_runtime: event.payload[:db_runtime],
&nbsp;&nbsp;&nbsp;&nbsp;server: Socket.gethostname,
&nbsp;&nbsp;&nbsp;&nbsp;status: event.payload[:status] 
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;$influxdb.write_point(&quot;process_action.action_controller&quot;, info)
end
</textarea><br/>然后数据就会慢慢的写入到 InfluxDB 的 rails_app 会有新表 process_action.action_controller 你可以回到 InfluxDb Admin 里面查询看看<br/>select * from process_action.action_controller;<br/>或者用 list series 查看所有的表<br/>list series;<br/>其它的选择<br/>除了用 Grafana 来展示统计的数据外，你还可以用 <a href="http://facette.io/" target="_blank">facette</a>，它也是支持 InfluxDB 的，也是一个 Go 写的 Web Server，包含 Web 界面，可以自由配置（目前看起来可用性没有 Grafana 好）。<br/>http://facette.io<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=223" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=223" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>2016 更新，用了 Grafana 3.0.0<br/>收集系统数据用 <a href="https://influxdata.com/time-series-platform/telegraf/" target="_blank">Telegraf</a><br/><a href="http://www.zhanghaijun.com/attachment.php?fid=224" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=224" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>如何将influxdb的数据配置进grafana:<br/>https://www.rittmanmead.com/blog/2015/02/obiee-monitoring-and-diagnostics-with-influxdb-and-grafana/<br/>Tags - <a href="http://www.zhanghaijun.com/tags/influxdb/" rel="tag">influxdb</a> , <a href="http://www.zhanghaijun.com/tags/grafana/" rel="tag">grafana</a> , <a href="http://www.zhanghaijun.com/tags/newrelic/" rel="tag">newrelic</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/969/</link>
<title><![CDATA[CentOS下PhxSQL编译安装第二版]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Fri, 09 Sep 2016 13:40:09 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/969/</guid> 
<description>
<![CDATA[ 
	【注】官方已经更新了依赖的第三方包的版本，最新获取的文件编译安装会遇到之前没有遇到的问题，下面是用全新最小化安装的CentOS 6.7 来编译安装的，更新系统后是CentOS 6.8了。<br/><br/>CentOS 6 全新最小化安装的操作系统：<br/><div class="code">yum install -y patch make gcc gcc-c++ gcc-g77 flex bison file libtool libtool-libs autoconf kernel-devel kernel-headers libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel libevent libevent-devel ncurses ncurses-devel curl curl-devel libidn libidn-devel openssl openssl-devel vim-minimal nano fonts-chinese gettext gettext-devel gmp-devel unzip automake libxslt libxslt-devel wget tar libcurl libcurl-devel libcap diffutils ca-certificates net-tools libc-client-devel psmisc libXpm-devel git git-core c-ares-devel libicu-devel libzip libzip-devel perl perl-devel python python-devel</div><br/><br/>#更新系统<br/>yum update<br/><br/>#相关依赖的包<br/>yum install -y readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch<br/><br/>一：获取源码：<br/>git clone --recursive https://github.com/tencent-wechat/phxsql.git （--recursive参数可以同时获得所依赖的第三方库colib,glog,leveldb,protobuf源码，和依赖库phxpaxos,phxrpc）<br/><br/>1.1：升级相关依赖的库及工具。<br/>1.1.1：autoconf<br/>下载地址：http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz<br/><div class="code">tar xzvf autoconf-2.69.tar.gz<br/>cd autoconf-2.69<br/>./configure --prefix=/usr/local/autoconf-2.69<br/>make &amp;&amp; make install<br/><br/>mv /usr/bin/autoconf /usr/bin/bak_autoconf<br/>mv /usr/bin/autoheader /usr/bin/bak_autoheader<br/>mv /usr/bin/autom4te /usr/bin/bak_autom4te<br/>mv /usr/bin/autoreconf /usr/bin/bak_autoreconf<br/>mv /usr/bin/autoscan /usr/bin/bak_autoscan<br/>mv /usr/bin/autoupdate /usr/bin/bak_autoupdate&nbsp;&nbsp; <br/>ln -sf /usr/local/autoconf-2.69/bin/autoconf /usr/bin/autoconf<br/>ln -sf /usr/local/autoconf-2.69/bin/autoheader /usr/bin/autoheader<br/>ln -sf /usr/local/autoconf-2.69/bin/autom4te /usr/bin/autom4te<br/>ln -sf /usr/local/autoconf-2.69/bin/autoreconf /usr/bin/autoreconf<br/>ln -sf /usr/local/autoconf-2.69/bin/autoscan /usr/bin/autoscan<br/>ln -sf /usr/local/autoconf-2.69/bin/autoupdate /usr/bin/autoupdate<br/></div><br/>1.1.2：automake<br/>下载地址：http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz<br/><div class="code">tar xzvf automake-1.14.tar.gz<br/>cd automake-1.14<br/>./configure --prefix=/usr/local/automake-1.14<br/>make &amp;&amp; make install<br/><br/>ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14<br/>ln -sf /usr/local/automake-1.14/bin/automake-1.14 /usr/bin/automake-1.14<br/>ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14<br/>mkdir /usr/share/automake-1.14<br/>ln -sf /usr/local/automake-1.14/share/automake-1.14/test-driver&nbsp;&nbsp;/usr/share/automake-1.14/test-driver<br/></div><br/>1.1.3：cmake<br/>下载地址：https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz<br/><div class="code">tar xzvf cmake-3.6.1.tar.gz<br/>cd cmake-3.6.1<br/>./configure<br/>make &amp;&amp; make install<br/></div><br/>1.1.4：python<br/>下载地址：https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz<br/><div class="code">tar xzvf Python-2.7.12.tgz<br/>cd Python-2.7.12<br/>./configure --prefix=/usr/local/python27<br/>make &amp;&amp; make install<br/></div><br/>1.1.5：gcc<br/>下载地址：http://ftp.gnu.org/gnu/gcc/gcc-6.2.0/gcc-6.2.0.tar.gz<br/><div class="code">tar xzvf gcc-6.2.0.tar.gz<br/>cd gcc-6.2.0/<br/>./contrib/download_prerequisites<br/>cd ..<br/>mkdir gcc-build-6.2.0<br/>cd gcc-build-6.2.0/<br/>../gcc-6.2.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib<br/>make -j4 （-j4参数根据自己的cpu核心数来设置，这样编译的速度会快点，其实加了编译的时间也很长的）<br/>make install<br/><br/>ls /usr/local/bin &#124; grep gcc<br/>update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc-6.2.0 40 （优先使用6.2.0版本的gcc）<br/>执行以上操作之后使用 gcc --version 就可以看见当前使用的gcc版本是gcc (GCC) 6.2.0的新版本了。<br/><br/>cp ./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib64/<br/>删除原来低版本的软链：rm -rf /usr/lib64/libstdc++.so.6<br/>创建新版本的软链：ln -sf /usr/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6<br/></div><br/>二、编译相关依赖<br/>2.1：colib<br/>cd /home/phxsql/third_party/colib<br/>make<br/><br/>2.2：glog<br/>cd /home/phxsql/third_party/glog<br/>./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/glog<br/>make<br/>make install<br/><br/>2.3：leveldb<br/>/home/phxsql/third_party/leveldb<br/>make<br/>mkdir lib<br/>cp libleveldb.* ./lib<br/><br/>2.4：protobuf<br/>cd /home/phxsql/third_party/protobuf<br/>./autogen.sh<br/>./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/protobuf<br/>make<br/>make install<br/><br/>#执行autogen.sh的时候curl报超时的问题：<br/>autogen.sh 文件的第34行gmock的下载地址是https://googlemock.googlecode.com/files/gmock-1.7.0.zip，这个地址在国内正常是访问不了的，所以在执行./autogen.sh的时候会报curl超时，翻出墙外之后这个地址也不能下载，404，应该不会是忘了上传了吧。<br/><br/>解决办法1：<br/>修改autogen.sh文件第34行的下载地址，把https://googlemock.googlecode.com/files/gmock-1.7.0.zip 改为wget http://www.zhanghaijun.com/soft/gmock-1.7.0.zip，这个我已经把两个包都下载了，打包好了。<br/><br/>解决办法2：<br/>项目地址：https://github.com/google/googlemock<br/>项目地址：https://github.com/google/googletest<br/>wget https://github.com/google/googlemock/archive/release-1.7.0.zip<br/>unzip -q release-1.7.0.zip<br/>rm release-1.7.0.zip<br/>mv googlemock-release-1.7.0 gmock<br/><br/>wget https://github.com/google/googletest/archive/release-1.7.0.zip<br/>unzip -q release-1.7.0.zip<br/>rm release-1.7.0.zip<br/>mv googletest-release-1.7.0 gmock/gtest<br/><br/>解决办法三：<br/>wget http://www.zhanghaijun.com/soft/gmock-1.7.0.zip<br/>unzip gmock-1.7.0.zip<br/>mv gmock-1.7.0 gmock<br/><br/><br/>2.5：phxrpc<br/>cd /home/phxsql/third_party/phxrpc<br/>mv third_party/protobuf third_party/bak_protobuf<br/>ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxrpc/third_party/protobuf<br/>make<br/><br/>2.6：phxpaxos<br/><div class="code">cd /home/phxsql/third_party/phxpaxos<br/>mv third_party/protobuf third_party/bak_protobuf<br/>mv third_party/leveldb third_party/bak_leveldb<br/>mv third_party/glog third_party/bak_glog<br/>ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxpaxos/third_party/protobuf<br/>ln -sf /home/phxsql/third_party/leveldb /home/phxsql/third_party/phxpaxos/third_party/leveldb<br/>ln -sf /home/phxsql/third_party/glog /home/phxsql/third_party/phxpaxos/third_party/glog<br/><br/>./autoinstall.sh<br/>make<br/>make install<br/>cd plugin<br/>make<br/>make install<br/></div><br/>三、编译安装PHXSQL<br/><div class="code">cd /home/phxsql<br/>wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.31-77.0/source/tarball/percona-server-5.6.31-77.0.tar.gz<br/>tar xzvf percona-server-5.6.31-77.0.tar.gz<br/>mv percona-server-5.6.31-77.0 percona<br/>sh autoinstall.sh<br/>make<br/>make install<br/></div><br/>3.1：生成安装包<br/>[root@localhost phxsql]# make package<br/>creating package phxsql-0.8.0.tar.gz...<br/><br/>生成的压缩包名称为：phxsql-0.8.0.tar.gz，把它拷贝到其他机器上就可以部署了。<br/><br/><br/>四、部署测试<br/>把安装包拷贝到其他测试的机器上，解压，本文目录为/home/phxsql<br/>创建mysql用户<br/>useradd -d /home/datacenter -s /sbin/nologin mysql<br/>mkdir /home/phxsql/etc<br/>cd /home/phxsql/tools<br/>把director_operator.py文件第26行中的chown user:mysql 修改为chown mysql:mysql<br/><br/>#因为前面测试的时候已经用三台虚拟机搭过一个集群了，这次就把这台机器加入到之前部署的集群中<br/>[root@localhost sbin]# ./phxbinlogsvr_tools_phxrpc -f AddMember -h192.168.1.241 -p17000 -m 192.168.1.243<br/>get master 192.168.1.241 expire time 1473413135<br/>AddMember 192.168.1.243 done<br/><br/>#初始化PhxSQL<br/>mkdir /home/datacenter<br/>/usr/local/python27/bin/python2.7 install.py -i&quot;192.168.1.243&quot; -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/<br/><br/>#备份集群中其他机器的percona数据<br/>/home/phxsql/percona.src/bin/mysqldump --set-gtid-purged=off -h 192.168.1.186 -P11111 -u root --all-databases &gt;/home/all.sql<br/><br/>#kill掉新加入机器的phxbinlogsvr进程<br/>ps axf&#124;grep phxbinlogsvr&#124;grep -v grep&#124;awk &#039;&#123;print $1&#125;&#039;&#124;xargs kill<br/><br/>#通过本地端口登录新加机器的percona<br/>/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root<br/><br/>#登录之后执行以下操作<br/>set GLOBAL super_read_only = 0; set GLOBAL read_only = 0;<br/><br/>#导入其他机器备份出的percona数据<br/>/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root &lt; /home/all.sql<br/><br/>#启动phxbinlogsvr<br/>nohup /home/phxsql/sbin/phxbinlogsvr_phxrpc &amp;<br/><br/>之前的测试的集群由3台变成4台了<br/>[root@localhost sbin]# ./phxbinlogsvr_tools_phxrpc -f GetMemberList -h&quot;192.168.1.186&quot; -p 17000<br/>get master 192.168.1.241 expire time 1473416759<br/>ip 192.168.1.186 port 17000<br/>ip 192.168.1.180 port 17000<br/>ip 192.168.1.241 port 17000<br/>ip 192.168.1.243 port 17000<br/><br/>#查看复制状态，如果都是YES就可以测试了。<br/>/home/phxsql/percona.src/bin/mysql -h 127.0.0.1 -P11111 -u root -e &quot;show slave status&#92;G;&quot;<br/>Slave_IO_Running: Yes<br/>Slave_SQL_Running: Yes<br/><br/>#测试<br/>./test_phxsql.sh 54321 192.168.1.186 192.168.1.180 192.168.1.241 192.168.1.243<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=220" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=220" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>【附】：已编译版本下载：<a href="http://pan.baidu.com/s/1c1PgDQK" target="_blank">http://pan.baidu.com/s/1c1PgDQK</a> 提取密码: dhxm，MD5:ffcebea7eebf51b2b9bcd52696bd2b1f<br/>Tags - <a href="http://www.zhanghaijun.com/tags/centos/" rel="tag">centos</a> , <a href="http://www.zhanghaijun.com/tags/phxsql/" rel="tag">phxsql</a> , <a href="http://www.zhanghaijun.com/tags/percona/" rel="tag">percona</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/968/</link>
<title><![CDATA[微信开源PhxSQL在CentOS下编译安装]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Thu, 08 Sep 2016 04:33:25 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/968/</guid> 
<description>
<![CDATA[ 
	官方更新了第三方库的版本之后，编译方法和可能遇到的错误和本文部分内容不一样了，全新安装的朋友请看<a href="http://www.zhanghaijun.com/post/969/" target="_blank">【CentOS下PhxSQL编译安装第2版】</a><br/><br/>注：仅测试在CentOS release 6.7 和 CentOS Linux release 7.2.1511下编译通过，本文以用户使用较多的CentOS 6 操作系统为例，centos 7 的差别是不需要升级autoconf、automake、gcc和python的版本，其他操作系统的用户请参考官方提供的中文详细编译手册：<a href="https://github.com/tencent-wechat/phxsql/wiki/%E4%B8%AD%E6%96%87%E8%AF%A6%E7%BB%86%E7%BC%96%E8%AF%91%E6%89%8B%E5%86%8C" target="_blank">https://github.com/tencent-wechat/phxsql/wiki/%E4%B8%AD%E6%96%87%E8%AF%A6%E7%BB%86%E7%BC%96%E8%AF%91%E6%89%8B%E5%86%8C</a><br/><br/>一、准备工作<br/>1.1：相关项目地址：<br/><a href="https://github.com/tencent-wechat/phxsql" target="_blank">https://github.com/tencent-wechat/phxsql</a><br/><a href="https://github.com/google/glog" target="_blank">https://github.com/google/glog</a><br/><a href="https://github.com/google/googlemock" target="_blank">https://github.com/google/googlemock</a><br/><a href="https://github.com/google/leveldb" target="_blank">https://github.com/google/leveldb</a><br/><a href="https://github.com/tencent-wechat/phxpaxos" target="_blank">https://github.com/tencent-wechat/phxpaxos</a><br/><a href="https://github.com/tencent-wechat/phxrpc" target="_blank">https://github.com/tencent-wechat/phxrpc</a><br/><a href="https://github.com/tencent-wechat/libco" target="_blank">https://github.com/tencent-wechat/libco</a><br/><a href="https://github.com/google/protobuf" target="_blank">https://github.com/google/protobuf</a><br/><br/>1.2：获取源码：<br/>git clone --recursive https://github.com/tencent-wechat/phxsql.git （--recursive参数可以同时获得所依赖的第三方库colib,glog,leveldb,protobuf源码，和依赖库phxpaxos,phxrpc）<br/><br/>1.3：编译前的准备工作,由于centos自带或者使用yum安装的工具软件版本都比较低，所以要升级相关依赖的库及工具。<br/>1.3.1：<br/>yum install readline readline-devel libstdc++-static glibc-static perl-Module-Install.noarch -y<br/><br/>1.3.2：autoconf<br/>下载地址：http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz<br/><div class="code">tar xzvf autoconf-2.69.tar.gz<br/>cd autoconf-2.69<br/>./configure --prefix=/usr/local/autoconf-2.69<br/>make &amp;&amp; make install<br/><br/>mv /usr/bin/autoconf /usr/bin/bak_autoconf<br/>mv /usr/bin/autoheader /usr/bin/bak_autoheader<br/>mv /usr/bin/autom4te /usr/bin/bak_autom4te<br/>mv /usr/bin/autoreconf /usr/bin/bak_autoreconf<br/>mv /usr/bin/autoscan /usr/bin/bak_autoscan<br/>mv /usr/bin/autoupdate /usr/bin/bak_autoupdate&nbsp;&nbsp; <br/>ln -sf /usr/local/autoconf-2.69/bin/autoconf /usr/bin/autoconf<br/>ln -sf /usr/local/autoconf-2.69/bin/autoheader /usr/bin/autoheader<br/>ln -sf /usr/local/autoconf-2.69/bin/autom4te /usr/bin/autom4te<br/>ln -sf /usr/local/autoconf-2.69/bin/autoreconf /usr/bin/autoreconf<br/>ln -sf /usr/local/autoconf-2.69/bin/autoscan /usr/bin/autoscan<br/>ln -sf /usr/local/autoconf-2.69/bin/autoupdate /usr/bin/autoupdate</div><br/><br/>1.3.3：automake<br/>下载地址：http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz<br/><div class="code">tar xzvf automake-1.14.tar.gz<br/>cd automake-1.14<br/>./configure --prefix=/usr/local/automake-1.14<br/>make &amp;&amp; make install<br/><br/>ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14<br/>ln -sf /usr/local/automake-1.14/bin/automake-1.14 /usr/bin/automake-1.14<br/>ln -sf /usr/local/automake-1.14/bin/aclocal-1.14 /usr/bin/aclocal-1.14<br/>mkdir /usr/share/automake-1.14<br/>ln -sf /usr/local/automake-1.14/share/automake-1.14/test-driver&nbsp;&nbsp;/usr/share/automake-1.14/test-driver</div><br/><br/>1.3.4：cmake<br/>下载地址：https://cmake.org/files/v3.6/cmake-3.6.1.tar.gz<br/><div class="code">tar xzvf cmake-3.6.1.tar.gz<br/>cd cmake-3.6.1<br/>./configure<br/>make &amp;&amp; make install</div><br/><br/>1.3.5：python<br/>下载地址：https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz<br/><div class="code">tar xzvf Python-2.7.12.tgz<br/>cd Python-2.7.12<br/>./configure --prefix=/usr/local/python27<br/>make &amp;&amp; make install</div><br/><br/>1.3.6：gcc<br/>下载地址：http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz<br/><div class="code">tar xzvf gcc-4.9.4.tar.gz<br/>cd gcc-4.9.4<br/>./contrib/download_prerequisites<br/>cd ..<br/>mkdir gcc-build-4.9.4<br/>cd gcc-build-4.9.4<br/>../gcc-4.9.4/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib<br/>make -j4 （-j4参数根据自己的cpu核心数来设置，这样编译的速度会快点，其实加了编译的时间也很长的）<br/>make install<br/>ls /usr/local/bin &#124; grep gcc<br/>update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-unknown-linux-gnu-gcc-4.9.4 40 （优先使用4.9.4版本的gcc）<br/>使用 gcc --version 就可以看见当前使用的gcc版本是刚才编译的新版本了。<br/>cp gcc-build-4.9.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.20 /usr/lib64/<br/>删除原来低版本的软链：rm -rf /usr/lib64/libstdc++.so.6<br/>创建新版本的软链：ln -sf /usr/lib64/libstdc++.so.6.0.20 /usr/lib64/libstdc++.so.6</div><br/><br/>####################################################################<br/>1.3.7：boost&nbsp;&nbsp; (此步可忽略)<br/>官网：http://www.boost.org/<br/>下载地址：https://sourceforge.net/projects/boost/files/boost/1.61.0/<br/>tar xzvf boost_1_61_0.tar.gz<br/>cd boost_1_61_0<br/>./bootstrap.sh --prefix=/usr/local/boost<br/>./b2<br/>./b2 install<br/><br/>echo /usr/local/boost/lib &gt;/etc/ld.so.conf.d/boost.conf<br/>ldconfig<br/>####################################################################<br/><br/>二、编译相关依赖<br/><div class="code">2.1：colib<br/>cd /home/phxsql/third_party/colib<br/>make<br/><br/>2.2：glog<br/>cd /home/phxsql/third_party/glog<br/>mkdir build &amp;&amp; cd build<br/>export CXXFLAGS=&quot;-fPIC&quot; &amp;&amp; cmake .. -DCMAKE_INSTALL_PREFIX=/home/phxsql/third_party/glog &amp;&amp; make VERBOSE=1<br/>make<br/>make install<br/><br/>2.3：leveldb<br/>/home/phxsql/third_party/leveldb<br/>make<br/>mkdir lib<br/>cp -ar out-shared lib/<br/>cp -ar out-static lib/<br/><br/>2.4：protobuf<br/>cd /home/phxsql/third_party/protobuf<br/>./autogen.sh<br/>./configure CXXFLAGS=-fPIC --prefix=/home/phxsql/third_party/protobuf<br/>make<br/>make install<br/><br/>2.5：phxrpc<br/>cd /home/phxsql/third_party/phxrpc<br/>mv third_party/protobuf third_party/bak_protobuf<br/>ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxrpc/third_party/protobuf<br/>ln -sf /usr/local/boost/include/boost /home/phxsql/third_party/phxrpc/boost<br/>make<br/>make boost&nbsp;&nbsp;(如果前面boost忽略，此步略过)<br/><br/>2.6：phxpaxos<br/>cd /home/phxsql/third_party/phxpaxos<br/>mv third_party/protobuf third_party/bak_protobuf<br/>mv third_party/leveldb third_party/bak_leveldb<br/>mv third_party/glog third_party/bak_glog<br/>ln -sf /home/phxsql/third_party/protobuf /home/phxsql/third_party/phxpaxos/third_party/protobuf<br/>ln -sf /home/phxsql/third_party/leveldb /home/phxsql/third_party/phxpaxos/third_party/leveldb<br/>ln -sf /home/phxsql/third_party/glog /home/phxsql/third_party/phxpaxos/third_party/glog<br/><br/>./autoinstall.sh<br/>make<br/>make install<br/>cd plugin<br/>make<br/>make install</div><br/><br/>三、编译安装PHXSQL<br/><div class="code">cd /home/phxsql<br/>wget https://www.percona.com/downloads/Percona-Server-5.6/Percona-Server-5.6.31-77.0/source/tarball/percona-server-5.6.31-77.0.tar.gz<br/>tar xzvf percona-server-5.6.31-77.0.tar.gz<br/>mv percona-server-5.6.31-77.0 percona<br/>sh autoinstall.sh<br/>make<br/>make install<br/><br/>3.1：生成安装包<br/>make package<br/>生成的压缩包名称为：phxsql-0.8.0.tar.gz</div><br/><br/>四、部署测试<br/>把安装包拷贝到其他测试的机器上，解压，本文目录全部为/home/phxsql<br/>创建mysql用户<br/>useradd -d /home/datacenter -s /sbin/nologin mysql<br/>mkdir /home/phxsql/etc<br/>cd /home/phxsql/tools<br/>把director_operator.py文件第26行中的chown user:mysql 修改为chown mysql:mysql<br/>把binary_installer.py文件第35行中的 cd %s/percona.src; ./scripts/mysql_install_db --defaults-file=%s/etc/my.cnf 修改为：cd %spercona.src; ./scripts/mysql_install_db --defaults-file=%setc/my.cnf<br/><br/>测试部署是用的三台虚拟机：<br/>python install.py -i&quot;192.168.1.186&quot; -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/<br/>python install.py -i&quot;192.168.1.180&quot; -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/<br/>/usr/local/python27/bin/python2.7 install.py -i&quot;192.168.1.241&quot; -p 54321 -g 6000 -y 11111 -P 17000 -a 8001 -f /home/datacenter/<br/><br/>在任意一台机器上执行<br/>cd /home/phxsql/sbin/<br/>./phxbinlogsvr_tools_phxrpc -f InitBinlogSvrMaster -h&quot;192.168.1.186,192.168.1.180,192.168.1.241&quot; -p 17000 (集群初始化完成之后就可以使用了。)<br/><br/><br/>./phxbinlogsvr_tools_phxrpc -f GetMemberList -h&quot;192.168.1.186&quot; -p 17000<br/>get master 192.168.1.241 expire time 1473313474<br/>ip 192.168.1.186 port 17000<br/>ip 192.168.1.180 port 17000<br/>ip 192.168.1.241 port 17000<br/><br/>登录数据库：<br/>/home/phxsql/percona.src/bin/mysql -uroot -h&quot;192.168.1.186&quot; -P54321<br/><br/>#获取master信息：<br/>./phxbinlogsvr_tools_phxrpc -f GetMasterInfoFromGlobal -h 192.168.1.186 -p 17000<br/>get master 192.168.1.241 expire time 1473314016<br/><br/>修改管理帐号及密码：<br/>./phxbinlogsvr_tools_phxrpc -f SetMySqlAdminInfo -h 192.168.1.180 -p 17000 -u root -d &quot;&quot; -U zhj -D zhj2016&nbsp;&nbsp;<br/>get master 192.168.1.241 expire time 1473313844<br/>SetMySqlAdminInfo admin username root -&gt; new admin username zhj<br/><br/>用官方提供的测试工具测试：<br/>cd /home/phxsql/tools/<br/>chmod +x test_phxsql.sh<br/>./test_phxsql.sh 54321 192.168.1.186 192.168.1.180 192.168.1.241<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=218" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=218" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>sysbench 简单测试：<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=219" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=219" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>Tags - <a href="http://www.zhanghaijun.com/tags/centos/" rel="tag">centos</a> , <a href="http://www.zhanghaijun.com/tags/phxsql/" rel="tag">phxsql</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/933/</link>
<title><![CDATA[Citrix 全面开源 XenServer 虚拟化解决方案]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Wed, 26 Jun 2013 09:36:26 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/933/</guid> 
<description>
<![CDATA[ 
	今天，Citrix 宣布 XenServer 全面开源，并发布了 XenServer.org 网站。首先我想提醒大家的是尽管 XenServer 之前是基于开源软件构建，包括 Xen hypervisor、Linux 内核和 CentOS Linux 发行版以及用户工具，但多数的 XenServer 组件并不开源。<br/><br/>现在 Citrix 决定全面开源 XenServer 解决方案，包括之前未开源的 XenServer 所有组件。<br/><br/>源码可通过 https://github.com/xenserver 下载。<br/><br/>---------------------------------------------------------------------------------------------------------------------------<br/><br/>XenServer 的详细介绍:<br/><br/>Citrix XenServer是一种全面而易于管理的服务器虚拟化平台，基于强大的 Xen Hypervisor 程序之上。Xen技术被广泛看作是业界部署最快速、最安全的虚拟化软件技术，XenServer 可高效地管理Windows® 和 Linux® 虚拟服务器而设计的，实现经济高效的服务器整合和业务连续性。什么是服务器虚拟化？服务器虚拟化是一种经过实践验证的技术，它允许多台虚拟机在 单一物理服务器上运行。每台虚拟机与其它虚拟机完全隔离开来，并通过系统管理程序（hypervisor）的软件层与基础主机分离开。这样，每台 虚拟机 就能够运行不同的操作系统和应用。由于这些虚拟机与基础主机相分离，所以虚拟机也可以从一台物理服务器移动到另一台而不中断运行，即实时迁移。这些属性正 在改变企业实施虚拟计算的方式。服务器虚拟化和数据中心自动化的最佳选择XenServer是在云计算环境中经验证的企业级虚拟化平台，为企业提供创建和管理虚拟基础架构所需的所有功能。深得很多要求严格的企业信赖，广泛使用于运行最关键的应用，已被最大规模的云计算环境所采用。利用思杰的免费服务器虚拟化软件构建虚拟基础架构，或通过高级版整合任何规模的企业。<br/><br/>•削减成本。通过减少数据中心所需的物理服务器数量，企业可以节约电力和冷却成本。<br/>•提高IT灵活性和效率。通过动态地调整容量，优化虚拟机布局并自动完成重复性管理任务，客户可以轻松适应不断变化的数据中心和计算需求。<br/>•提高性能和用户生产率。通过实现“零停机”维护、自动从硬件故障中恢复并在发生灾难时提供故障切换功能，最终用户可确保在任何情况下都可访问关键任务应用。<br/>Tags - <a href="http://www.zhanghaijun.com/tags/xenserver/" rel="tag">xenserver</a> , <a href="http://www.zhanghaijun.com/tags/%25E5%25BC%2580%25E6%25BA%2590/" rel="tag">开源</a> , <a href="http://www.zhanghaijun.com/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/839/</link>
<title><![CDATA[Linux服务器监控系统 ServMon V1.0]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Fri, 20 May 2011 13:56:26 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/839/</guid> 
<description>
<![CDATA[ 
	　　我管理服务器太多了，不可能每时每刻都登录到上面查看服务器状况，于是写了一个“服务器监控系统 ServMon V1.0”。其原理是用shell脚本定时抓取被监控服务器上信息，再用curl POST到监控机的PHP接口程序上，由PHP接口程序对信息进行分析，如果存在异常，则发送报警邮件给管理员。<br/><br/>　　下午，ServMon V1.0 已经在sina播客服务器上部署，以下为ServMon的删节版内容，只监控磁盘分区使用率和Swap交换空间两项：<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=41" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=41" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　1、被监控端服务器的shell脚本（Linux）<br/>　　(1)、发送磁盘分区使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">/usr/local/servmon/bin/diskstat_send<br/>#!/bin/sh<br/>LANG=zh_cn<br/>disk=$(/bin/df -kP &#124; grep / &#124; awk -F ' ' ' &#123;print $6":"$5&#125;' &#124; awk -F '%' ' &#123;print $1&#125;' &#124; tr -s '&#92;n' ';')<br/>today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")<br/>ip=$(/sbin/ifconfig &#124; grep "inet addr" &#124; grep -v "127.0.0.1" &#124; awk '&#123;print $2;&#125;' &#124; awk -F':' '&#123;print $2;&#125;' &#124; tr -s '&#92;n' ';')<br/>/usr/bin/curl -d menu=diskstat -d password=$2 -d date=$today -d ip=$ip -d data=$disk $1</div></div><br/>磁盘分区使用率监控报警邮件示例图：<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=42" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=42" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　(2)、发送Swap交换空间使用率给监控端接口http://192.168.0.28/servmon/interface.php的脚本<br/>　　/usr/local/servmon/bin/swapstat_send<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">#!/bin/sh<br/>LANG=zh_cn<br/>data=$(/usr/bin/free -m &#124; grep Swap &#124; awk '&#123;print $2":"$3":"$4&#125;')<br/>today=$(date -d "today" +"%Y-%m-%d_%H:%M:%S")<br/>ip=$(/sbin/ifconfig &#124; grep "inet addr" &#124; grep -v "127.0.0.1" &#124; awk '&#123;print $2;&#125;' &#124; awk -F':' '&#123;print $2;&#125;' &#124; tr -s '&#92;n' ';')<br/>/usr/bin/curl -d menu=swapstat -d password=$2 -d date=$today -d ip=$ip -d data=$data $1</div></div><br/>Swap交换空间使用率监控报警邮件示例图：<br/><a href="http://www.zhanghaijun.com/attachment.php?fid=43" target="_blank"><img src="http://www.zhanghaijun.com/attachment.php?fid=43" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　(3)、计划任务：每30分钟将磁盘分区使用率发送给监控端接口，每10分钟将Swap交换空间使用率发送给监控端接口。<br/>　　/etc/cron.d/servmon<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">0-30/30 * * * * root /bin/sh /usr/local/servmon/bin/diskstat_send http://192.168.0.28/servmon/interface.php yourpassword<br/>0-50/10 * * * * root /bin/sh /usr/local/servmon/bin/swapstat_send http://192.168.0.28/servmon/interface.php yourpassword</div></div><br/>　　2、监控端服务器配置（Linux）<br/>　　(1)、启动sendmail<br/>　　/usr/sbin/sendmail -bd -q30m<br/>　　-b：指定Sendmail在后台运行，并且监听端口25的请求。<br/>　　-d：指定Sendmail以Daemon方式运行（守护进程）。<br/>　　-q：当Sendmail无法将邮件成功地发送到目的地时，它会将邮件保存在队列里。该参数指定邮件在队列里保存的时间。其中的30m表示保留30分钟。<br/><br/>　　(2)、修改php.ini的[mail function]部分为以下内容，然后重启Apache，使PHP能够使用mail()函数发送电子邮件<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">[mail function]<br/>; For Win32 only.<br/>;SMTP = localhost<br/>;smtp_port = 25<br/><br/>; For Win32 only.<br/>;sendmail_from = me@example.com<br/><br/>; For Unix only.&nbsp;&nbsp;You may supply arguments as well (default: "sendmail -t -i").<br/>sendmail_path = /usr/sbin/sendmail -t -i</div></div><br/>　　(4)、在MySQL上创建一个数据库servmon，然后在该数据库中执行以下SQL语句创建表：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">CREATE TABLE `tb_diskstat` (<br/>&nbsp;&nbsp;`ip` varchar(128) NOT NULL default '',<br/>&nbsp;&nbsp;`date` int(10) NOT NULL default '0',<br/>&nbsp;&nbsp;UNIQUE KEY `ip` (`ip`)<br/>) TYPE=MyISAM;</div></div><br/>　　备注：这张表是PHP接口程序用来记录发送磁盘分区报警邮件的时间，避免在一段时间内重复发送大量报警邮件的，其实完全可以用Session、文本文件来代替它。这里之所以用MySQL数据库，是因为PHP接口中还将增加一些需要记录信息到数据库的监控模块，所以就统一用数据库了。）<br/><br/>　　(3)、PHP接口程序<br/>　　http://192.168.0.28/servmon/interface.php<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/><?php&nbsp;&nbsp;<br/>/** <br/>********************************************************************* <br/>* Copyright (c) 2007, 回忆未来[张宴] <br/>* All rights reserved. <br/>* <br/>* 文件名称： interface.php <br/>* 摘&nbsp;&nbsp;&nbsp;&nbsp;要： 服务器监控系统ServMon接口程序 <br/>* 描&nbsp;&nbsp;&nbsp;&nbsp;述： <br/>* 作&nbsp;&nbsp;&nbsp;&nbsp;者： 张宴&nbsp;&nbsp;新浪UC：103500&nbsp;&nbsp;博客：blog.s135.com <br/>* 版&nbsp;&nbsp;&nbsp;&nbsp;本： 1.0 <br/>* 时&nbsp;&nbsp;&nbsp;&nbsp;间： 2007-08-03 <br/>********************************************************************* <br/>*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>//------------------配置信息------------------&nbsp;&nbsp;<br/>$password = "yourpassword";//设置数据传输验证密码&nbsp;&nbsp;<br/>$mysql_server = "127.0.0.1:3306";//MySQL服务器地址及端口，例如localhost:3306&nbsp;&nbsp;<br/>$mysql_db = "servmon";//MySQL数据库名&nbsp;&nbsp;<br/>$mysql_username = "root";//MySQL帐号&nbsp;&nbsp;<br/>$mysql_password = "";//MySQL密码&nbsp;&nbsp;<br/>$disk_max = "90";//磁盘分区使用百分比超过此值，则报警。默认为90%&nbsp;&nbsp;<br/>$disk_sendmail_interval = "43200";//如果同一台服务器连续报警，设置每隔多少秒发送一次报警邮件。默认为43200秒，即12小时。&nbsp;&nbsp;<br/>$swap_max = "50";//Swap交换空间使用百分比超过此值，则报警。默认为50%&nbsp;&nbsp;<br/>$email = "servmon@sina.com";//管理员邮箱&nbsp;&nbsp;<br/>//--------------------------------------------&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>//密码验证&nbsp;&nbsp;<br/>if (htmlspecialchars($_POST["password"]) != $password)&nbsp;&nbsp;<br/>&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo "数据传输验证密码错误！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit();&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>//磁盘分区报警（分区使用率超过90%后会发邮件报警）&nbsp;&nbsp;<br/>if (htmlspecialchars($_POST["menu"]) == "diskstat")&nbsp;&nbsp;<br/>&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$is_send_mail = "0";//是否发邮件，0为不发邮件&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$date = htmlspecialchars($_POST["date"]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$ip = htmlspecialchars($_POST["ip"]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$data = htmlspecialchars($_POST["data"]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$subject = "[系统监控]_磁盘分区空间不足_" . $ip;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = "服务器监控系统 ServMon V1.0&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "-------------------------------------------------------&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "报警服务器：" . $ip . "&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "-------------------------------------------------------&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "报警时间：" . $date . "&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "-------------------------------------------------------&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "报警内容：&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$headers = 'From: ServMon <servmon@sina.com>' . "&#92;r&#92;n" .&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Reply-To: ServMon <servmon@sina.com>' . "&#92;r&#92;n" . 'X-Mailer: PHP/' . phpversion();&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$arr1 = explode(";", $data);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;foreach ($arr1 as $key1 => $value1)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arr2 = explode(":", $value1);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足（空间使用率达到" . $arr2[1] . "%）&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$is_send_mail = "1";//是否发邮件，1为发送邮件&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($is_send_mail == "1")&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$connect = mysql_connect($mysql_server, $mysql_username, $mysql_password);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$select = mysql_select_db($mysql_db, $connect);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$select_result = mysql_query("SELECT date FROM tb_diskstat WHERE ip='" . $ip .&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"' LIMIT 1");&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$rs = mysql_fetch_array($select_result);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$interval = date("U") - $rs["date"];&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($interval >= $disk_sendmail_interval)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mail($email, $subject, $message, $headers))&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "已成功发送报警邮件！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "发送报警邮件失败！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$insert_result = mysql_query("REPLACE INTO tb_diskstat (ip, date) VALUES ('" . $ip .&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"', '" . date("U") . "');");&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($disk_sendmail_interval >= 3600)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$disk_sendmail_interval_text = $disk_sendmail_interval / 3600 . "小时";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$disk_sendmail_interval_text = $disk_sendmail_interval . "秒";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "已发送过报警邮件，" . $disk_sendmail_interval_text . "内不再重复发送！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "磁盘分区空间足够，无须发送报警邮件！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit();&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>//Swap交换空间报警（Swap交换空间使用率超过60%后会发邮件报警）&nbsp;&nbsp;<br/>if (htmlspecialchars($_POST["menu"]) == "swapstat")&nbsp;&nbsp;<br/>&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$is_send_mail = "0";//是否发邮件，0为不发邮件&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$date = htmlspecialchars($_POST["date"]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$ip = htmlspecialchars($_POST["ip"]);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;list($total, $used, $free) = split(":", htmlspecialchars($_POST["data"]));&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$percentage = round($used / $total * 100, 0);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$subject = "[系统监控]_Swap交换空间使用率高达" . $percentage . "%_" . $ip;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = "服务器监控系统 ServMon V1.0&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "-------------------------------------------------------&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "报警服务器：" . $ip . "&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "-------------------------------------------------------&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "报警时间：" . $date . "&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "-------------------------------------------------------&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "报警内容：&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$headers = 'From: ServMon <servmon@sina.com>' . "&#92;r&#92;n" .&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Reply-To: ServMon <servmon@sina.com>' . "&#92;r&#92;n" . 'X-Mailer: PHP/' . phpversion();&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$arr1 = explode(";", $data);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;foreach ($arr1 as $key1 => $value1)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arr2 = explode(":", $value1);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($arr2[0] != "" && $arr2[1] != "" && $arr2[1] >= $disk_max)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "●磁盘分区 " . $arr2[0] . " 空间不足（空间使用率达到" . $arr2[1] . "%）&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$is_send_mail = "1";//是否发邮件，1为发送邮件&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($percentage >= $swap_max)&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "●Swap交换空间使用率高达" . $percentage . "%，若继续增加到100%可能会导致服务器死机。&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "●Swap交换空间总量：" . $total . " MB&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "●Swap交换空间使用：" . $used . " MB&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message = $message . "●Swap交换空间剩余：" . $free . " MB&#92;r&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$is_send_mail = "1";//是否发邮件，1为发送邮件&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if ($is_send_mail == "1")&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mail($email, $subject, $message, $headers))&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "已成功发送报警邮件！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "发送报警邮件失败！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo "Swap交换空间使用率不高，无须发送报警邮件！&#92;n";&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;exit();&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/>?></div></div><br/>文章来源：http://blog.s135.com/post/276/<br/>Tags - <a href="http://www.zhanghaijun.com/tags/servmon/" rel="tag">servmon</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/827/</link>
<title><![CDATA[iperf：一款网络性能测试工具]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Wed, 18 May 2011 15:15:21 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/827/</guid> 
<description>
<![CDATA[ 
	<p align="left">iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具，能够提供网络吞吐率信息，以及震动、丢包率、最大段和最大传输单元大小等统计信息；从而能够帮助我们测试网络性能，定位网络瓶颈。<br/> <br/>参数说明<br/> -s 以server模式启动，eg：iperf -s<br/> -c 以client模式启动，host是server端地址，eg：iperf -c 222.35.11.23<br/> <br/>通用参数<br/> -f [k&#124;m&#124;K&#124;M] 分别表示以Kbits, Mbits, KBytes, MBytes显示报告，默认以Mbits为单位,eg:iperf -c 222.35.11.23 -f K<br/> <br/>-i sec 以秒为单位显示报告间隔，eg:iperf -c 222.35.11.23 -i 2<br/> <br/>iperf是client端向server端发送数据<br/> <br/>server端显示的是接收速率，最好加i参数，进行速率跟踪<br/> <br/>client 显示的是发送速率<br/> <br/>server 显示接收速率<br/> -l 缓冲区大小，默认是8KB,eg:iperf -c 222.35.11.23 -l 16<br/> <br/>可以使用不同的包长，进行测试<br/> -m 显示tcp最大mtu值<br/> -o 将报告和错误信息输出到文件eg:iperf -c 222.35.11.23 -o c:iperflog.txt<br/> -p 指定服务器端使用的端口或客户端所连接的端口eg:iperf -s -p 9999;iperf -c 222.35.11.23 -p 9999<br/> <br/>-u 使用udp协议<br/> <br/>测试htb的时候最好用udp，udp通信开销小，测试的带宽更准确<br/> <br/>-w 指定TCP窗口大小，默认是8KB<br/> <br/>如果窗口太小，有可能丢包<br/> -B 绑定一个主机地址或接口（当主机有多个地址或接口时使用该参数）<br/> -C 兼容旧版本（当server端和client端版本不一样时使用）<br/> -M 设定TCP数据包的最大mtu值<br/> -N 设定TCP不延时<br/> -V 传输ipv6数据包<br/> <br/>server专用参数<br/> -D 以服务方式运行ipserf，eg:iperf -s -D<br/> -R 停止iperf服务，针对-D，eg:iperf -s -R<br/> <br/>client端专用参数<br/> -d 同时进行双向传输测试<br/> -n 指定传输的字节数，eg:iperf -c 222.35.11.23 -n 100000<br/> -r 单独进行双向传输测试<br/> <br/>-b 指定发送带宽，默认是1Mbit/s<br/> <br/>在测试qos的时候，这是最有用的参数。<br/> -t 测试时间，默认10秒,eg:iperf -c 222.35.11.23 -t 5<br/> <br/>默认是10s<br/> <br/>-F 指定需要传输的文件<br/> -T 指定ttl值</p><br/>Tags - <a href="http://www.zhanghaijun.com/tags/iperf/" rel="tag">iperf</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/818/</link>
<title><![CDATA[Facebook的PHP开源项目揭秘：HipHop]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Wed, 18 May 2011 14:30:09 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/818/</guid> 
<description>
<![CDATA[ 
	HipHop本身并不是一个编辑器，更确切的说，它是一个源代码转换器。将PHP代码转换为高度优化的C++代码，然后再使用g++编译器编译。它可以保持语义等效地执行源代码，但牺牲了一些很少会使用到的功能，比如eval()。为了进一步的提升性能，HipHop包含一个code transformer，一个重新实现的PHP runtime系统，并利用这些性能的优化的优势，对许多共同的PHP扩展进行了重写。<br/> 转换中的主要步骤：<br/> 1. 静态分析：收集声明和依赖的相关信息<br/> 2. 类型推断（Type inference）：选出最合适的类型，是C++ scalar，String, Array, classes, Object还是Variant等…<br/> 3. 代码生成。大部分是直接将PHP的语句和表达式对应为 C++的语句和表达式。<br/> <br/>与此同时，开发者还提供了—HPHPi，一个实验性的解释器。使用HPHPi，在运行之前也不必编译PHP源代码。<br/> <br/>HipHop在保持了PHP优点的同时，也兼得了C++的性能优势。项目总共有30万行代码，5000多个单元测试。所有这些都将以PHP开源许可证形式发布到GitHub。<br/> <br/>点击访问HipHop wiki：<a href="http://github.com/facebook/hiphop-php/wikis" target="_blank">http://github.com/facebook/hiphop-php/wikis</a><br/>Tags - <a href="http://www.zhanghaijun.com/tags/hiphop/" rel="tag">hiphop</a>
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post/358/</link>
<title><![CDATA[FreeBSD 6.2快速架设网站服务器教程]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[开源世界]]></category>
<pubDate>Tue, 04 Mar 2008 12:18:13 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post/358/</guid> 
<description>
<![CDATA[ 
	1、 安装设置prozilla（port下载加速） <br/> 当然是首先安装下载加速啦，不然下面的安装会好慢的 <br/><br/> 安装使用如下指令： <br/><br/> #cd /usr/ports/ftp/prozilla <br/><br/> #make install clean <br/><br/>中间会出现： <br/><a href="http://www.zhanghaijun.com/attachment/month_0803/u20083420122.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/u20083420122.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>这是例子和HTML格式的手册页，不会用以后想研究的可以加上，然后选OK <br/><br/> 安装完毕后，编辑或建立/etc/make.conf： <br/><br/> #ee /etc/make.conf <br/><br/> 将原来的部分用#号注释掉，如果是最小化安装的话暂时是没有这个文件的。添加以下内容： <br/><br/> FETCH_CMD= proz <br/><br/> FETCH_BEFORE_ARGS= -r -k=4 –s FETCH_AFTER_ARGS= DISABLE_SIZE= yes prozilla如果偶尔不能正常下载的话，可以#掉/etc/make.conf下我们添加的内容。 2、安装Apache2.2.X 使用以下指令： # cd /usr/ports/www/apache22 #make install clean 出现图如下: <br/><a href="http://www.zhanghaijun.com/attachment/month_0803/v20083420221.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/v20083420221.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>根据自已的不同选取安装模块，如果你不知道选取那些，那就默认，直接回答OK 即可， <br/><br/> 默认已经足够了，所以我这里回答OK， <br/><br/> 几分钟后安装完成了，快慢决定于你的网络快慢，因为他到网上下载安装包的，<br/>3、 安装 PHP5.2.1 <br/><br/> 执行下列指令： <br/><br/> # cd /usr/ports/lang/php5&nbsp;&nbsp;<br/><br/> make install clean&nbsp;&nbsp;<br/><br/> 在跳出的提示框中，使用如下配置 <br/><a href="http://www.zhanghaijun.com/attachment/month_0803/k20083420347.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/k20083420347.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>4、完成后继续安装一些常用的 PHP 模块， <br/><br/> 请执行下列指令： <br/><br/> # cd /usr/ports/lang/php5-extensions/ <br/><br/> make install clean <br/><br/> 在跳出的提示框中，使用如下配置 <br/><a href="http://www.zhanghaijun.com/attachment/month_0803/p20083420437.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/p20083420437.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/> 出现一个选单，除了预设的项目外，我们必须再选择下列几个常用的项目：CTYPE、CURL、EXIF、FOLTER、FTP、GD、GETEXT、GMP、MBSTRING、MCRYPT、MYQL、PDF、IMAP、PCRE、SESSION、SOCKETS、ZLIB、ZIP。这些项目非常常用，尤其是 SESSION。 <br/><br/> 然后还会出现一个选单，保持默认就可以了：<br/><a href="http://www.zhanghaijun.com/attachment/month_0803/x20083420530.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/x20083420530.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>然后这个要选上：<br/><a href="http://www.zhanghaijun.com/attachment/month_0803/22008342068.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/22008342068.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>毕竟这是老外“希望”中国人用的东西。 <br/><br/> 安装完成后，运行cp –rp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini #php5 <br/>5.安装 MySQL<br/><br/> 使用如下指令 <br/><br/> # cd /usr/ports/databases/mysql50-server <br/><br/> # make install clean <br/><br/> # cd /usr/ports/databases/php5-mysql <br/><br/> # make install clean <br/><br/> 6. Apache2.2.X 基本设定 <br/><br/> 安装完 Apache 后，我们必须先进行一些基本设定才可以开始使用。本节中，我们先介绍较常使用的设定项目，让您可以快速的设定好网页服务器，而更详细的 Apache 设定将于下一小节中说明。Apache 的设定档位于： <br/><br/> /usr/local/etc/apache22/httpd.conf、/usr/local/etc/apache22/extra/httpd-languages.conf、/usr/local/etc/apache22/extra/httpd-default.conf。 <br/><br/> 设定/usr/local/etc/apache22/httpd.conf <br/><br/> ServerAdmin 设定管理者邮件 <br/><br/> 设定您的信箱，这个信箱地址当网页出现错误讯息时将出现在该页面上。以下范例为默认值： <br/><br/> ServerAdmin you@example.com <br/><br/> ServerName 设定主机名称及端口号 <br/><br/> ServerName 可以让您设定您的主机名称，如果您没有主机名称，可以设定为您机器所使用的 IP。ServerName 会被用来重新转向网址，例如，当您输入一个网址 「http://www.example.com/dir」时，Apache 会参考您在 ServerName 中的设定，将 www.example.com 改成 ServerName，并在您所输入的网址后加上一个斜线「/」以连到 dir 目录中，也就是将网址转向到「http://www.example.com/dir/」。如果您的网址设定不正确，则使用者可能会连到一个不存在的地址。 <br/><br/> 所以，如果您没有主机名称，可以将这个值设定为 IP，让网址转向后还是可以连到正确的地方。在 ServerName 的设定中，我们也指定了 HTTP 的连接埠 80。 <br/><br/> ServerName www.example.com:80 <br/><br/> DocumentRoot 设定网页根目录 <br/><br/> DocumentRoot 可以让我们指定网页根目录的位置，也就是我们存放网页的目录。 <br/><br/> DocumentRoot "/usr/local/www/apache22/data" <br/><br/> 设定好 DocumentRoot 后，我们必须要再设定该目录的权限。在 DocumentRoot 之后，有下列区段：（中间有些#掉的注释） <br/><br/> Options Indexes FollowSymLinks 注解这项 <br/><br/> #Options Indexes FollowSymLinks <br/><br/> AllowOverride None <br/><br/> order allow,deny <br/><br/> Allow from all&nbsp;&nbsp;<br/><br/> 您必须将 也改成您的网页根目录位置。 <br/><br/> DirectoryIndex 指定预设网页档名 <br/><br/> DirectoryIndex index.html index.htm index.php index.php3 index.cgi index.pl <br/><br/> 当使用者使用网址「http://www.example.com/dir」连到一个目录中时，如果没有指定网页，Apache 会去查找 DirectoryIndex 中所设定的网页在不在，如果存在则秀出预设的网页。 <br/><br/> 加入 PHP 支持 <br/><br/> 如果您要使用 PHP，则必须在 httpd.conf 中加入 PHP 的支持，请在 httpd.conf 档案其它AddType周围加入下列内容，以便归类： <br/><br/> AddType application/x-httpd-php .php <br/><br/> AddType application/x-httpd-php-source .phps <br/><br/>取消 #AddHandler cgi-script .cgi 前的 # ,并加 .pl 以支持 cgi , pl 如: AddHandler cgi-script .cgi .pl <br/><br/>上述设定完成后，您就可以存盘离开。 接下来，我们必在修改 /etc/rc.conf ，并加入下列设定以在开机时启动 Apache： <br/><br/> apache22_enable="YES" <br/><br/> 重启虚拟机后，打开网页http://IP/ (请将 IP 改成您的虚拟机 IP)，显示It works!，不像原来，有个漂亮的页面。 <br/><br/> 我们可以在网页根目录中新增一个档案来测试 PHP 是否有正常运作，请使用文书编辑软件在/usr/local/www/apache22/data下开一个新文件 test.php，并加入下列内容： <br/><br/> <? <br/><br/> phpinfo();&nbsp;&nbsp;<br/><br/> ?> <br/><br/> 接下来您就可以连到该网页 http://IP/test.php (请将 IP 改成您的虚拟机 IP) 看看是否可以使用 PHP。如果有支持 PHP，则会显示 PHP 组态，如果没有，则只会出现上述档案内容。 <br/> <br/>7、 MySQL5.0.33 基本设定 <br/><br/> 修改 /etc/rc.conf 并加入下列这一行，以让开机时启动 MySQL： <br/><br/> mysql_enable="yes" <br/><br/> 接着您就可以使用下列指令启动 MySQL 了： <br/><br/> # /usr/local/etc/rc.d/mysql-server start <br/><br/> 启动 MySQL 后，我们就可以使用下列指令进入 MySQL 交互式命令列了： <br/><br/> # /usr/local/bin/mysql mysql <br/><br/> 若安装成功，你将看到以下画面：<br/><a href="http://www.zhanghaijun.com/attachment/month_0803/4200834201528.jpg" target="_blank"><img src="http://www.zhanghaijun.com/attachment/month_0803/4200834201528.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/> <br/>MySQL 刚安装完成时，并未设定 root 的密码，因此我们接着要设定 root 的密码并实时更新设定： <br/><br/> mysql> Update user SET password=password('你的密码') where user='root';&nbsp;&nbsp;<br/><br/> Query OK, 2 rows affected (0.01 sec) <br/><br/> Rows matched: 2 Changed: 2 Warnings: 0 <br/><br/> mysql> FLUSH PRIVILEGES; <br/><br/> Query OK, 0 rows affected (0.00 sec) <br/><br/> 最后请以 exit; 来离开 MySQL。 <br/><br/> 8、安装ZendOptimizer 3.2.8 <br/><br/> cd /usr/ports/devel/ZendOptimizer <br/><br/> make install clean <br/><br/> 根据提示，一直回答OK就可以了， <br/><br/> 9、FTP 基本设定（以便上传其它测试网页） <br/><br/> 在这里，我们使用内建的vsftp。 <br/><br/> 使用 inetd 的方式启动 FTP 服务器。首先，请编辑 /etc/inetd.conf，将 ftp 设定开头的 # 移除： <br/><br/> ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l&nbsp;&nbsp;<br/><br/> ftp stream tcp6 nowait root /usr/libexec/ftpd ftpd -l <br/><br/> 然后在 /etc/rc.conf 中加入 <br/><br/> inetd_enable="YES" <br/><br/> 接下来，我们重启虚拟机，就可以开始使用FreeBSD的FTP服务了。 <br/><br/> 10.经验教训 <br/><br/> 按本教程安装的话，不要改变安装顺序，否则会因为依赖关系而产生某些地方：少则要写几句多则某些东西要重装。&nbsp;&nbsp;<br/>Tags - <a href="http://www.zhanghaijun.com/tags/freebsd/" rel="tag">freebsd</a>
]]>
</description>
</item>
</channel>
</rss>