如何为 Django 服务配置负载均衡
共 2267字,需浏览 5分钟
·
2021-11-20 09:25
现在的 Web 服务有一个很重要的性能指标叫 QPS,QPS 的全称是 Queries Per Second 意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。QPS 越高,说明并发度高,服务器每秒可以服务更多的用户。
Python 爱好者多数会选择 Django 来开发 Web 应用。但是 Python 多线程的性能并不是很高,如何提升 Django 服务的并发性和可用性呢?一个很简单的办法就是负载均衡,本文分享如何为 Django 服务配置负载均衡。
所谓负载均衡不难理解,就是我们会有多个后端服务,一般分配在多个服务器上,前端的请求会被均衡的分配到后端的服务上,示意图如下所示:
![](https://filescdn.proginn.com/9806480888dc8341fd7c4feb488a2e10/4d092ea309df01a9d78f235d5a91df06.webp)
负载均衡器接收来自客户端的请求,然后将请求转发到其中一台服务器。服务器然后将所需的 HTML 内容或资源返回给负载均衡器,然后负载均衡器将其转发回客户端。
有多种负载均衡器可供选择,例如 Nginx、Apache、Tomcat 和 HAProxy,你可以选择其中任何一个,但现在我将只展示如何在 Windows 上使用 Nginx。
下载 nginx
首先,到 nginx 的下载地址https://nginx.org/en/download.html,它会显示如下页面:
![](https://filescdn.proginn.com/908cada6798d0b1f96eab270215fea5f/4b36831146de07c49ec25394536d3d40.webp)
然后点击任一版本的 Nginx,我推荐使用稳定版,但其实无所谓。下载后,将其解压缩到任何位置(在您的桌面或文档上即可)。解压后,进入刚才安装的 nginx 目录,在目录地址输入“cmd”,如下图。并且会出现命令提示符。
![](https://filescdn.proginn.com/84cb991c93f2b465e8810a7a44939266/40bcbde818de8e3c0ee0d3d993dce60b.webp)
在命令提示符下,输入“start nginx”。完成后,您可以通过打开浏览器并在 url 栏中输入“localhost”来检查 nginx 是否正常工作。如果在输入“localhost”后出现下面的屏幕,Nginx 可以正常工作。
![](https://filescdn.proginn.com/3e7a52a69c54bcc427fd31c0f161ed67/0b9e4a3e3e9839e44936278c80512a85.webp)
一旦 Nginx 完美运行,我们就可以配置 Nginx 以将负载分配到我们的服务器,我这里用 Django 的 runserver 作为服务进行演示。
配置 nginx
进入nginx目录,打开“conf”文件夹,然后你应该看到“nginx.conf”文件。在您熟悉的任何文本编辑器上打开它,我现在将使用 Visual Studio Code,默认情况下 nginx.conf 的内容如下所示:
![](https://filescdn.proginn.com/9c248b6f4389e9a187abfbc8fcd2a6ee/563e67e5b76a9af1c37576954b902640.webp)
只需要注释掉 http 部分或者直接删除它,添加以下内容:
http {
upstream myproject {
server localhost:8000;
server localhost:8001;
server localhost:8002;
server localhost:8003;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://myproject;
}
}
}
这段配置的意思为 nginx 会监听本机的 8080 端口,一旦有访问,就会随机分配到以下四个服务进行请求:
server localhost:8000;
server localhost:8001;
server localhost:8002;
server localhost:8003;
请确保开启 4 个终端来模拟 4 个服务,每个终端都执行这个命令,后面跟上自己的端口号:
python manage.py runserver {port}
配置 Django
不过你可能很想知道我这个请求到底分配给了谁,那就在 views.py 中加入这个方法:
from django.http import HttpResponse
def nginx_view(request):
html = "Using port "
+ request.META["SERVER_PORT"] + ""
return HttpResponse(html)
然后在对应的 urls.py 上配置好路径 / ,来映射到上面的视图函数:
from django.contrib import admin
from django.urls import path
from .views import nginx_view
urlpatterns = [
path('test_load_banlance/', nginx_view),
]
验证
打开浏览器,地址栏输入 localhost/test_load_banlance/ 回车,会发现如下页面:
![](https://filescdn.proginn.com/a014452444592b356877656343d50017/1dc15bc4419a56d38f61e898de87b0bf.webp)
然后关闭 8000 服务,再次刷新浏览器,会发现负载均衡器已经转发至 8001:
![](https://filescdn.proginn.com/87789d1b22080269c73f019c1826010b/44be3010832206ab58884f26e51b857b.webp)
是不是很酷呢?
如果你持续刷新,它会在剩余的服务中进行随机循环请求,也就是说每当刷新一次,就会随机换一个服务器进行请求。当然了,你可以参考 nginx 文档对这种选择后端服务的方式进行修改。
最后的话
本文分享了 nginx 作为负载均衡器的最简单配置,以及如何在 Django 中检测访问的是哪一个服务,都比较简单,如果有收获还请点赞、在看、关注支持。