nginx、gunicorn实现负载均衡

要实现Nginx + Gunicorn + Django 的负载均衡,需要在Nginx 中配置反向代理到多个Gunicorn 实例,通过Nginx 的负载均衡算法(如轮询或IP hash)将请求分发给后端的多个Gunicorn 进程或服务器,以提高吞吐量和可用性。Gunicorn 负责处理Django 动态请求,Nginx 则处理静态文件、SSL 终止、高并发请求和健康检查,并作为负载均衡器来分发流量。

基本架构

客户端::浏览器或其他客户端发起HTTP 请求。

Nginx::作为反向代理和负载均衡器,接收所有客户端请求。

Gunicorn::运行Django 应用的WSGI 服务器,接收Nginx 转发的请求,并处理动态内容。

Django::Python Web 框架,由Gunicorn 运行,提供业务逻辑和数据处理。

配置步骤

1. 启动多个Gunicorn 进程:

在多个服务器上或同一台服务器上启动多个Gunicorn 实例,每个实例运行Django 应用。

# -w: 表示进程(worker) -b:表示绑定ip地址和端口号(bind)
# gunicorn -w 2 -b 127.0.0.1:8000 运行文件名称:django程序实例名
gunicorn -w 2 -b 127.0.0.1:8000 wsgi:application
# gunicorn -w 2 -b 127.0.0.1:8001 运行文件名称:django程序实例名
gunicorn -w 2 -b 127.0.0.1:8001 wsgi:application

2. 配置Nginx 反向代理:

在Nginx 的 nginx.conf 文件中,配置 upstream 块来定义后端Gunicorn 服务器的列表。

在 upstream 块中,指定多个Gunicorn 的地址(IP:端口或Unix 套接字)。  在 server 块的 location 中,将请求通过 proxy_pass 指令转发给 upstream 块定义的Gunicorn 服务器。 

3. 配置Nginx 负载均衡算法:

在 upstream 块中,选择Nginx 的负载均衡策略,例如:

轮询(默认)::按顺序将请求依次分配给每个后端服务器。  IP Hash::根据客户端IP 地址进行哈希,将来自同一IP 的请求始终分配给同一台后端服务器。

配置文件

# 如果是多台服务器的话,则在此配置,并修改 location 节点下面的 proxy_pass
upstream django {
        # 8000端口访问率是8001端口的3倍 3/4:1/4
        server 127.0.0.1:8000 weight=3;  #权重分配weight
        server 127.0.0.1:8001 weight=1;
}
server {
        # 监听80端口
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # 请求转发到gunicorn服务器
                # proxy_pass http://127.0.0.1:8000;
                # 请求转发到多个gunicorn服务器
                proxy_pass http://django;
                # 设置请求头,并将头信息传递给服务器端 
                proxy_set_header Host $host;
                # 设置请求头,传递原始请求ip给 gunicorn 服务器
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

配置加权轮询算法 为服务器添加 weight 参数,权重越高,分配到的请求越多

http {
    upstream my_servers {
        server 192.168.1.101 weight=3; # 分配到3份权重
        server 192.168.1.102 weight=1; # 分配到1份权重
    }

    server {
        listen 80;
        location / {
            proxy_pass http://my_servers;
        }
    }
}

配置IP 哈希算法 使用 ip_hash 指令将来自同一IP 的客户端请求固定分配给同一台后端服务器。

http {
    upstream my_servers {
        ip_hash; # 启用IP哈希
        server 192.168.1.101;
        server 192.168.1.102;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://my_servers;
        }
    }
}

配置最少连接算法 在 upstream 块中使用 least_conn 指令将请求分配给当前连接数最少的服务器。

http {
    upstream my_servers {
        least_conn; # 启用最少连接算法
        server 192.168.1.101;
        server 192.168.1.102;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://my_servers;
        }
    }
}



4. 启用健康检查:

通过Nginx 的健康检查机制,自动检测后端Gunicorn 服务器的健康状况,并在服务器故障时将其从负载均衡池中移除。

Nginx 的优势

高并发处理::Nginx 可以处理大量并发连接。

静态资源分离::Nginx 负责托管和缓存静态文件,减轻Gunicorn 和Django 的压力。

SSL 终止::在Nginx 上处理HTTPS 握手,减轻后端服务器负担。

缓冲和安全防护::提供缓冲,保护后端应用,并可配置IP 白名单/黑名单、限速等安全策略。

HTTP/2 支持::Nginx 支持HTTP/2,可提升用户访问速度。

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2025年9月8日 15:38