作者: 吴端辉
2005-07-19 10:36 AM
大家很清楚 Apache 大概是微软最头痛的对象之一。非常有趣的,微软执行长 Steve Ballmer 竟然在奥地利公开 承认 :「这是我们自己的错,如果我们不能提供足够的特点配上我们服务器软件的价位。当谈到在同一个服务器上同时提供数个网站时, Apache 就是比较好!( Apache is simply better )。」,那微软自家的 IIS 呢?有了这句话,一切尽在不言中。
Apache 人气节节上升
其实在 Linux (或其它 UNIX-Like 的 OS 中),有好几个不错的网页服务器,如 Apache 、 Zeus 、 Netscape ( SunONE )、 Notes/Domino… 等。其中, Apache 最受外界瞩目。
Apache 最早是美国伊利诺大学里国家超级电算应用中心( NCSA )的 Rob McCool 开发出来的,当初取这个名字以尊崇印地安人的高超战技与坚忍不拔的毅力。 Rob1994 年离开 NCSA 后,由 8 位热心的 Apache Group 成员继续维护,之后又正式成立了 Apache Software Foundation 。 Apache 是目前市占率最高的网页服务器。
目前几乎所有的商用 Linux 操作系统已事先内建( bundle )了 Apache ,当然使用者也可自行下载 原始程序 ,然后自行编译再进行安装。
如果选择自行编译并安装,初学者最常碰到的问题就是跟原有的档案搞混,而得出一些莫名其妙的结果。建议在编译时,特别小心路径处理,或者干脆先把原有的 Apache 移除掉(如 rpm -e apache ),再编译 Apache 程序。
模块化设计与开放
我个人认为, Apache 最棒的地方在于其模块化设计与开放,这具体表现在几个方面:
· 效能
在 Apache1.3 时,原始程序是由 25,000 个 C 程序组成。由于公开原始码,许多人贡献心力帮忙程序除错,而使该软件达至最佳化,因而效能表现特佳,也十分稳定。另一项好处是使用者可选择自已需要的模块再行编译,用不上的可不用编译或挂载,如此一来, Apache 执行效能可获得进一不的提升。例如,使用者可在 httpd.conf 档案中设定,决定使用 mod_php 、 mod_perl ,或是 mod_SSL 等模块。
· 安全性
在密码认证支持方面, Apache 内建 Basic 、 Digest 两种选择。密码储存部分, Apache 也早已支持 LDAP 、 MySQL 及 PostgreSQL 等,也允许使用者自行撰写密码认证的模块。
· 网址自动检查拼字
网友常常打了一长串的网址( URL )后只因少一个字;或多了一个字,或者是大小写搞错,结果经常找不到网页。 Apache 有一个很棒的功能就是可以自动检查拼字。不过,使用者必须手动启动( speling_module )。
· 自行修改核心
我曾经遇一家客户,这家公司的首页不是一个静态的网页,而是一个用 C 写的 CGI 程序,每次有人浏览这个网站时,可想而知的,该 CGI 程序就得自数据库抓取一堆数据。该网站经常当机,问题其实在于该 CGI 程序的负担太重,却又不愿意放弃这个功能。
后来,我们协助这家公司将该 CGI 功能移至 Apache 的核心模块之一( mod_perl )后,发现执行速度快了十多倍,而且当机频率也大幅降低。举例来说,当你使用数据库中内建的 MAX 函式,绝对会比自己另外写程序来找出最大值快得许多。
还有另一个案例是我们帮忙一家客户在 mod_perl 模块中整合某一个程序,将一个目录中提供下载的档案,全部都自动压缩成 zip 档案,以大幅减少客户下载的时间。其实,可以在 Apache 上发挥创意的地方太多,这只是其中一例。反观这些应用,在没有开放原始码的 IIS 中,是非常难以达成的。
· 内建 Proxy 功能
Apache 也有内建的 Proxy 功能,您可以自动启动相关模块( proxy_module )。
替代 IIS 的其它选择
实际上,网页服务器转换的最大的问题还是在动态网页。如 IIS 上相当重要的 ASP ,应该要怎么处理呢?别急,以下几个方案可酌参考。
· Java System ASP
前身原本是有名的 Chilisoft ,现为升阳旗下产品线的一员。 Java System ASP 可在 Linux 、 Solaris 及 Windows 上执行,支持 ASP 、 XML 、 vb script/Jscript 、 ODBC ,且可存取多种数据库。 Java System ASP 已与升阳旗下的 Java 网页服务器事先整合,但也有部分功能可在 Apache 上执行。
· PHP
LAMP ( Linux 、 Apache 、 Mysql 、 PHP )的组合已成为相当受欢迎的自由软件组合。 PHP 这个在 Apache 上执行的动态网页语言,提供的功能类似 IIS 上的 ASP 语言。使用者也可以考虑直接将 ASP 网页改写成 PHP 网页。 事实上,学习 PHP 网页就像 ASP 网页一样的容易。或者您也可以考虑另一个自由软件- asp2php ,其可以协助将 ASP 网页自动转换成 PHP 网页。当然,可想见这个方式并无法保证 100% 的成功率,但至少可节省不少时间。另有一个更简易的「 script2script 」可参考。
· JSP
像 PHP 一样, JSP 也是一个不错的选择。 JSP 是升阳重要的 Java 贡献之一,也可在 Apache 或升阳的 Java Web Server 之上执行。另有一个 asp2jsp 可将 ASP 网页自动转换成 JSP 网页。
· Perl
老牌的 Perl 语言在过去也是非常受到开发者欢迎的。创始人 Larry Wall 曾形容自己是个懒人,因而创造了这个简单的程序语言,用以节省撰写程序的时间。 Perl 在所有的网页服务器(不论是 IIS 或是 Apache ),或是操作系统(包括 MAC 、 Windows 、 UNIX 、 Linux… )之上都能够执行无误。
· ORACLE 9iAS Migration Kit for ASP
甲骨文旗下重要的产品,可以将 ASP 应用转换成 JSP ,而甲骨文也提供很好的数据库转换工具。当然,甲骨文的产品并不便宜。
转换会出现什么问题?
要由 IIS 转换到 Linux 上,当然无可避免的也会遇到一些问题。例如,静态网页与图文件的复制。这部分问题遭遇的问题通常较少,可慢慢手动复制,只要多花些时间耐心,当然也可使用 LSP 自动复制。
在目录权限与虚拟目录设定方面, Apache 已有完整支持。当然,一如 Samba ,必须对 Apache 的设定档案语法有些基本了解,或者可使用 Webmin 及 LSP 协助设定, LSP 可自动将 IIS 的设定自动转换到 Apache 上。
过去,在协助客户进行网页服务器转换时,经常发现客户有几个常犯的的错误,在此供各位参考。
· CGI 程序的权限
如果没有仔细设定 CGI 程序的权限,通常会得到一个「 Internal Server Erro 」的错误讯息,多数使用者常因此而一头雾水,不知哪里出错。这在 IIS 上是不太容易发生的。另一种极端的情况是卯起来将目录、档案权限全部设成 777 ,那么在安全上,恐怕又会制造出一个大漏洞。
· 忘了启动某些模块
Apache 的模块化相对也制造了一些可能出错的机会。例如,要使用 PHP 网页程序,别忘了在 httpd.conf 中启动 php_module 。尤其是若想使用某些旧的 php3 程序,就必须启动 php3_module 。另如 ssl_module 、 cgi_module… 等也应稍加注意。
· 密码认证
如前面所提及,常用的 Apache 密码共有 Basic 、 Digest 两种。 Basic 没有加密,使用时要格外小心;若选择 Digest 加密,经常会忘记启动 Digest 。还有,不支持 http 1.1 格式的浏览器遇到 Digest 密码将会出现错误。
· 大小写有关系
例如,在使用 FTP 上传档案时,常常会把档案小写传成大写,在 Windows/IIS 上档名,档案大小写并无差别,但用在 Linux 、 Unix 与 Apache 上可是大不相同。
· ASP 扩展名沿用?
前面已提及可用 PHP 、 JSP 或 Perl 取代原来的 ASP 网页。我们曾经执行一个项目,主要是从 ASP 转换至 PHP (非 LSP 标准功能),前后花费 2 个星期时间,才全部转换完毕。在测试过程中,我们发现很多自外部搜寻引擎连接至这些 ASP 档案的超级链接,全部都已失效。主要原因是因为 ASP 网页的 URL 结尾是 .asp ,而 PHP 网页的 URL 结尾是 .php 。
幸好, Apache 拥有强大的 URL 重写功能(不过要花一点时间了解),在设定好之后,可让所有 URL 完全不变(即便键入 xxx.asp ),还是可连结至最新的 PHP 网页。一如前面所提及,使用者也可自己写一个新模块,将所有要连接至 .asp 扩展名的 request ,重新导向( redirect )至 .php 网页之上。
一如其它服务器的转换一样,从微软的 IIS 到 Linux 的 Web Server 转换,不会是一蹴可几的任务,但是有了这么多 Open Source 的工具可供选择,及 Sun 、 Oracle 等大厂的加持,相信您对此应该已信心大增。最后,也要感谢微软执行长 Steve Ballmer 对 Apache 的大力赞扬。
--------------------next---------------------