西西河

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

共:💬75 🌺106
分页树展主题 · 全看首页 上页
/ 5
下页 末页
    • 家园 这个序列的PDF文件去年打印回家看了多遍。还要顶一下。

      再花一朵。

    • 家园 【原创】基于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 帖 引用 (帖内工具实现)
      • 家园 如果自己架一个服务器,用来上载图片什么的,用APACHE

        安全方面设置起来复杂不复杂?

        接下去会不会讲到 .htaccess方面的内容?

        • 家园 要看你打算提供什么样的功能,以及准备如何进行用户认证和授权。

          首先,应用(图片上传)自身的设置工作应该要比HTTP服务器要复杂。不光要安装相应的模块,如PHP或其他如Python、Perl,还得要个数据库如MySQL。类似这样的服务,一般都要有严格的用户授权和完善的quota管理,几乎肯定要用到数据库来记录有关的数据。

          虽然HTTP协议本身提供了用户认证的机制,但是安全性不太好。使用表单进行认证,起码可以靠SSL来增加安全性。

          这样一来,Apache的设置几乎可以说是简单到了bare bone,大部分的工作实际上是由应用完成的。

          对Apache来说,.htaccess不是必需的。特别是对于图片上传这样动态产生内容的web应用,数据都应该放在DocumentRoot之外的地方,否则从客户端来的请求可以绕开应用程序的控制,直接访问数据。

      • 家园 前天正好看了一下微软下一代web server IIS 7.0的简介,

        感觉和Apache的许多想法是一致的。IIS 6.0中的那个HTTP.SYS就是从Linux中学来的。HTTP.SYS是Kernel level Driver,而不是User Space Process,这样的设计减少了很多Mode switch的开销,性能有了巨大提高。

        BTW,PDF文件已经更新了。

        • 家园 多谢了。

          Linux的2.4版曾经出现过一个完全在内核里的HTTPD,完全避免了mode switch导致的性能损失。When serving static contents, it beat all user space HTTPDs at the time。可惜的是,由于运行在内核里,无法支持CGI。

          另外,在性能与之接近的用户态HTTPD出现后,人们认为没有必要在为此而bloat the kernel,故此2.6版的Linux内核不再包括HTTPD。

      • 家园 有一点没太看懂,请教

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

        chroot是一种机制还是一种工具?也就是说,是内核直接支持chroot,还是像应用软件一样需要每次去运行,才能提供保护?

分页树展主题 · 全看首页 上页
/ 5
下页 末页


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

Copyright © cchere 西西河