from http.server import BaseHTTPRequestHandler, HTTPServer import itertools, ssl servers = { 'https://10.0.3.1:443': 4, 'https://10.0.3.2:443': 2, 'https://10.0.3.3:443': 1, 'https://10.0.3.4:443': 1, 'https://10.0.3.5:443': 0 } class Handler(BaseHTTPRequestHandler): def do_GET(self): server = weighted_round_robin(servers) if server == 'http://10.0.3.5:80': for svr in servers: servers[svr] = random.randint(1, 10) self.send_response(302) self.send_header('Location', server) self.end_headers() self.wfile.write(b'Redirecting...') def weighted_round_robin(servers): server_list = [] weights = [] for server, weight in servers.items(): server_list.append(server) weights.extend([server] * weight) server_cycle = itertools.cycle(server_list) return next(server_cycle) # HTTPS server certfile = 'cert.pem' keyfile = 'key.pem' ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile) server_address = ('', 443) load_balancer = HTTPServer(server_address, Handler) load_balancer.socket = ssl_context.wrap_socket(load_balancer.socket) load_balancer.serve_forever()