我正在尝试为在apache上运行的webserver写一个反向代理 为此,我已经移动了端口8008的web服务器,现在我的计划是在端口80上运行反向代理。为此我编写了一些Python代码。
反向代理代码在端口80上打开一个套接字并等待连接,一旦收到连接请求,它就会分叉一个线程并将连接套接字传递给该线程。 下面是我的代码
class rp_server:
def __init__(self, mod):
self.host = Constants.HOST_NAME
self.port = Constants.RP_PORT
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.socket.bind((self.host, self.port))
except socket.error as e:
print(str(e))
settings.mod = mod
if settings.mod == "reset":
print("reseting the cache\n")
exit()
else:
self.start_rp_server()
def start_rp_server(self):
self.socket.listen(5)
while True:
print("waiting for a connection")
(clientsocket, (ip, port)) = self.socket.accept()
print("connected to : " +ip + ":" + str(port))
t = ClientThread.ClientThread(ip, port, clientsocket)
t.start()
start = rp_server(mod)
现在ClientThread
的run方法从clientsocket
接收消息,在端口8008(我的web服务器正在运行的地方)上创建一个新套接字,将msg发送到从{{{ 1}},接收回复,将回复转发回clientsocket
,关闭clientsocket
以下是本部分的代码
clientsocket
现在的问题是,当我尝试在我的浏览器上打开localhost:80页面时,加载时间太长,当我看到一些日志时,我看到了
def run(self):
data = self.clientsocket.recv(Constants.SKT_BUF_SIZE)
start = time.time()
print("creating a socket with web server\n")
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
server_address = (Constants.HOST_NAME, Constants.WEB_HOST_PORT)
sock.connect(server_address)
sock.send(data)
try:
while True:
print("receiving from web server\n")
response = sock.recv(Constants.SKT_BUF_SIZE)
if not response:
print("end of response\n")
break
self.clientsocket.send(response)
finally:
sock.close()
sys.exit()
部分代码需要花费太多时间才能在本地计算机上运行。
有没有更好的方法在python中实现这一点? 实现这一目标的更快的替代方案是什么?理想情况下,反向代理部分应该是无缝的,它应该与普通网站的速度相同,而不需要反向代理。