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

19 投票
3 回答
12566 浏览
提问于 2025-04-16 15:54

这里提到的简单网络服务器是指一个可以处理简单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网络服务器有什么不同呢?换句话说,如果我想用Python来实现一个可以用于商业的服务器,我还需要做些什么呢?

如果能给出Apache服务器的整体概念,那就太好了。

3 个回答

7

Apache网络服务器了解并支持整个HTTP协议,因此它可以处理与头部信息、保持连接、缓存内容、各种HTTP响应代码及其正确处理等相关的所有复杂问题。

如果你想超越简单的HTTP服务器,就必须理解整个HTTP协议,并将其用代码表达出来。

8

Apache是用C语言写的,设计上可以处理很多用户同时访问,而BaseHTTPServer则是为了本地测试和调试而设计的。

所以,你不应该把BaseHTTPServer用在任何正式的网站上。

15

换句话说,如果我想用Python来实现一个可以用于商业的服务器,我还需要做些什么呢?

其实已经有一些基于Python的网络服务器,比如CherryPy(我觉得它的目标是和Apache同级别的网络服务器解决方案;不过它更偏向于Python,而Apache已经存在很久了)。

如果你想从头开始写一个非常简单的轻量级网络服务器,使用BaseHTTPServer应该没什么问题,除了可能有一些设计上的小问题(我听说竞争条件可能会导致一个套接字被永久堵塞,直到某个线程死掉)。

虽然我不建议单独使用它来做商业项目,但一些大公司确实在用BaseHTTPServer,并加了一些额外的东西:http://www.cherrypy.org/browser/trunk/cherrypy/_cphttpserver.py?rev=583

进一步说,Apache是行业标准。它有很多配置选项,还有安全团队、漏洞邮件列表等等。它支持模块(例如mod_python)。基于Python的网络服务器也可以通过一种叫做WSGI的东西来支持Python模块(也许它们也能让你访问非Python的东西);WSGI应用可以在任何基于Python的网络服务器上运行(包括Apache,它也有mod_wsgi);我觉得它们的功能范围比Apache的模块要窄一些。

Apache模块的例子:http://httpd.apache.org/docs/2.0/mod/

WSGI的例子(不太能直接比较):http://wsgi.org/wsgi/Middleware_and_Utilities

如果我做的是非常轻量的项目,或者需要对网络服务器内部有很大的控制,而模块接口又无法提供这些,我可能会自己写一个网络服务器,或者如果是个人项目的话。我不会为了商业目的自己写服务器,除非我对真实世界的网络服务器有相当的经验。这一点在安全漏洞方面尤其重要。

举个例子,我曾经写过一个基于网页的音乐播放器。我使用BaseHTTPServer来从我写的一个沙盒中提供音乐,以确保人们无法访问任意文件。多线程处理真是个噩梦。(我记得有个bug需要给Popen传递特殊参数,因为多线程会导致隐式的分叉,从而在悬挂的文件描述符上造成卡顿。)还有其他各种问题。代码需要重构很多。对于个人项目来说,这可能是非常值得的,但对于只需要一个网站的商业项目来说,这是一项重大工程,不值得去做。

我知道有两个初创公司过去一直在用Pylons(使用Paste)或Turbogears(使用CherryPy),如果你在寻找轻量级的Python网络服务器栈。不过它们的默认模板系统有点不足。选择Apache还是更轻量的基于Python的网络服务器,可能还要看你合作开发者的技能水平。

撰写回答