本想写一篇关于http->nginx->php这个过程中数据是怎么传输的文章,想了半天,实在没有心情去写。刚好看了一下python,就想着用python实现一下web服务器的过程。这个很简单,目前只支持静态文件的加载,动态语言就要接入fastcgi了(目前还在看fastcgi,下一版本更新吧)。以前没写过python也是边写边查,好多东西用的不是特别好,还有,可以在这个基础上改动,可以支持access.log,多server配置。这里就不写了。
其实过程很简单,nginx大体也是这个逻辑(但是,nginx内部就复杂多了)。
创建socket,监听80端口(可以自设)
解析http协议中的request(获取你想要的参数)
通过获取的参数取服务器上找到相应的静态资源(这里只说静态资源,动态的下一篇再说)
组织http协议的response
通过80端口返回给客服端
#/usr/bin/python
import socket
import sys
import os
from thread import *
HOST = \'\';PORT = 8887
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print \'Socket created\'
try:
s.bind((HOST, PORT))
except socket.error , msg:
print \'Bind failed. Error Code : \' + str(msg[0]) + \' Message \' + msg[1]
sys.exit()
print \'Socket bind complete\'
s.listen(10)
print \'Socket now listening\'
def assces_log(request):
fp = open(\'http.log\', \"aw\")
fp.write(request+\"\\r\\n\")
fp.close()
def parse_request(request):
request = request.splitlines()
line = request[0]
line = line.split();
dict_request = {\'method\':line[0], \'path\':line[1], \'version\':line[2]}
return dict_request
while True:
conn, addr = s.accept()
request = conn.recv(1024)
print request
print \"\\r\\n\"
dist_request = parse_request(request)
path = dist_request[\'path\']
path = os.getcwd() + path
if os.path.isfile(path):
if os.path.exists(path):
fp = open(path, \"r\")
reply = fp.read()
fp.close()
response_errno = 200
response_msg = \'OK\'
else:
reply = \'Not found page\'
response_errno = 404
response_msg = \'Not found\'
else:
reply = \'Forbidden\'
response_errno = 403
response_msg = \'Forbidden\'
response = \"HTTP/1.1 \" + str(response_errno) + \" \" + response_msg + \"\\r\\n\"
response += \"\\r\\n\"
response += reply
print response
assces_log(request)
conn.sendall(response)
conn.close()
s.close()
下一篇:coverage教程(译)