[파이썬] 리버스 프록시와 로드 밸런서 구현

리버스 프록시는 클라이언트로부터 받은 요청을 서버로 전달하는 역할을 합니다. 클라이언트가 서버에 직접 접근하는 대신 리버스 프록시를 통해 요청을 전달하므로, 보안, 성능, 로드 밸런싱 등의 이점을 제공합니다.

로드 밸런서는 여러 대의 서버에 동일한 요청을 분산시켜주는 역할을 합니다. 클라이언트로부터 들어오는 요청을 여러 서버로 분배하면 각 서버의 부하를 분산시킬 수 있고, 가용성을 높여 서비스의 안정성을 향상시킬 수 있습니다.

이번 블로그 포스트에서는 파이썬으로 리버스 프록시와 로드 밸런서를 구현하는 방법에 대해 알아보겠습니다.

리버스 프록시 구현

파이썬에서 리버스 프록시를 구현하기 위해서는 ‘http.server’ 모듈을 사용할 수 있습니다. 예를 들어, 다음과 같이 간단한 리버스 프록시 서버를 구현할 수 있습니다.

import http.server
import http.client

class ReverseProxyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        target_host = 'example.com'
        target_port = 80

        # 클라이언트의 요청을 서버로 전달
        client = http.client.HTTPConnection(target_host, target_port)
        client.request(self.command, self.path, headers=self.headers)
        response = client.getresponse()

        # 서버로부터 받은 응답을 클라이언트에게 전달
        self.send_response(response.status)
        for header, value in response.getheaders():
            self.send_header(header, value)
        self.end_headers()
        self.wfile.write(response.read())

if __name__ == '__main__':
    server_address = ('', 8080)
    httpd = http.server.HTTPServer(server_address, ReverseProxyHandler)
    httpd.serve_forever()

위 코드에서 ReverseProxyHandler 클래스는 http.server.BaseHTTPRequestHandler 클래스를 상속받아 구현되었습니다. do_GET 메서드를 오버라이딩하여 클라이언트의 요청을 서버로 전달하고, 서버로부터 받은 응답을 클라이언트에게 전달하는 코드가 포함되어 있습니다.

로드 밸런서 구현

파이썬에서 로드 밸런서를 구현하기 위해서는 여러 서버로 요청을 분산할 수 있는 패키지를 사용할 수 있습니다. random 모듈을 사용하여 요청을 무작위로 분산하는 간단한 예제 코드를 살펴보겠습니다.

import random
import http.client

class LoadBalancer:
    def __init__(self, server_list):
        self.server_list = server_list

    def get_server(self):
        return random.choice(self.server_list)

    def forward_request(self, request):
        target_server = self.get_server()

        # 클라이언트의 요청을 선택한 서버로 전달
        client = http.client.HTTPConnection(target_server[0], target_server[1])
        client.request(request.command, request.path, headers=request.headers)

        # 서버로부터 받은 응답을 리턴
        response = client.getresponse()
        return response

if __name__ == '__main__':
    server_list = [('server1.com', 80), ('server2.com', 80), ('server3.com', 80)]
    load_balancer = LoadBalancer(server_list)

    # 클라이언트의 요청을 로드 밸런서로 전달
    request = http.client.HTTPConnection('loadbalancer.com', 8080)
    response = load_balancer.forward_request(request)

    # 서버로부터 받은 응답을 클라이언트에게 전달
    print(response.read())

위 코드에서 LoadBalancer 클래스는 server_list에 등록된 서버 중 무작위로 서버를 선택하여 요청을 전달하는 로직을 갖고 있습니다. forward_request 메서드를 호출하여 클라이언트의 요청을 선택한 서버로 전달하고, 서버로부터 받은 응답을 리턴합니다.

이렇게 구현한 로드 밸런서는 server_list에 등록된 서버 중 무작위로 서버를 선택하기 때문에 간단한 분산 로드 밸런싱이 가능합니다.

이상으로 파이썬을 사용하여 리버스 프록시와 로드 밸런서를 구현하는 방법을 알아보았습니다. 이를 응용하여 실전에서 사용할 수 있는 좀 더 복잡한 기능을 추가하는 것도 가능합니다.