本文首发于公众号:Hunter后端

原文链接:Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作

这一篇笔记介绍如何使用 Nginx + uWSGI 来部署 Django。

上一篇笔记中有介绍直接使用 uWSGI 作为 web 服务器来部署 Django,这一篇笔记介绍如何使用 Nginx 来部署。

使用 Nginx 来部署相当于在 uWSGI 外面又嵌套了一层,uWSGI 作为内部服务被隐藏起来,这时候 Nginx 起的作用是反向代理。

在这里,Nginx 的安装操作就不赘述了,网上都可以找得到如何操作,这里只讲相关的配置操作。

以下是本篇笔记目录:

  1. uWSGI 配置
  2. Nginx 配置及其作用
  3. 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负载均衡操作的更多相关文章

  1. Django笔记二十四之数据库函数之比较和转换函数

    本文首发于公众号:Hunter后端 原文链接:Django笔记二十四之数据库函数之比较和转换函数 这一篇笔记开始介绍几种数据库函数,以下是几种函数及其作用 Cast 转换类型 Coalesce 优先取 ...

  2. 填坑!!!virtualenv 中 nginx + uwsgi 部署 django

    一.为什么会有这篇文章 第一次接触 uwsgi 和 nginx ,这个环境搭建,踩了太多坑,现在记录下来,让后来者少走弯路. 本来在 Ubuntu14.04 上 搭建好了环境,然后到 centos7. ...

  3. nginx + uwsgi 部署 Django+Vue项目

    nginx + uwsgi 部署 Django+Vue项目 windows 本地 DNS 解析 文件路径 C:\Windows\System32\drivers\etc 单机本地测试运行方式,调用dj ...

  4. Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统

    Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...

  5. nginx + uwsgi 部署django项目

    因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...

  6. Nginx + uWSGI 部署Django 项目,并实现负载均衡

    一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...

  7. Debian7下初次尝试Nginx+Uwsgi部署Django开发环境

    之前一直都用的是新浪的SAE,但是由于各种限制,各种不爽,终于下定决心开始折腾VPS,于是在搬瓦工上买了个年付VPS,开始折腾之旅. 由于对Linux一窍不通,所以不知道如何在Linux上部署开发环境 ...

  8. nginx+uwsgi 部署 django

    预装:nginx,  django Django站点tree |Site |-----Blog(自建的项目) |-----Manage.py |-----Site(setting url wsgi-. ...

  9. 生产环境使用Nginx+uwsgi部署Django

    在本地运行django应用相对来说还是挺方便的,使用自带的runserver启动即可.如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等 在网上找到了不错的部署的教 ...

  10. nginx+uwsgi部署django项目

    1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...

随机推荐

  1. KVM下windows由IDE模式改为virtio模式蓝屏 开不开机

    KVM安装Windows默认使用的是qemu虚拟化IDE硬盘模式,在这种情况下,IO性能比较低,如果使用virtio的方式可以提高虚拟机IO性能. 于是我想将这台虚拟机迁移到openstack中管理 ...

  2. 图解Spark Graphx实现顶点关联邻接顶点的函数原理

    一.场景案例 在一张社区网络里,可能需要查询出各个顶点邻接关联的顶点集合,类似查询某个人关系比较近的都有哪些人的场景. 在用Spark graphx中,通过函数collectNeighbors便可以获 ...

  3. @Validated指定校验顺序

    在Java中,使用@NotNull注解时,可以指定多个参数的顺序.为了指定顺序,你可以使用@GroupSequence注解. 首先,为每个需要校验的参数定义一个接口,并在接口上添加@GroupSequ ...

  4. 「Tricks」整体DP

    不太了解这个东西的具体定义是什么,总之应该是一个用数据结构维护 DP 状态的某几个维度的 trick 吧. 事实上你可以把这篇 post 理解为三个题的解集. 先直接来看 noi2020 - Dest ...

  5. 洛谷题解 | AT_abc321_c Primes on Interval

    目录 题目翻译 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输出 #2 样例 #3 样例输入 #3 样例输出 #3 题目简化 题目思路 A ...

  6. Linux下安装MySQL问题及报错解决

    前言: 在Linux环境下,安装MySQL服务 环境: 虚拟机CentOS7 \-----------------------------------------------\ 流程: 确保mysql ...

  7. Go 语言开发环境搭建

    Go 语言开发环境搭建 目录 Go 语言开发环境搭建 一. GO 环境安装 1.1 下载 1.2 Go 版本的选择 1.3 安装 1.3.1 Windows安装 1.3.2 Linux下安装 1.3. ...

  8. Python开发之Django框架

    一. Django框架 01.网络软件开发架构演变过程 02.HTTP协议讲解 03.web应用与框架介绍及手撸web框架 04.Django入门项目创建与必会三板斧 05.Django静态文件配置与 ...

  9. 报Bug的礼仪

    不要对1个程序员说:你的代码有Bug.他的第1反应是:1.你的环境有问题吧:2.傻逼你会用吗? 如果你委婉的说:你这个程序和预期的有点不1致,你看看是不是我的打开姿势有问题?他本能的会想:擦,是不是出 ...

  10. .NET静态代码织入——肉夹馍(Rougamo)发布2.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo)通过静态代码织入方式实现AOP的组件,其主要特点是在编译时完成AOP代码织入,相比动态代理可以减少应 ...