Archive for 四月, 2010

Livezilla安装配置, APE(Ajax Push Engine)安装配置


25 4月

——菜鸟 Linux 服务器搭建 随笔 连载之十

上周的后半搞了下livezilla,貌似没什么特别的难度,跟着官网的教程,一步一步下来就ok了。 值得注意的是,livezilla的特别之处在于它先下主程序到windows上面,然后再用这个主程序配置服务端(通过ftp上传)。 livezilla的所有东东貌似都是php+mysql就可以搞定的,所以没有任何服务器上需要特别配置的东西。 安装帮助直接看官网:http://www.livezilla.net/installation/en/ 有视频教程,没啥好说的。 不知道livezilla是什么的,也直接看官网介绍吧。反正看下来最好用的即时通讯客服系统了,比国内那些第三方收费的强多了,全免费,无广告,很好,很强大。 p.s. 好吧,不收费是噱头,还是有进阶功能收费的说~ ——————————————APE分割线—————————————— 嗯,比起livezilla这个小case,APE应该有更多好玩的地方了吧。 废话不多,直接到APE官网下下来先。 安装很简单,解压后,进到ape-server目录,里面有各种类型的安装程序,足够满足各种系统的了。 我是64bit fedora,所以:(其他可以看这里
rpm -Uvh APE_Server-1.0.x86_64.rpm
就完成了基本的server端安装,如果要做成daemon的话,官网也提供了全套的方法,看这里。 貌似不是里面的所有步骤都需要做,只要把下面的script写到/etc/init.d/aped里面,然后
chkconfig --add aped
就可以了,至少对我是这样^ ^ 启动:/etc/init.d/aped start 搞定。 暂时至此。明天上班继续。喵~

Script

  1. #! /bin/sh
  2. # /etc/init.d/aped
  3. #
  4. # chkconfig: 2345 85 15
  5. # description: APE Daemon
  6. # processname: APE Daemon
  7.  
  8. #
  9. # Install the service with chkconfig --add aped
  10. #
  11.  
  12. # Define where ape is installed.
  13. # The trailing slash is required ( Example : /my/path/bin/ )
  14. APE_DIRECTORY=/etc/ape/
  15.  
  16. # Define the PID File
  17. PIDFILE=/var/run/aped.pid
  18.  
  19. # Source function library.
  20. . /etc/init.d/functions
  21.  
  22. DAEMON="/usr/bin/aped --cfg ${APE_DIRECTORY}ape.conf > /dev/null"
  23.  
  24. start() {
  25.  
  26.         echo -n "Starting APE... "
  27.  
  28.         cd $APE_DIRECTORY;
  29.         daemon $DAEMON
  30.         RETVAL=$?
  31.         echo
  32.         [ $RETVAL = 0 ] && touch /var/lock/subsys/aped
  33.         return $RETVAL
  34. }
  35.  
  36. stop() {
  37.         echo "Stopping APE..."
  38.         killall aped
  39.         RETVAL=$?
  40.         echo
  41.         [ $RETVAL = 0 ] && rm -f /var/lock/subsys/aped
  42. }
  43.  
  44. case "$1" in
  45.     start)
  46.         start
  47.         ;;
  48.     stop)
  49.         stop
  50.         ;;
  51.     restart)
  52.         stop
  53.         start
  54.         ;;
  55.     *)
  56.         echo "Usage:  {start|stop|restart}"
  57.         exit 1
  58.         ;;
  59. esac
  60. exit $RETVAL
————————————2010/5/14———————————— 上次搭好基本的APE后,最近零碎的弄了一点,第一步当然是玩hello world了,官网有详细的教程,不多赘述,按步骤来就ok了。 值得注意的是,APE会去请求类似0.ape.XXX,1.ape.XXX,一直到9.ape.XXX,后面的XXX就是在配置文件中和服务器方面配置的ape域名,也就是说他会自动加上一级子域名,从数字0-9,这个东东困惑了一段时间,原来在APE高级设置里面有写到,要把这些*.ape.XXX的东东都要做好绑定。于是hello world就ok了。 接下来就是要看进阶细节的东东了,APE的实现分为server端和client端两部分代码(废话  – -),比如client端放在/home下的某个目录(像默认的demo,ape-jsf之类的)对外访问,而server端默认demo在/var/ape中,server端的目录位置自然是可以修改的,在/etc/ape/javascript.conf中即可修改。 To be continued。。。

Coreseek(Sphinx) MMSEG 自制词库(附源码)


21 4月

——菜鸟 Linux 服务器搭建 随笔 连载之九

继上次之后玩弄sphinx后,突然发现,原来她并不支持类似摘要的功能,囧。我还真是后知后觉。起初还难以置信,之后看了官网相应FAQ 后,发现确是如此,看来我被lucene搞混了,还以为都有的呢 - - 小小郁闷了一下,顺便又回头看了下lucene,zendframework的那个纯php的lucene貌似还是不合适,php的效率比较堪忧,另外他还致命的不支持分布式的存储,唉。正纠结是不是要去研究下java lucene的时候,看到一篇文章研究,表明在主键索引的mysql中用主键去搜索,效率还是异常高的,千万级的数据基本是0.0x秒级别的速度。就不知道联表后会如何了,不知道用mysql的view会不会效率慢。另外lucene的索引速度比sphinx要慢9倍之多! 下面是一个简单的词库制作的东东,因为上次听说如果词库里面有重复的词会报错来着, 建个表先: CREATE TABLE IF NOT EXISTS `yoowords` ( `word` varchar(255) NOT NULL, `file` varchar(255) NOT NULL, `freq` int(10) unsigned NOT NULL DEFAULT '1', `type` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`word`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 然后把http://www.sogou.com/labs/dl/w.html和http://wubi.sogou.com/dict/list.php?c=306&page=3自己喜欢的词库txt的下载下来。放到某个目录(我是dict) 导入的php: $link = mysql_connect("fedora2", "sphinx", "sstsst") or die("Could not connect: " . mysql_error()); mysql_select_db('mmseg') or die('Could not select database'); if ($handle = opendir('./dict')) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { echo "$file\n"; $lines = file("./dict/$file"); foreach ($lines as $line_num => $line) { $words = (array)explode("\t",$line); $result = mysql_query("SELECT * from yoowords where word = '".$words[0]."'"); if(!mysql_fetch_row($result)){ mysql_query("insert into yoowords values('".$words[0]."','".$file."','".$words[1]."','".$words[2]."')"); } } } } closedir($handle); } 导出的php: $link = mysql_connect("fedora2", "sphinx", "sstsst") or die("Could not connect: " . mysql_error()); mysql_select_db('mmseg') or die('Could not select database'); $filename = 'words.txt'; if (!$handle = fopen($filename, 'x')) { echo "不能打开文件 $filename"; exit; } $result = mysql_query("SELECT * from yoowords"); while($row = mysql_fetch_row($result)){ $words.= preg_replace("/[ \f\n\r\v]/","",$row[0]."\t".$row[2])."\nx:".$row[2]."\n"; } if (fwrite($handle,$words) === FALSE) { echo "不能写入到文件 $filename"; exit; } fclose($handle); 暂时,至此。

Coreseek(Sphinx)中文分词设置,MySql默认编码设置&自动SET NAMES utf8


11 4月

——菜鸟 Linux 服务器搭建 随笔 连载之八

嗯,这两天休息在家,周六基本荒废掉了,不记得干了点什么,今天早上6点多莫名其妙醒了睡不着了,于是断断续续接着弄了点搜索引擎,结果过了会又睡着了,之后醒了就去老婆家陪她了,嗯,现在回家都弄好了,顺便记录一下,再睡一觉估计我就得忘光了,唉,脑子不灵光啊。。。 在开始写搜索引擎相关之前,先记录一段关于mysql编码的设置,现在一般编码全部是utf8了,而每次查询前set names utf8还是很浪费资源的,所以看了下,似乎set names utf8等于是: SET character_set_client = utf8; SET character_set_results = utf8; SET character_set_connection = utf8; 于是查了下,如何默认设置这几个东东utf8,只要在/etc/my.cnf中相应位置加入: [mysqld] default-character-set=utf8 [client] default-character-set=utf8 就可以了。ok,下面继续将搜索引擎,上面的mysql设置对coreseek也是很有用的,也是为用中文分词utf8时所准备的。 (注意,我所有的东西都以utf8为基础讲的,如果你还在用nc的gbk,我会无视你) P.S. 关于mysql的这些文末还有补充(2010/4/12)。 coreseek的中文分词设置很简单, 只需要修改/usr/local/coreseek/etc/csft.conf中的charset_type = zh_cn.utf-8, 同时必须添加一行charset_dictpath = /usr/local/coreseek/dict即可,这一行是字典文件的路径, 要用中文分词,必须设置这两行!缺一不可! 默认的字典文件在coreseek安装文件目录下的mmseg/data/中,复制其中的uni.lib到上面说的dict目录就好了。 如果像我一样索引时报了找不到mmseg.ini文件的错误的话,就复制mmseg安装目录中的src/win32/mmseg.ini到dict目录即可。 下面是自己做字典文件的方法,摘自coreseek官网: (比如使用搜狗的词库改造之类的) mmseg -u unigram.txt 该命令执行后,将会产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完成词典的构造。需要注意的是,unigram.txt 必须为UTF-8编码。 词典文件格式: .... 河 187 x:187 造假者 1 x:1 台北队 1 x:1 湖边 1 ...... 其中,每条记录分两行。其中,第一行为词项,其格式为:[词条]\t[词频率]。需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率需要在大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。第二行为占位项,是由于LibMMSeg库的代码是从Coreseek其他的分词算法库(N-gram模型)中改造而来的,在原来的应用中,第二行为该词在各种词性下的分布频率。LibMMSeg的用户只需要简单的在第二行处填"x:1"即可。 用户可以通过修改词典文件增加自己的自定义词,以提高分词法在某一具体领域的切分精度,系统默认的词典文件在data/unigram.txt中。 分词 mmseg -d tobe_segment.txt 其中,命令使用‘-d’开关指定词库文件所在的位置,参数dict_dir为词库文件(uni.lib )所在的目录;tobe_segment.txt 为待切分的文本文件,必须为UTF-8编码。如果一切正确,mmseg会将切分结果以及所花费的时间显示到标准输出上。 查到个资料表明,如果要合并某个词库到默认词库的话,直接按格式贴到后面还不够,还必须去掉重复的项,否则会报错,所以明天可能会写个程序合并下默认词库和搜狗词库试试,具体代码(如果有的话)到时候再贴。 下面贴一段暂时没用到,以后可能有用的东东,也是上面自制字典同一个位置的内容: 对特殊短语的支持 由于LibMMSeg是为Sphinx全文搜索引擎设计的,因此其内置了部分搜索引擎切分算法的特性,主要表现在对特殊短语的支持上。 在搜索引擎中,需要处理C++时,如果分词器中没有词组C++,则将被切分为C/x +/x +/x,在进一步的检索中,可能每个词会由于出现的过于频繁而被过滤掉,导致搜索的结果与C++相关度不高不说,也严重影响的全文搜索的速度。在LibMMSeg中,内置对特殊短语的支持。 其输入文件格式如下 // test commit .net => dotnet c# => csharp c++ => cplusplus 其中左侧是待支持的特殊短语,右侧是左侧的特殊短语需要被转换为的短语。这一转换在分词前进行。 可以在行的开头加入'//'作为注释符号,发现符号'//'后,整行将被忽略。 特殊短语词库构造命令: mmseg -b exceptions.txt 其中, 开关'-b'指示mmseg是要构造特殊短语词库;exceptions.txt是用户编辑的特殊短语转换规则。 该命令执行后,将在当前目录下产生一个名为"synonyms.dat"的文件,将该文件放在"uni.lib"同一目录下,分词系统将自动启动特殊短语转换功能。 注意: 1、在启用了该功能后,如果分词系统发现了一个特殊短语,将直接输出其在右侧对应的替换的值; 2、右侧被替换的值,请保证不会被分词器进行切分。(eg. C++ => C# 这个转换的意义不大,并且可能导致C++这个短语永远无法被检索到!) 嗯,暂时就这么多吧。目前为止,中文搜索似乎是ok了,但是用putty直接运行search的时候,返回的中文会是乱码,不知道原因ing,可能用php去调会好,后续有情况再记录。 明天争取合并了词库,并且完成用php查询的实验,如果能完成增量索引的概念则更佳,^ ^ That's all for today. ————————2010/4/12分割线———————— 今天到公司尝试了下php的api之类的,昨天mysql的编码问题其实并没有彻底解决,发现csft.conf里面还是加了 sql_query_pre = SET NAMES utf8 才能正常读中文的东东,于是查了些资料,参考了下公司的mysql设置, 发现,原来mysql4.1.2开始支持一个叫init_connect的参数了,也就是默认链接时运行的语句,只要 [mysqld] init_connect='SET NAMES utf8' 就可以了, 但是,必须注意的是,如果链接mysql的用户是super权限的话,这个设置是无效的!!! 希望和我一样偷懒用root链接的朋友注意了。csft.conf 中换了普通权限的用户后,一切正常了,昨天所有乱码问题全部迎刃而解了。^ ^

Coreseek(Sphinx)安装


08 4月

——菜鸟 Linux 服务器搭建 随笔 连载之七

昨天终于抽时间装了下sphinx,曾经一直关注的一个开源搜索引擎,而Coreseek可以说是国内对sphinx整合最好,支持最好的一个中文站了。coreseek在4月1日正好推出了新的版本3.2,基于最新版的sphinx 0.9.9。coreseek官网上安装说明比较详细,以下贴上较主要的一些:

依赖环境安装: Debina等使用deb系统: aptitude -y install yum glibc-common build-essential libtool autoconf automake mysql-client libexpat-dev Centos等使用yum系统: yum -y install glibc-common libtool autoconf automake mysql-devel expat-devel BSD系统: pkg_add -r libtool autoconf automake mysql5-client iconv 下载解压: wget -d http://www.coreseek.cn/uploads/csft/3.2.3/csft_3.2.tar.gz tar xzvf csft_3.2.tar.gz 先装mmseg: cd csft3.2-3_2/mmseg 官网上autoconf那些似乎不是必须的,直接: ./configure --prefix=/usr/local/mmseg3 make make install cp -f src/*/*.h /usr/local/mmseg3/include/mmseg/ 然后装coreseek: cd .. ./configure --prefix=/usr/local/coreseek --enable-id64 --without-python --with-mysql --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ make make install 附加: 如需启用python支持,请安装或者升级至python2.6,configure之中,去掉--without-python,加上--with-python,然后重新编译安装 至此安装就over了。然后可能会有人需要用到mysql的spinxse引擎,搜了下安装方式,使用 plugin 方式,不需要重新编译 mysql,但是需要 mysql 的 src 包 。 分别到mysql和sphinx官网把相应的src包下载过来,记得版本一定要和你系统里的一致。 tar zxvf mysql.5.1.44.src.tar.gz tar zxvf sphinx.0.9.9.src.tar.gz cd mysql.5.1.44 mv ../sphinx.0.9.9/mysqlse storage/sphinx BUILD/autorun.sh ./configure --with-big-tables cd storage/sphinx make -j4 cp .libs/ha_sphinx.so /usr/lib/mysql/plugin (我64位系统这个目录就变成了/usr/lib64/mysql/plugin) mysql -p mysql> install plugin sphinx SONAME 'ha_sphinx.so'; mysql> show engines; 以上,环境基本完毕。今天继续后续实验。

Zend Server,http.conf,Mysql,Chive


05 4月

——菜鸟 Linux 服务器搭建 随笔 连载之六

清明休息这几天,断断续续弄了一点,嗯,上次之后装了zend server,挺顺利的,不过因为装fedora系统的时候,选择了server里面的apache和php等,于是装完zend server就有2个地方有相应的程序和配置文件了,于是作为一个超级纠结有洁癖的NC小孩,我重开了一个新的fedora虚拟机,这次没选自带的apache,嗯,第N次装好zend server和svn等等配置,很顺利,这下完美了。不过偷了个懒,svnserve直接用root跑了,貌似方便许多,反正自己机器上的虚机就自己用而已。顺便提一句,zend server跑apache似乎是用daemon这个用户的,所以我把/home下的目录都归daemon了。

一开始还用zend server目录里的apache程序去启动服务,还在想怎么启动zend的那些gui等等,后来发现,原来 /usr/local/zend/bin/zendctl.sh 这个东东可以直接批量启动zend server相关的一切服务,用法一样,直接后面跟start之类的就可以了。

之后就是设置http.conf了,在zend server的apache conf目录里面,除了http.conf外,下面还有个extra目录,里面是一些可以被http.conf引用的额外配置文件,嗯,我搞了下vhost那个,虚拟主机还是需要的,贴个示例以备记录:

<VirtualHost *:80> ServerAdmin m@jjw.in DocumentRoot "/home/chive" ServerName chive.jjw.in ErrorLog "logs/chive-error_log" CustomLog "logs/chive-access_log" common </VirtualHost>

接下来是mysql了,一开始找了半天mysqld,运行了下,不过酱紫每次启动去运行似乎不太对,鬼使神差的找到了传说中的chkconfig命令,嗯,似乎只要chkconfig mysqld on,就可以开机直接启动了。

然后这次用烦了phpmyadmin,就想看看有没有其他选择,于是找到了chive这个东东,似乎比phpmyadmin强大一些,界面漂亮不少,然后可以高亮sql语句的,还可以直接在界面看到触发器和存储过程,似乎很实用,这东西很容易装,不多赘述了。

Ok,这些天差不多就是这些了,嗯,基本的环境差不多了,没怎么深入,接下来看要先进行什么了。

Todo:1. 搜索引擎   2. APE   3.Livezilla  4. 新的ZF架构

Fedora Vmware7.0 安装, SVN hooks


01 4月

——菜鸟 Linux 服务器搭建 随笔 连载之五

昨天删了原来那个残破的CentOS,开装fedora。 安装的时候碰到一点小问题,VMware7无法自动认出fedora12的样子,网上查了下,在settings的option的general里面,operating system选一下linux,version里面选other linux 2.6.x kernel 64bit就可以装了。 这次在安装的时候,customize了一下software,把需要的服务器组建等等都选上了,酱紫貌似会方便很多,上次装CentOS的时候,就偷懒没选,似乎吃了点亏,连gcc都得自己按。这次吸取教训。 嗯,之后一切顺利。 按完之后就想先装svn,毕竟前两天就死在这上面的,不过抱着侥幸的心里,yum list了一下subversion,米想到。。。居然。。。直接就有1.6.9最新版的!!!这。。。yum install subversion。。。 好吧,我就这么无脑的成功按上了。。。 之后按前几天查到的东东配置了下,报了个错,意思是说sqlite版本有点低,于是无脑 yum update sqlite,完了后,似乎就好了,不过后来有的地方又报了这个错(具体英文忘记了,反正意思是运行的版本是低版本的,但潜层意思里面是说系统已经装了新的版本),思索着可能装完了没重启sqlite,不过又不知道怎么重启,于是直接reboot。。。 哦,对了,重启前顺便写了下/etc/rc.local,保证开机时svnserve会自动起来,另外还写了一句vsftpd,让ftp默认起来。 启动后一切正常,svn可以使用了。。。ftp和前次centos上也没区别,直接可以用了。传了zendserver上去,没有装,其他也还没弄,忙着公司网站上版本,就暂告段落了,直到今天才记录下来这些东东。顺便开始今天的折腾。 ——————————————今天的分割线————————————————— 今天目标是搞定svn的hooks,没有查太多的资料,直接看了下配置目录下的hooks目录,里面有很多tmpl文件。 似乎各种情况下的hooks说明都在其中了。 我们公司的svn服务器是commit后自动更新web服务器/home下的相应目录,达到同步web服务器目录的效果。 偶要达到的效果更简单,更新本机的/home目录就ok了。 于是在post-commit文件里面加了一句: /usr/bin/svn update --username jjw --password jjwjjw /home/jjw 就ok了,其中要注意的是,似乎hooks里面的脚本不会认$PATH,而且记得把post-commit的执行权限开开。 之后安全考虑,想说把svn所有服务不要用root启动,开始是想建一个svn组和用户,结果后来考虑到/home下的目录所有者会是apache,那执行post-commit的人要对那个目录有权限,那也最好是apache了,所以最后改为用apache用户去开启svnserve守护进程。 这其中遇到一个问题,都改完了后貌似会报错(其实也不是报错,就是类似保存密码之类的提示卡住了),查了点资料,好像是因为找不到/root/.subversion/svnserve引起的,最后post-commit中的命令改为: /usr/bin/svn update --config-dir /root/.subversion --username jjw --password jjwjjw /home/jjw 注意不要写全/root/.subversion/svnserve,svnserve必须略去,否则会自动多加。 顺手把/etc/rc.local中的启动项都用sudo -u改为其他用户启动。至此一切OK。 明天准备配下zendserver,组合起来后,就可以形成一个开发测试环境了,之后就可以开始偶的研究工作啦。唉,看来搞服务器偶还是不太行啊。 喵的,希望之后一切顺利吧。。。

貓熊寶寶幼齒園

姜經緯的博客