2007年12月13日

测试你的主机的速度

attachments/200712/0702427018.jpg
Host-tracker是一家提供全方位网络测速的网站,分别从全球四十多个服务器访问你的网站,全方位的了解你的网站被访问情况,测速后分别给出访问结果、速度等数据,比较全面。
下面是http://www.Licess.Cn的部分测试结果:

attachments/200712/4887046518.jpg

该网站还提供了网站测试挂件,可在你的网站上实时进行检测。方法很简单,点击ADD,然后会出现代码,复制粘贴到你的网站就行了。
呵呵我没有挂,因为挂的东西太多了影响访问速度。有兴趣的朋友可以试一下。

  • » 阅读全文...
  • 2007年12月12日

    《程序员2007增刊——实战Web2.0》精彩预览之“指导篇”

    理解REST软件架构

        /骆古道

    一种思维方式影响了软件行业的发展。REST软件架构是当今世界上最成功的互联网的超媒体分布式系统。它让人们真正理解我们的网络协议HTTP本来面貌。它正在成为网络服务的主流技术,同时也正在改变互联网的网络软件开发的全新思维方式。AJAX技术和Rails框架把REST软件架构思想真正地在实际中很好表现出来。今天微软也已经应用REST并且提出把我们现有的网络变成为一个语义网,这种网络将会使得搜索更加智能化。

    RESTHTTP协议

    REST软件架构是由Roy Thomas Fielding博士在2000年首次提出的。他为我们描绘了开发基于互联网的网络软件的蓝图。REST软件架构是一个抽象的概念,是一种为了实现这一互联网的超媒体分布式系统的行动指南。利用任何的技术都可以实现这种理念。而实现这一软件架构最著名的就是HTTP协议。通常我们把REST也写作为REST/HTTP,在实际中往往把REST理解为基于HTTPREST软件架构,或者更进一步把RESTHTTP看作为等同的概念。

    今天,HTTP是互联网上应用最广泛的计算机协议。HTTP不是一个简单的运载数据的协议,而是一个具有丰富内涵的网络软件的协议。它不仅仅能够对于互联网资源进行唯一定位,而且还能告诉我们对于该资源进行怎样运作。这也是REST软件架构当中最重要的两个理念。而REST软件架构理念是真正理解HTTP协议而形成的。有了REST软件架构理念出现,才使得软件业避免了对HTTP协议的片面理解。只有正确的理论指导,才能避免在软件开发的实际工作过程中少走弯路。

    RESTURI(资源定位)

    REST软件架构之所以是一个超媒体系统,是因为它可以把网络上所有资源进行唯一的定位,不管你的文件是图片、文件Word还是视频文件,也不管你的文件是txt文件格式、xml文件格式还是其它文本文件格式。它利用支持HTTPTCP/IP协议来确定互联网上的资源。

    RESTCRUD原则

    REST软件架构遵循了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。其实世界万物都是遵循这一规律的:生、变、见、灭。所以计算机世界也不例外。这个原则是源自于我们对于数据库表的数据操作:insert(生)、select(见)、update(变)和delete(灭),所以有时候CRUD也写作为RUDI,其中的I就是insert。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。

    REST与网络服务

    尽管在Java语言世界中网络服务目前是以SOAP技术为主,但是REST将是网络服务的另一选择,并且是真正意义上的网络服务。基于REST思想的网络服务,不久的将来也会成为是网络服务的主流技术。REST不仅仅把HTTP作为自己的数据运输协议,而且也作为直接进行数据处理的工具。而当前的网络服务技术都需要使用其它手段来完成数据处理工作,它们完全独立于HTTP协议来进行的,这样增加了大量的复杂软件架构设计工作。REST的思想充分利用了现有的HTTP技术的网络能力。在德国电视台上曾经出现过一个这样的五十万欧元智力题:如何实现网络服务才能充分利用现有的HTTP协议?该问题给出了四个答案:去问微软;WSDL2.0/SOAP1.2WS-Transfer;根本没有。这个问题告诉我们HTTP并不是一个简单的数据传来传去的协议,而是一个聪明的会表现自己的协议,这也许是REST = Representational State Transfer的真正含义。

    实际上目前很多大公司已经采用了REST技术作为网络服务,如GoogleAmazon等。在Java语言中重要的两个以SOAP技术开始的网络服务框架XFireAxis也把REST作为自己的另一种选择。它们的新的项目分别是Apache CXF Axis2 Java语言也制定关于REST网络服务规范:JAX-RS: Java API for RESTful Web Services (JSR 311)。相信还会出现更多与REST相关的激动人心的信息。

    RESTAJAX技术

    尽管AJAX技术的出现才不到两年时间,但是AJAX技术遵循了REST的一些重要原则。AJAX技术充分利用了HTTP来获取网络资源并且实现了HTTP没有的对于异步数据进行传输的功能。AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又丰富,一个页面表现了丰富多彩的形态。

    AJAX技术还使用了一种不同于XML格式的JSON文件格式,这个意义在哪里呢?在REST软件架构下我们不能对于XML文件进行序列化处理,这样程序员必须要使用自己的XML绑定框架。而以序列化的JavaScript对象为基础的JSON已经获得了广泛认可,它被认为能以远比XML更好的方式来序列化和传输简单数据结构,而且它更简洁。这对REST是一个极大贡献和补充。

    当前的网络应用软件还违背了REST的“无状态服务器”约束。REST服务器只知道自己的状态。REST不关心客户端的状态,客户端的状态自己来管理,这是AJAX技术的应用之地。通过AJAX技术,可以发挥有状态网络客户机的优势。而REST的服务器关心的是从所有网络客户端发送到服务器操作的顺序。这样使得互联网这样一个巨大的网络得到有序的管理。

    RESTRails框架

    Ruby on Rails框架(简称Rails或者Rails框架)是一个基于Ruby语言的越来越流行的网络应用软件开发框架。它提供了关于REST最好的支持,也是当今应用REST最成功的一个软件开发框架。Rails框架(从版本1.2.x起)成为了第一个引入REST作为核心思想的主流网络软件开发框架。在Rails框架的充分利用了REST软件架构之后,人们更加坚信REST的重要性和必要性。Rails利用REST软件架构思想对网络服务也提供了一流的支持。从最直观的角度看待REST,它是网络服务最理想的手段,但是Rails框架把REST带到了网络应用软件开发框架。这是一次飞跃,让REST的思想从网络服务的应用提升到了网络应用软件开发。利用REST思想的simply_restful插件已经成为了Rails框架的核心内容。

    REST安全性

    我们把现有基于SOAP的网络服务和基于REST/HTTP网络服务作个比喻,前者是一种传统的寄信方式,而后者是现代网络的电子邮件方式。要是寄信和电子邮件都有病毒存在的话,传统的寄信被送到对方就很危险,而电子邮件是开发的,电子邮件供应商比如Google为我们检查了电子邮件是否有病毒。这里并不是说明SOAP网络服务消息容易包含病毒,而是说明HTTP是无法处理SOAP信息包究竟好不好,需要额外的软件工具解决这一问题,包括防火墙也用不上和管不了。

    REST/HTTP网络服务的信息包可以被防火墙理解和控制。你可以按照操作和链接进行过滤信息包,如你可以规定从外部来的只能读取(GET操作)自己服务器的资源。这样对于系统管理员而言使得软件管理更为简单。REST的安全性还可以利用传输安全协议SSL/TLS、基本和摘要式认证(Basic und Digest Authentication)。除了这些REST自身的安全性功能外,还可以利用像基于信息的Web Services SecurityJSR 155)作为REST不错的补充。

    作者简介:骆古道,网名Cnruby,八十年代初毕业于西北工业大学数理力学系,1988年公派留学德国,从事组合最优化理论研究,从九十年代初期起一直致力于计算机领域软件开发、设计和管理等方面工作,个人博客为道喜技术日记”。

  • » 阅读全文...
  • 2007年11月20日

    网站编程ASP+PHP+JSP+JS技术手册文章

    网站编程ASP+PHP+JSP+JS    内容很全面
    点击下面网址:
    http://www.licess.cn/web/

  • » 阅读全文...
  • 2007年11月14日

    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置于最前面。

  • » 阅读全文...
  • 2007年11月6日

    htaccess 的一些用法

    屏蔽访问

    order allow,deny
    deny from abc.com //屏蔽来自 abc.com 的访问
    deny from 192.168.1.1 //屏蔽 IP 为 192.168.1.1 的访问
    deny from 192.168.1. //屏蔽 IP 范围在 192.168.1.0~192.168.1.255 的访问
    allow from all //屏蔽所有的访问来源

    防盗链

    RewriteEngine on
    RewriteCond %{ HTTP_REFERER } !^http://(www.)?mydomain.com/.*$ [NC]
    RewriteRule .(gif|jpg)$ - [F]

    也可以指定被盗链图的替换图(顺便打打广告什么的),那么上边这段代码最后一行改为

    RewriteRule .(gif|jpg)$ http://www.mydomain.com/替代图片文件名 [R,L]

    地址转向

    旧的URL自动转向到新的地址:
    Redirect /旧目录/旧文档名 新文档的地址

    或者整个目录的转向:
    Redirect 旧目录 新目录

    定义缺省的首页文件

    DirectoryIndex 新的缺省文件名

    也可以列出多个,顺序表明它们之间的优先级别,例如:
    DirectoryIndex index.html index.php default.htm

  • » 阅读全文...
  • 2007年11月5日

    Lighttpd上安装WordPress

    我写篇日志是想记录一下,怕以后不用的时候就忘了。

    其实很早就听人说lighttpd是一个轻量级的Web服务器,今天试了一下,果然名不虚传,在我装上后,运行Wordpress 的同时,内存只占用4.100k,然后我又启动了Apache,也运行Wordpress作为测试,内存达占用13.116k,不管怎么样,lighttpd还是无法被大的稳定的服务器所采用,但是作为个人测试使用,那就相当的不错了。

    接下来说一下怎么安装lighttpd,我是在windows下面测试的,为了简单我还是找了一个套件包:
    WLMP Version: 1.1.4 主要包含以下功能
    - LightTPD 1.4.16
    - MySQL 5.0.45
    - PHP 5.2.3
    - MiniPerl 5.8.8
    - OpenSSL 0.9.8e
    - phpMyAdmin 2.10.3

    本站下载:下载文件WLMP-Standard-1.1.4.1165-Win32-HUN.zip (0 Byte , 下载:6次)(最新版,高速下载!!实时更新 )

    官方下载地址在:http://wlmp.dtech.hu/
     

    下载好后,执行安装程序,然后让你选择安装的目录,安装到最后会提示你重新启动计算机,你选择是好行了。

    接下来安装wordpress,同样到官方下载,解压到lighttpd的www目录中,我的WLMP安装在D盘上,所以我将wordpress放到D:WLMPHTDOCSwp中,HTDOCS为根目录,其它与Apache都是一样的,Wordpress的Permalinks设置与在apache中是不一样的,因为lighttpd不支持.htaccess文件,所以要改lighttpd.conf文件来实现地址重写功能。

    在D:WLMPLightTPDconf中找到lighttpd-inc.conf,本来默认的文件应该是lighttpd.conf,可是在WLMP中,她被改名为lighttpd-inc.conf,然后在文件是找到


     
    CODE:

    1. #server.error-handler-404   = "/error-handler.php"

    这样的语句,在后面加上一句


     
    CODE:

    1. server.error-handler-404   = "/wp/index.php"

    同时记得把前面的#号去掉哦,这句的意思是说,当请求的文件不存在的时候就调用wp/index.php文件。

    下面加入重写规则,首先找到 #"mod_rewrite",然后把前面的#号掉,表示启动这个插件,接着查找url.rewrite,你会找到一条信息,当然我用的是WLMP并且版本号是1.4.16,如果你使用的是别的版本或不是WLMP套件,那我就不敢保证一样的了,不管怎么样找到相关的定义就行了,或查找#### url handling modules (rewrite, redirect, access),也可以,找到后在下面加一行:


     
    CODE:

    1. url.rewrite = ( "^/(archives|categories|comments|feed)/" => "/index.php" )

     

    这样就大功告成了,其实比Apache的重写规则还要简单,这两天我主要在研究lighttpd的virtual hosts设置部份,很多人说像鸡肋,不过我还是想了解一下,有什么心得我会写出来的!!!

  • » 阅读全文...
  • 2007年10月22日

    如何301域名重定向

    这是一篇针对新手(还有我这样不熟悉reg express的人)的文章,熟悉urlrewrite的请跳过。

    有的时候我们可能需要换域名,但是换域名的同时也会带来很多麻烦,最大的麻烦就是链接丢失,所以这个时候就要用到301 重定向了,我以前看到很多的重定向仅仅是将主域名定向,而没有将具体的链接也对应的定向过去,如www.old.com/sub/sub.html均定向到www.new.com,这样其实是很不友好的,下面这个例子就可以将老地址定向到对应的新地址:
    在web根目录下建立一个文件 .htaccess,然后写入类似下面的代码

    1. RewriteEngine on
    2. rewriteCond %{http_host} ^storyday.com
    3. rewriteRule ^(.*)$ http://7tiger.com/blog/$1 [R=301,L]
    4. rewriteCond %{http_host} ^www.storyday.com
    5. rewriteRule ^(.*)$ http://7tiger.com/blog/$1 [R=301,L]

     

    第一行表示开启urlrewrite
    第二三行表示将 storyday.com/后面的任何链接形式定向到 7tiger.com对应的链接 如storyday.com/html/36.html将会对应到7tiger.com/html/36.html
    第四五行则是将带有www的域名也给加上定向。

  • » 阅读全文...