灵感的来临,没有任何预兆;灵感的消失,也不会有告别仪式;用文字记下她们吧,让灵感永存……

优秀的轻量级内容管理系统: CMS Made Simple

CMS Made Simple (简称CMSMS) 是一款轻量级的内容管理系统,旨在为静态内容为主的小型门户网站提供最简单最轻松的架站体验。

CMSMS 以不限深度的树型结构来组织内容,符合大部分场合的信息结构。这些内容通常是相对静态的,其内容、结构和访问方式不随着时间的推移而改变。相 比于早期的 HTML 静态页面组织方式,采用CMS系统可以把它们方便组织起来,便于维护。而且采用 CMS 可以将内容和表现分离,便于更新界面。CMSMS 还大量采用了缓冲机制,使得管理静态内容更加高效。CMSMS 的结构非常清晰,使用扩展模块或者模版主题等非常方便。同时,它的 news 模块可以用来组织新闻等基于时间排序的信息,支持分类。

正如 CMS Made Simple 所说,让内容管理变得简单。它的网站中的一句话也相当有意思:“So easy, it feels like take a holiday”,让网站建设像度假一样愉快。我觉得简单是它最重要的特性。不要小看了这个“简单”,很多曾经很优秀的软件在不断发展过程中失去了它的简单性,日趋复杂,让人望而生厌,比如RealPlayer和UltraEdit。最近在看的 Lua 语言就是一个很好的正面例子,它在不断变得强大的同时,始终保持着简单性,非常不容易。核心简单,同时可灵活扩展,是很多优秀软件的共同特征。

相比于现在几大主流的 CMS,比如 Joomla!、Drupal、Xoops、Plone 等,CMSMS在做小型门户方面更有优势,比如公司、团体或者某种机构的门户。之前考虑用Joomla! 来搭建山野协会的网站,但对它的单元和分类相当困惑,这种固定的三层结构很不适合表达协会的那些信息。虽然它也支持静态内容,却是没有结构的。多次觉得不爽之后,终于找到了 CMSMS 这个更加的构建平台,相见恨晚。

CMS Made Simple 的一些特点列举如下:

  • 简单的用户和组管理
  • 基于组的权限管理
  • 只能缓冲机制使得只需要从数据库中获取必须的信息
  • 完全的模版支持,不需改变任何内容就可以获得不限的表现形式
  • 简单的安装向导和升级
  • 最小的系统需求
  • 支持多语言的管理面板
  • 集成可选的所见即所得编辑器
  • 不限深度和大小的内容层次
  • 可选的自动生成目录
  • 集成文件上传和管理功能
  • 模块API支持无限扩展
  • 集成审查日志
  • 包括新闻模块
  • 包括RSS模块
  • 可以用简单的PHP代码来扩展管理功能
  • 友好的论坛和IRC支持

davies 发表于 2006 年 12 月 23 日 | 1 条留言

Gmail和Orkut注册再次升级

这两天把GMail和Orkut注册服务做了重要更新,主要在以下几方面:

  • 将后台程序改进为多进程和多线程安全的,提高了并发请求下的稳定性。之前的程序未考虑并发情况,会导致文件读些冲突而文件损坏和丢失数据。
  • 改进了验证GMail邀请有效性的算法,使得更新邀请和获取邀请更快捷。快速检验模式下,使用多线程进行并发测试,速度是原来的几十倍,但准确性降低,在批量检查的时候使用。
  • 添加了反机器人测试(CAPTCHA),防止GMail邀请被爬虫误取走。用PyCAPTCHA实现,很好用。
  • 对页面和后台程序做了改进,使得页面响应速度更快,为用户提供更好的体验。
  • 改变了服务的地址,现在统一用域名 http://www.daviesliu.net/ 进行访问,原来的地址仍然有效,但会重定向到 http://www.daviesliu.net/share/,做了友情链接的朋友麻烦更新。
  • 更改了提交GMail邀请的信箱为:gmail@daviesliu.net,这个更短更友好一些。它是使用Google Domain Mail 服务,本质上跟Share.Invitation@gmail.com是一样的。

现在系统的资源比较充足,感谢过去这一段时间内一直给本站发送邀请的朋友们,见页面的致谢。很可惜的是,早期的原始数据丢失,在此向那些朋友表示歉意,但邀请大部分已找回。

现在新注册的用户可能可以有50个邀请名额,对个人已经是足够了,希望在这里注册的用户能够将富余部分回馈本站,谢谢。如果以后GMail邀请资源紧张,可能会采取凭GMail邀请注册Orkut的方式,希望广大GMail用户多多支持。

davies 发表于 2006 年 09 月 15 日 | 13 条留言

Lighttpd+Squid+Apache搭建高效率Web服务器

架构原理

Apache通常是开源界的首选Web服务器,因为它的强大和可靠,已经具有了品牌效应,可以适用于绝大部分的应用场合。但是它的强大有时候却显得笨重,配置文件得让人望而生畏,高并发情况下效率不太高。而轻量级的Web服务器Lighttpd却是后起之秀,其静态文件的响应能力远高于Apache,据说是Apache的2-3倍。Lighttpd的高性能和易用性,足以打动我们,在它能够胜任的领域,尽量用它。Lighttpd对PHP的支持也很好,还可以通过Fastcgi方式支持其他的语言,比如Python。

毕竟Lighttpd是轻量级的服务器,功能上不能跟Apache比,某些应用无法胜任。比如Lighttpd还不支持缓存,而现在的绝大部分站点都是用程序生成动态内容,没有缓存的话即使程序的效率再高也很难满足大访问量的需求,而且让程序不停的去做同一件事情也实在没有意义。首先,Web程序是需要做缓存处理的,即把反复使用的数据做缓存。即使这样也还不够,单单是启动Web处理程序的代价就不少,缓存最后生成的静态页面是必不可少的。而做这个是 Squid的强项,它本是做代理的,支持高效的缓存,可以用来给站点做反向代理加速。把Squid放在Apache或者Lighttpd的前端来缓存 Web服务器生成的动态内容,而Web应用程序只需要适当地设置页面实效时间即可。

即使是大部分内容动态生成的网站,仍免不了会有一些静态元素,比如图片、JS脚本、CSS等等,将Squid放在Apache或者Lighttp前端后,反而会使性能下降,毕竟处理HTTP请求是Web服务器的强项。而且已经存在于文件系统中的静态内容再在Squid中缓存一下,浪费内存和硬盘空间。因此可以考虑将Lighttpd再放在Squid的前面,构成 Lighttpd+Squid+Apache的一条处理链,Lighttpd在最前面,专门用来处理静态内容的请求,把动态内容请求通过proxy模块转发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中Web程序来处理。经过Lighttpd和Squid的两级过滤,Apache需要处理的请求将大大减少,减少了Web应用程序的压力。同时这样的构架,便于把不同的处理分散到多台计算机上进行,由Lighttpd在前面统一把关。

在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,Squid可以启用内存来缓存,Apache可以启用MPM 等,并且每一级都可以使用多台机器来均衡负载,伸缩性很好。

实例讲解

下面以daviesliu.net和rainbud.net域下面的几个站点为例来介绍一下此方案的具体做法。daviesliu.net域下有几个用 mod_python实现的blog站点,几个php的站点,一个mod_python的小程序,以后可能还会架设几个PHP和Django的站点。而服务器非常弱,CPU为Celeron 500,内存为PC 100 384M,因此比较关注Web服务器的效率。这几个站点都是采用虚拟主机方式,开在同一台机器的同一个端口上。

Lighttpd服务于80端口,Squid运行在3128端口,Apache运行在81端口。

Lighttpd的配置

多个域名采用/var/www/domain/subdomain 的目录结构,用evhost模块配置document-root如下:

evhost.path-pattern        =  var.basedir + "/%0/%3/" 

FtpSearch中有Perl脚本,需要启用CGI支持,它是用来做ftp站内搜索的,缓存的意义不大,直接由lighttpd的mod_cgi处理:

$HTTP["url"] =~ "^/cgi-bin/" { # only allow cgi's in this directory
    dir-listing.activate = "disable"    # disable directory listings
    cgi.assign = ( ".pl"   =>  "/usr/bin/perl", ".cgi"  =>  "/usr/bin/perl" )
}

bbs使用的是phpBB,访问量不大,可以放在lighttpd(fastcgi)或者apache(mod_php)下,暂时使用 lighttpd,设置所有.php的页面请求有fastcgi处理:

fastcgi.server = ( ".php" =>  ( (  "host"  => "127.0.0.1", "port"=> 1026,  "bin-path"  =>  "/usr/bin/php-cgi"  )  ) )

blog.daviesliu.net 和 blog.rainbud.net 是用mod_python编写的blogxp程序,所有静态内容都有扩展名,而动态内容没有扩展名。blogxp是用python程序生成XML格式的数据再交由mod_xslt转换成HTML页面,只能放在Apache下运行。该站点采用典型Lighttpd+Squid+Apache方式处理:

$HTTP["host"] =~ "^blog" { 
    $HTTP["url"] !~ "\." {      
        proxy.server = ( "" => ( "localhost" => ( "host"=> "127.0.0.1", "port"=> 3128 ) ) )  #3128端口为
    }
}

share中有静态页面,也有用mod_python处理的请求,在/cgi/下:

$HTTP["host"] =~ "^share" {
    proxy.server = (
        "/cgi" => ( "localhost" => ( "host"=> "127.0.0.1", "port"=> 3128 )  )  
    )
}

Squid的配置

只允许本地访问:

http_port   3128
http_access allow localhost
http_access deny all

启用反向代理:

 httpd_accel_host 127.0.0.1
 httpd_accel_port 81                   #apache的端口
 httpd_accel_single_host on
 httpd_accel_with_proxy on          #启用缓存
 httpd_accel_uses_host_header on #启用虚拟主机支持

此方向代理支持该主机上的所有域名。

Apache的配置

配置/etc/conf.d/apache2,让其加载mod_python、mod_xslt、mod_php模块:

APACHE2_OPTS="-D PYTHON -D XSLT -D PHP5"

所有网站的根目录:

<Directory "/var/www">
   AllowOverride All     #允许.htaccess覆盖
    Order allow,deny
    Allow from all
</Directory>

基于域名的虚拟主机:

<VirtualHost *:81>
ServerName blog.daviesliu.net
DocumentRoot /var/www/daviesliu.net/blog
</VirtualHost>

这里明显没有lighttpd的evhost配置方便。

blog.daviesliu.net下的.htaccess设置(便于开发,不用重启Apache):

SetHandler mod_python
PythonHandler blogxp.publisher
PythonDebug On
PythonAutoReload On

<FilesMatch "\.">
    SetHandler None        #静态文件直接由Apache处理
</FilesMatch>

<IfModule mod_xslt.c>
    AddType text/xsl .xsl  #防止对xsl文件进行转化
    AddOutputFilterByType mod_xslt text/xml
    XSLTCache off
    XSLTProcess on
</IfModule>
Header set Pragma "cache"
Header set Cache-Control "cache"

在blogxp.publisher里面,还需要设置返回的文档类型和过期时间:

    req.content_type = "text/xml"
    req.headers_out['Expires'] = formatdate( time.time() + 60 * 5 )

经过这样的配置,所有站点都可以通过80、3128、81三个端口进行正常访问,80端口用作对外的访问,以减少负荷。81端口可以用作开发时的调试,没有缓存的困扰。

性能测试

由于时间和精力有限,下面只用ab2做一个并不规范的性能对比测试(每项都测多次取平均),评价指标为每秒钟的请求数。
测试命令,以测试lighttpd上并发10个请求 scripts/prototype.js 为例:

ab2 -n 1000 -c 10 http://blog.daviesliu.net:80/scripts/prototype.js

静态内容:prototype.js (27kB)

Con
Lighttpd(:80)
Squid(:3128)
Apache(:81)
1
380
210
240
10
410
215
240
100
380
160
230

可见在静态内容上,Lighttpd表现强劲,而Squid在没有配内存缓存的情况下比另两个Web服务器的性能要差些。

动态页面:/rss (31kB)
Con
Lighttpd(:80)
Squid(:3128)
Apache(:81)
1
103
210
6.17
10
110
200
6.04
100
100
100
6.24

在动态内容上,Squid的作用非常明显,而Lighttpd受限于Squid的效率,并且还要低一大截。如果是有多台Squid来做均衡的话,Lighttpd的功效才能发挥出来。
在单机且静态内容很少的情况下,可以不用Lighttpd而将Squid置于最前面。

davies 发表于 2006 年 09 月 9 日 | 15 条留言

掏宝网购物

早就听说掏宝网是个不错的网上购物方式,尤其是它的支付宝比较可靠,这几天终于实践了一下。

想买几本有关登山的书《北大山鹰社登山手册》和《中国登山圣经》,这种书发行量有限,一般的书店没有,某些网上商城有卖,却价格不菲。想到了掏宝,搜了一把,果然有人卖这两本书,《中国登山圣经》的最低售价是18元,加上5元邮费也就4折(原价58元),相对于一般书店的8.8折已经相当不错了。另外一本最低不到7折,包括邮费。

8号下了订单,第二天通过网上支付从中国工商银行的卡里往支付宝付费,这时候自己的钱花出去了,但对方并没有收到,暂存在支付宝那里。三天后收到了用快递方式送来的《北大山鹰社登山手册》,在网上确认之后,对方才真正拿到货款。如果没有收到货或者货不满意,可以要求退货,在卖家同意后可以拿回自己的钱,否则可以投诉。交易完成后,买卖双方还要互相做信用评价。

通过支付宝作为中介,很好地解决了网上交易的信用问题,使得互不相识的人也可以放心地进行网上交易了,尽情享受网上购物或者网上开店的便利。

,网上购物更方便安全

davies 发表于 2006 年 05 月 16 日 | 396 条留言

第 1 / 1 页