简单的Web服务器和Apache服务器有什么区别?

18

这里的简单 Web 服务器是指处理简单 HTTP 请求的服务器,就像以下示例一样:

import BaseHTTPServer
class WebRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == ‘/foo’: 
            self.send_response(200)
            self.do_something()
        else:
            self.send_error(404)

    def do_something(self):
        print ‘hello world’

server = BaseHTTPServer.HTTPServer((’127.0.0.1′,8080), WebRequestHandler)    
server.serve_forever()

除了处理POST、PUT和DELETE方法的请求之外,这个简单的服务器与Apache Web服务器有什么区别?换句话说,如果我想使用Python实现一个可用于业务的服务器,我还需要做些什么?

如果能展示Apache服务器的整体架构,将不胜感激。


4
为什么要买车呢?你可以自己造一个滑板车啊! - yellowblood
7
因为有一天我想要造自己的汽车 :) - Helium
3个回答

15
换句话说,如果我想要使用Python实现一个可以用于业务的服务器,我应该做什么?
已经有基于Python的Web服务器了,比如CherryPy(我认为它旨在成为与Apache同级别的Web服务器解决方案;尽管它更多地基于Python,而Apache已经存在很长时间了)。
如果你希望从头开始编写一个轻量级、极其简单的Web服务器,那么使用BaseHTTPServer可能没有什么问题,除了一些突出的设计问题(我听说竞争条件可能会永久阻塞一个套接字,直到线程死亡)。
虽然我不建议(独自)将其用于业务,但一些大公司使用BaseHTTPServer加上一些额外的机制: http://www.cherrypy.org/browser/trunk/cherrypy/_cphttpserver.py?rev=583 具体来说,Apache是业界标准。它有大量的配置选项、安全团队、漏洞邮件列表等等。它支持模块(例如mod_python)。基于Python的Web服务器也支持基于Python的模块(也许它们可以让你访问非Python的东西)通过名为WSGI栈的东西;WSGI应用程序可以在任何基于Python的Web服务器上运行(以及Apache,后者也有一个modwsgi);我认为它们比Apache模块的范围更窄。
Apache模块示例:http://httpd.apache.org/docs/2.0/mod/ WSGI示例(不是有效的比较):http://wsgi.org/wsgi/Middleware_and_Utilities如果我需要做一些非常轻量级的东西,或者需要对Web服务器内部进行大规模的控制并且模块界面无法提供,或者是在进行个人项目时,我可能会编写自己的Web服务器。除非我有实际商业Web服务器使用经验,否则我不会为企业编写自己的服务器,这尤其从安全漏洞的角度考虑很重要。
例如,我曾经编写过一个基于Web的音乐播放器。我使用了BaseHTTPServer来从我编写的沙箱中提供音乐服务,以确保人们无法访问任意文件。然而线程管理是一场噩梦(我记得有一个bug,你需要传递特殊参数给Popen,因为线程导致隐式fork,会导致悬挂的文件描述符)。还有其他各种问题,代码需要进行大量重构。对个人项目来说它可能非常值得,但对于只需要一个网站的企业来说,这是一项重大工作,不值得。
我知道两个初创公司过去都使用过Pylons(使用Paste)或Turbogears(使用CherryPy)作为轻量级Python Web服务器堆栈。但它们的默认模板系统存在缺陷。选择Apache或更瘦更基于Python的Web服务器也可能取决于您的合作开发者的技能水平。

我知道已经很久了,但我偶然发现了你的答案,你提供的CherryPy链接出现了404错误。 - Jarwin

8

Apache是用C语言编写的,旨在实现可扩展性,而BaseHTTPServer仅适用于本地/测试/调试环境。

因此,您不应将BaseHTTPServer用于任何生产网站。


谢谢,这很直接易懂。但我想更多地了解它们在技术上的区别。 - Helium

7

Apache Web服务器了解并支持整个HTTP协议,因此它能够处理所有涉及标头、保持连接打开、缓存内容、所有不同的HTTP响应代码及其适当的处理方法等方面的复杂性。

要超越简单的HTTP服务器,您必须理解整个HTTP协议并将其表达为代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接