五千年(敝帚自珍)

主题:【原创】基于Linux内核的开放源代码操作系统的组成:第一篇 -- 请尽量

共:💬75 🌺106
全看分页树展 · 主题 跟帖
家园 【原创】基于Linux内核的开放源代码操作系统的组成:第四篇

第四篇:网络服务器

但凡说起Linux在服务器上的应用,都要从LAMP开始。LAMP是四个软件系统“Linux、Apache、MySQL和PHP(巧了,另外两种常用于Web的编程语言Perl、Python也是P打头)”的缩写。这四个软件系统放在一起,可以说是开发网站的黄金组合。Linux做操作系统,提供了一个坚实的基础:Linux内核拥有号称是最完整的IPv4、zero-copy和sendfile最大限度地减少了在核心态与用户态之间的上下文切换、2.6版的内核进程调度算法更是优化了对大数目并发用户的支持。

在Linux上,Apache的HTTPD是当之无愧的第一选则,虽然不是唯一的选择。作为自由软件的旗帜之一,Apache HTTPD源自于美国National Center for Supercomputing Applications开发的public domain HTTP daemon。1995年4月,在NCSA HTTPD 1.3版的基础上,Apache HTTPD的第一个正式版发行了。在不到一年的时间里,Apache HTTPD就成了最流行的HTTP服务器。这个殊荣从那时一直保持到了现在。

和其他HTTP服务器相比,Apache最大的特点可能就是其非常优异的可扩展性(extensibility)。可以从两个方面对Apache HTTPD进行扩展。Apache把处理HTTP请求的过程分解为一系列的步骤,如URL到路径名的映射、认证、授权、送出应答、logging等。所有这些步骤都定义了一个“钩子”,服务器端的应用程序可以往上挂自己的函数,对这个过程特殊处理。与CGI相比,这些钩子函数的效率要高很多。标准的CGI程序必须运行在另外一个进程里,启动进程和在进程间通信的代价都很大。而钩子函数就在HTTPD的进程内,不需要启动新进程,调用函数的成本几乎可以忽略不计。

在另一个方面,Apache定义了非常清晰的程序模块(module)接口,所有的扩展程序都可以编译成模块,并根据配置动态加载。一个模块通常包含针对某个或某些特定步骤的钩子函数,例如根据URL的pattern进行特殊的映射,或者专门处理用户的认证,或者对从硬盘上读取文件进行caching,甚至可以是把log放到数据库中,等等。

模块和钩子函数的接口都是C语言,意味着模块必须用C语言来完成。但是用C语言开发应用程序的最大缺点是内存管理繁复易错、调试过程耗时费力。于是人们想到了如果能把scripting语言的解释器嵌入到模块里,只要把这一个模块写清楚了、调试好了,那么所有人就都可以用scripting语言来进行服务器端的应用程序开发。即有scripting语言易于编程的优点,又不需要为CGI付出代价。Perl是最早被嵌入到Apache HTTPD模块中的scripting语言。mod_perl的出现可以说是轰动性的。紧随其后的是PHP和Python,分别出现以mod_php和mod_python出现。其他的scripting语言也陆续加入到这个行列中,如ruby、tcl、pike等,但最流行的还是PHP、Perl和Python。

虽然各种scripting语言的语法大不相同,作为HTTP模块,大致的构成是相同的。首先,要告诉HTTPD什么样的HTTP请求(比方根据URL、或者MIME类型等)需要转交给这个模块处理。在拿到从硬盘上读出的代码后,嵌入在模块中的解释器就开始执行代码。执行的结果再作为HTTP应答发送给客户端。

PHP是一种专门针对在HTTP服务器端开发应用程序而发明的编程语言。PHP脱胎于HTTP服务器上常见的server side inclusion,即所谓的SSI,增加了过程式语言的控制机制和面向对象语言的抽象与封装机制。和Perl、Python等“常规的”编程语言不同的是,PHP的代码用特殊的tag直接嵌入在HTML页面中的,必须转换为浏览器能识别的HTML或JavaScript代码才能当作HTTP应答发给客户端。这与JSP有些相似。由于PHP直观、易于上手,很快就成了在服务器端开发web应用的首选。

在这将近十年的时间里,Apache HTTPD从0.6.2走到了2.0。在2.0之前的1.3版说非常成功,以至于人们认为没有必要升级到2.0版。当然,2.0版带来的变化也是很大的。不仅核心部分从单一的多进程结构发展到多进程、多线程等多种结构,连模块和钩子函数的接口都变了。这就意味着所有的模块必须重写。1.3版的模块不用考虑多线程的安全性,但是由于2.0版的核心可以配置为运行多个线程,模块必须是符合多线程安全性的要求。由于这些原因,一些模块的开发人员对于向2.0版移植的积极性就不是那么高。PHP就是其中最突出的一个。为此在PHP和Apache HTTPD的开发人员间还出现了一些不愉快的争论和猜疑。

MySQL在LAMP之前的名气并不大。对SQL的支持不完整、没有transaction、只能在表一级加锁,MySQL的这些缺陷曾经被广为诟病。但是仗着速度快,对系统资源要求低、易于管理,MySQL很快成了低成本网站的中坚。首先,网站的静态内容不需要实时更新,数据库可以是只读的,又要求非常高的速度,正好可以让MySQL扬长避短。而对于大量的论坛网站,由于对数据库的主要操作是添加记录,并不涉及对数目众多的表进行同时修改,加上MySQL的速度也快,减弱了其粗粒度加锁可能对并发性能的影响。

对于那些暴露在整个Internet前的Web服务器,和速度与稳定性同样重要的是安全性。除了Apache HTTPD、PHP和MySQL的安全性外,操作系统,也就是Linux自身的安全性也非常重要。作为最后一道防线,Linux提供了一种称为chroot jail的机制。chroot代表change root,是内核提供的一个系统调用,可以改变呼叫进程的根目录。由于调用chroot需要超级用户的权限,只要应用程序在从chroot返回后立即放弃超级用户的权限(这也是所有Internet服务器程序应该做的),当前进程就无法通过再次调用chroot回到真正的根目录去。也就是说,chroot可以把有潜在安全漏洞的应用程序的运行限制在一个特定的目录下,就好像被放进了监狱里一样。这样,即使hacker找到应用程序中的安全漏洞,例如buffer overflow,控制了当前用户进程,也无法从监狱里逃出来,进而危害整个系统。

当然,chroot jail只能作为众多损害控制手段中的一个,远远不是整个系统安全防线的全部。即使chroot起了作用,防止了整个系统的陷落,由于hacker至少已经攻破了一个应用程序,仍然对业务的正常运作造成了影响。另外,由于应用程序进程的根目录发生了变化,对于应用程序的设计和编写,以及整个系统的配置都有特殊的要求。

除了Linux外,由BSD派生出来的操作系统如FreeBSD、OpenBSD等也都提供chroot。现在chroot已经成了注重安全性的系统管理员必备的工具之一。

后记:本来这一篇还要介绍Email、FTP、Samba等其他服务器程序。但尝试了几次后,发现自己的经验和理论知识都不够,连班门弄斧的资格都没有,所以只好在写完LAMP后住手,以免让大家久等。


本帖一共被 1 帖 引用 (帖内工具实现)
全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河