Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作
本文首发于公众号:Hunter后端
这一篇笔记介绍如何使用 Nginx + uWSGI 来部署 Django。
上一篇笔记中有介绍直接使用 uWSGI 作为 web 服务器来部署 Django,这一篇笔记介绍如何使用 Nginx 来部署。
使用 Nginx 来部署相当于在 uWSGI 外面又嵌套了一层,uWSGI 作为内部服务被隐藏起来,这时候 Nginx 起的作用是反向代理。
在这里,Nginx 的安装操作就不赘述了,网上都可以找得到如何操作,这里只讲相关的配置操作。
以下是本篇笔记目录:
- uWSGI 配置
- Nginx 配置及其作用
- Nginx 实现负载均衡
1、uWSGi 配置
我们还是复用上一篇笔记中的 Django 系统代码和 uWSGI 配置
# uwsgi.ini
[uwsgi]
socket = :9898
chdir = /path/to/hunter/
wsgi-file = hunter/wsgi.py
master=true
processes = 4
threads = 2
注意,这里配置项的第一行已经从 http 改成了 socket
如果使用 http,表示我们将 uWSGI 直接作为一个 web 服务器,比如可以在浏览器访问相关接口。
如果使用 socket,表示会有比如 Nginx 一样的服务来作为 web 服务器,这个时候 uWSGI 起到类似中间件的作用,负责将来自 web 服务器的请求解析后转发给 Django 来处理。
2、Nginx 配置及其作用
在我这里,Nginx 的相关配置在 /etc/nginx/nginx.conf
Nginx 的配置如下:
http {
server {
listen 8900;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9898;
uwsgi_read_timeout 2;
}
}
}
这里,listen 表示 Nginx 对外开放的是 8900 端口
location 表示的是定义的路由,这里是 /,表示 8900 端口后可以直接接上 Django 系统的 api 接口。我们也可以改成其他的,比如 /backend,那么访问 Django 的每一个接口前缀都要加上 /backend
其下,uwsgi_pass 表示指向的是本机的 9898 端口服务,这里和我们 uWSGI 里的配置是一致的
uwsgi_read_timeout 表示的是超时时间,这里定义的是两秒。
接下来我们启动 uWSGI 服务和 Nginx 服务:
uwsgi uwsgi.ini
sudo /etc/init.d/nginx restart
这时候访问 Nginx 所在的 地址的 8900 端口,http://192.168.1.33:8900/admin,就可以访问我们的 Django 系统了。
如果想要 admin 页面有前端样式展示,记得添加 uwsgi.ini 上篇笔记中的对应的静态文件配置。
3、Nginx 实现负载均衡
在上面的操作中,一个请求从客户端到 Nginx,再到 uWSGI 和 Django,这个过程就是反向代理。
而如果请求量过大,一个 uWSGI 和 Django 和对应的数据库可能扛不住访问压力,所以需要增设多个后端来分担请求,这个就是负载均衡。
首先介绍一下负载均衡的几种策略:
- 轮询
- 加权
- ip hash
这里假设我们起了三个后端实例,ip 和端口分别是 192.168.1.31:9898、192.168.1.33:9898、192.168.1.144:9898
1. 轮询
所谓的轮询,就是按照请求的时间顺序逐个分配到指定的这三个后端服务上,这里 Nginx 的配置如下:
http {
upstream web {
server 192.168.1.31:9898;
server 192.168.1.33:9898;
server 192.168.1.144:9898;
}
server {
listen 8900;
location / {
proxy_pass http://web;
}
}
}
上面的这种方式配置之后,重启 Nginx 和 uWSGI 之后,就会通过轮询的方式来发送请求到三个 Django 服务了。
注意:上面的配置方式,proxy_pass 表示是基于 http 协议进行请求的,也就是说 Nginx 到 uWSGI 走的是 http 协议,我们需要将 uwsgi.ini 的配置改成 http=:9898。
如果要走之前的 uwsgi 协议请求方式,需要将 Nginx 的这里改成这样:
server {
listen 8900;
location / {
include uwsgi_params;
uwsgi_pass web;
}
2. 加权
加权就是可以人为控制到几个服务器请求的数量的占比,比如对于这三个后端,想要请求到它们的请求的数量比为 1:2:3,可以这样设置:
upstream web {
server 192.168.1.31:9898 weight=1;
server 192.168.1.33:9898 weight=2;
server 192.168.1.144:9898 weight=3;
}
这样,来六个请求的话,这三个后端分配到的请求数量分别是 1,2,3个。
3. ip hash
这是根据客户端地址来进行分配的一个操作,假设某个请求的 ip 是 192.168.1.59,这时候 Nginx 会根据 ip 计算一个值之后映射到三个后端服务的某一个,在之后的每次请求都会指向这个后端服务。
其配置如下:
upstream web {
ip_pash;
server 192.168.1.31:9898;
server 192.168.1.33:9898;
server 192.168.1.144:9898;
}
如果使用 ip hash 策略,来自某个客户端的请求都会定向指向某个后端服务,因此可以不用担心解决后端服务共享 session 的问题。
注意:因为需要处理 session 共享的问题,所以在上面的测试中,我这边都是直接访问的不用登录,也就是不用担心 session 问题的接口。
在实际的负载均衡的后端服务中,session 的共享,使用户保持登录状态而无感,是一个需要解决的问题,这个在之后有机会的话再开笔记详细讲述。
如果想获取更多相关文章,可扫码关注阅读:

Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作的更多相关文章
- Django笔记二十四之数据库函数之比较和转换函数
本文首发于公众号:Hunter后端 原文链接:Django笔记二十四之数据库函数之比较和转换函数 这一篇笔记开始介绍几种数据库函数,以下是几种函数及其作用 Cast 转换类型 Coalesce 优先取 ...
- 填坑!!!virtualenv 中 nginx + uwsgi 部署 django
一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...
- nginx + uwsgi 部署 Django+Vue项目
nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用dj ...
- Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统
Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...
- nginx + uwsgi 部署django项目
因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...
- Nginx + uWSGI 部署Django 项目,并实现负载均衡
一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...
- Debian7下初次尝试Nginx+Uwsgi部署Django开发环境
之前一直都用的是新浪的SAE,但是由于各种限制,各种不爽,终于下定决心开始折腾VPS,于是在搬瓦工上买了个年付VPS,开始折腾之旅. 由于对Linux一窍不通,所以不知道如何在Linux上部署开发环境 ...
- nginx+uwsgi 部署 django
预装:nginx, django Django站点tree |Site |-----Blog(自建的项目) |-----Manage.py |-----Site(setting url wsgi-. ...
- 生产环境使用Nginx+uwsgi部署Django
在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教 ...
- nginx+uwsgi部署django项目
1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...
随机推荐
- [kubernetes]二进制部署k8s集群-基于containerd
0. 前言 k8s从1.24版本开始不再直接支持docker,但可以自行调整相关配置,实现1.24版本后的k8s还能调用docker.其实docker自身也是调用containerd,与其k8s通过d ...
- 1.JDK的安装与卸载
1.卸载: 卸载或更改程序,找到相应的JDK程序,删除 2.安装: 官网下载JDK程序:jdk-8u25-windows-i586.exe 双击安装程序,同意协议,更改安装路径:C:\jdk1.8.0 ...
- 虾皮shopee根据ID取商品详情 API 返回值说明
item_get-根据ID取商品详情 注册开通 shopee.item_get 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) secr ...
- 京东搜索EE链路演进
导读 搜索系统中容易存在头部效应,中长尾的优质商品较难获得充分的展示机会,如何破除系统的马太效应,提升展示结果的丰富性与多样性,助力中长尾商品成长是电商平台搜索系统的一个重要课题.其中,搜索EE系统在 ...
- Hutool,一个超好用的 Java 工具类库
一.简介 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的". ...
- 如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考
大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作.作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长. BOSS直 ...
- 从MVC到DDD,该如何下手重构?
作者:付政委 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥.多年的 DDD 应用,使我开了技术的眼界! MVC 旧工程腐化严重,迭代成本太高 ...
- Fireboom on Sealos:半小时搞定一个月的接口工作
后端日常开发工作中有 88% 的接口都是 CURD,占用了超过 6 成开发时间.这些工作枯燥乏味,且价值低下,不仅荒废了时间,还无法获得任何成就感.而 Fireboom 可在 2 分钟内,完成传统模式 ...
- MySQL系列之备份恢复——运维在备份恢复方面、备份类型、备份方式及工具、逻辑备份和物理备份、备份策略、备份工具使用-mysqldump、企业故障恢复案例、备份时优化参数、MySQL物理备份工具
文章目录 1. 运维在数据库备份恢复方面的职责 1.1 设计备份策略 1.2 日常备份检查 1.3 定期恢复演练(测试库) 1.4 故障恢复 1.5 迁移 2. 备份类型 2.1 热备 2.2 温备 ...
- [NISACTF 2022]level-up
[NISACTF 2022]level-up 查看源码,根据这个提示就可以反应出是需要去访问robots.txt这个文件 访问level_2_1s_h3re.php进入第二关 需要post进去arra ...