首先要说明这其实是一个不可能完成的任务,至少不是一片博文就能完成的任务。避免浪费看到标题而满心期待同道的时间。
主要是想以Apache为蓝本,通过Python脚本的方式一步一步实现Apache的核心功能。进而了解Python网络编程以及有关于Web服务性能相关的方方面面。
闲言少叙,直接上代码!
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('',1234))
server.listen(5)
while True:
client,addr=server.accept()
data=client.recv(1024)
client.send("My WebServer")
client.close()
使用ab命令对这个服务器进行测试:
ab -n500 -c500 http://127.0.0.1:1234/
测试结果如下:
通过打印data可以得到客户端代理提交到WebServer的信息。
GET / HTTP/1.1
User-Agent: curl/7.12.1 (i686-redhat-linux-gnu) libcurl/7.12.1 OpenSSL/0.9.7a zlib/1.2.1.2 libidn/0.5.6
Host: 127.0.0.1:1234
Pragma: no-cache
Accept: */*
我们在这里只关心GET请求的内容,通过解析用户的GET请求后获取指定目录中的文件内容后再返回给客户端。
import socket
import re
DocumentRoot="/root/"
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('',1235))
server.listen(5)
while True:
client,addr=server.accept()
data=client.recv(1024)
m=re.match('GET /(.*) ',data)#由于ab使用的是http1.0 因此与上例有所区别
try:#为应对在进行ab测试时候可能的异常
index=DocumentRoot+m.group(1)
html=open(index,"r")
client.send(html.read())
client.close()
except:
client.close()