ubuntu实现负载均衡

1.安装环境

sudo apt update

sudo apt install python3 python3-pip nginx

2.python代码

1)服务代码

from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(f"Served by backend server on port {self.server.server_port}".encode())

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8001):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting httpd server on port {port}")
    httpd.serve_forever()

if __name__ == '__main__':
    import sys
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8001
    run(port=port)

python3 backend.py 8001 &

python3 backend.py 8002 &

python3 backend.py 8003 &

2)编写负载均衡器

from http.server import HTTPServer, BaseHTTPRequestHandler
import random
import http.client

# 后端服务器列表
backend_servers = [
    ('localhost', 8001),
    ('localhost', 8002),
    ('localhost', 8003)
]

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 随机选择一个后端服务器
        backend_server = random.choice(backend_servers)
        self.proxy_to(backend_server)

    def proxy_to(self, backend_server):
        conn = http.client.HTTPConnection(*backend_server)
        conn.request('GET', self.path)
        response = conn.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())
        conn.close()

def run(server_class=HTTPServer, handler_class=RequestHandler, addr="0.0.0.0", port=8000):
    server_address = (addr, port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting httpd server on {addr}:{port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

python3 load_balancer.py &

3.nginx配置

编辑Nginx配置文件 /etc/nginx/sites-available/default(或创建一个新的配置文件):

server {
    listen 80;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

sudo systemctl restart nginx

4.访问你的ip就可以看到效果了

5.增加权重

修改load_balancer.py文件的代码

from http.server import HTTPServer, BaseHTTPRequestHandler
import random
import http.client

# 后端服务器列表,包含权重
backend_servers = [
    ('localhost', 8001, 3),  # 权重为3
    ('localhost', 8002, 1),  # 权重为1
    ('localhost', 8003, 1)   # 权重为1
]

# 扩展服务器列表,根据权重增加出现次数
weighted_servers = []
for server, port, weight in backend_servers:
    weighted_servers.extend([(server, port)] * weight)

class RequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 随机选择一个后端服务器
        backend_server = random.choice(weighted_servers)
        self.proxy_to(backend_server)

    def proxy_to(self, backend_server):
        conn = http.client.HTTPConnection(*backend_server)
        conn.request('GET', self.path)
        response = conn.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())
        conn.close()

def run(server_class=HTTPServer, handler_class=RequestHandler, addr="0.0.0.0", port=8000):
    server_address = (addr, port)
    httpd = server_class(server_address, handler_class)
    print(f"Starting httpd server on {addr}:{port}")
    httpd.serve_forever()

if __name__ == "__main__":
    run()
相关推荐
geovindu几秒前
python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04
python·mysql·ubuntu
你好呀我是裤裤1 小时前
Linux基础开发工具的使用(apt、vim、gcc、g++、gdb、make、makefile)
linux·运维·vim
望获linux1 小时前
如何在望获实时 Linux & 京博航友善 NanoPC-T6 上部署 Docker
linux·运维·服务器·docker·eureka·开源软件
wangchen_01 小时前
linux编译器和自动化构建工具(gcc与Makeile)
linux·运维·服务器
DC_BLOG2 小时前
Linux-Ansible命令
linux·运维·服务器·ansible
人工干智能2 小时前
科普:“docker”与“docker compose”
运维·docker·容器
suenpeng2 小时前
安全运维,等保测试常见解决问题。
linux·运维·安全
神马都会亿点点的毛毛张2 小时前
【Docker教程】万字长文详解Docker命令
java·运维·后端·docker·容器
码农君莫笑2 小时前
Linux系统上同时打印到物理打印机并生成PDF副本方法研究
linux·前端·chrome·打印·信管通
马剑威(威哥爱编程)3 小时前
Linux驱动开发13个实用案例
linux·运维·驱动开发