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

时间:2011-04-17 13:20:08

标签: python apache webserver

这里简单的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 Server有什么区别? 或者换句话说,如果我想使用python来实现可以投入使用业务的服务器,我还应该做些什么呢?

如果显示Apache Server的大图,我们将不胜感激。

3 个答案:

答案 0 :(得分:12)

  

或者换句话说,如果我想使用python来实现可以投入使用业务的服务器,我该怎么办?

已经存在基于python的Web服务器,例如CherryPy(我认为它是与Apache在同一堆栈级别上的Web服务器解决方案;但它更基于python,并且Apache已经存在很多长)。

如果您希望从头开始编写一个轻量级的极其简单的Web服务器,使用BaseHTTPServer可能没什么问题,除了一些突出的设计问题(我听说竞争条件可能永久地阻塞套接字,直到线程死掉)。 / p>

虽然我不推荐它(单独)用于商业,但是一些大男孩使用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

如果我正在做一些非常轻量级的事情,或者我需要对模块接口无法提供的webserver内部进行大规模控制,或者我正在进行个人项目,我可能会编写自己的网络服务器代码。除非我对现实世界的Web服务器的工作方式有丰富的经验,否则我不会为自己的服务器编写代码。从安全漏洞的角度来看,这一点尤为重要。

例如,我曾经写过一个基于网络的音乐播放器。我使用BaseHTTPServer从我编写的沙箱中提供音乐,以确保人们无法访问任意文件。线程是一场噩梦。 (我记得你需要向Popen传递特殊参数的一个错误,因为线程导致了一个隐式的fork会导致悬挂在悬空的文件描述符上。)还有其他各种问题。代码需要重构很多。这对于个人项目来说非常值得,但对于只需要网站的企业而言,这是一项重大的工作,并不值得。

我知道有两家初创公司过去使用Pylons(使用Paste)或Turbogears(使用CherryPy),如果你正在寻找一个轻量级的python web服务器堆栈。他们缺乏默认的模板系统。 Apache和更精简的基于python的Web服务器之间的选择也可能取决于您的共同开发人员的技能。

答案 1 :(得分:8)

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

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

答案 2 :(得分:5)

Apache Web服务器知道并支持整个HTTP协议,因此它可以处理与标头有关的所有复杂情况,保持连接打开,缓存内容,所有不同的HTTP响应代码及其正确的处理等。

您必须了解整个HTTP协议并在代码中表达它以超越简单的HTTP服务器。