Django、Nginx、uWSGI详解及配置示例

一、Django、Nginx、uWSGI的概念、联系与区别

Django、Nginx 和 uWSGI 都是用于构建和运行 Web 应用程序的软件,这三个软件的概念如下:

  • Django:Django 是一个基于 Python 的开源 Web 框架,它提供了一套完整的工具和组件,可以帮助开发人员快速构建 Web 应用程序。Django 遵循了 MVC(模型-视图-控制器)的设计模式,将业务逻辑、数据模型和用户界面分离,提高了代码的可读性和可维护性。Django 还支持多种数据库、缓存、模板引擎、表单验证、国际化、安全性等特性,使得开发者可以专注于业务需求,而不用担心底层的细节。Django 框架主要负责处理业务逻辑和生成结果给 Web 服务器,再由 Web 服务器返回给浏览器。而 Web 框架和 Web 服务器之间的通信需要遵循一套规范,这个规范就是 WSGI。
  • Nginx:Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,它可以处理来自客户端(例如浏览器)的 HTTP 请求,并将其转发给后端的 Web 应用程序或其他服务器。Nginx 具有高并发、低内存占用、负载均衡、静态文件缓存等优点,可以提高 Web 应用程序的响应速度和可靠性。如果你有多个 Web 服务器,你可以使用 Nginx 来做负载均衡,根据某些规则将不同的请求分发到不同的 Web 服务器上去。
  • uWSGI:uWSGI 是一个实现了 WSGI 协议、uwsgi 协议和 HTTP 协议的 Web 服务器接口,它可以在 Web 服务器和 Web 应用程序之间提供接口,使得它们可以相互通信。WSGI(Web Server Gateway Interface)是一种 Python 用于 Web 开发的标准接口,它定义了 Web 服务器如何调用 Web 应用程序,并将结果返回给客户端,在生产环境中使用 WSGI 作为 Python Web 的服务器。uwsgi 是 uWSGI 程序实现的一个私有协议,它采用二进制格式传输数据,比 HTTP 协议更高效。uWSGI 是一个应用服务器,它可以将客户端请求转发给 Django 等 Web 应用程序进行处理。

Django、Nginx、uWSGI 之间的联系和区别主要体现在以下几个方面:

  • 角色:Django 是一个 Web 框架,负责处理业务逻辑和生成响应内容;Nginx 是一个 Web 服务器,负责接收和转发 HTTP 请求;uWSGI 是一个 Web 服务器接口,负责将 HTTP 请求转换为 WSGI 请求,并调用 Django 处理。
  • 协议:Django 遵循 WSGI 协议,与 uWSGI 进行通信;Nginx 遵循 HTTP 协议,与客户端和 uWSGI 进行通信;uWSGI 支持多种协议,包括 HTTP、uwsgi 和 WSGI。
  • 性能:Django 本身不是一个高性能的 Web 框架,它需要借助其他软件来提高效率;Nginx 是一个高性能的 Web 服务器,它可以处理大量的并发请求,并缓存静态文件;uWSGI 是一个高效的 Web 服务器接口,它可以利用 uwsgi 协议减少数据传输的开销。
  • 配置:Django 需要在 settings.py 文件中配置数据库、中间件、应用等信息;Nginx 需要在 nginx.conf 文件中配置监听端口、反向代理规则、静态文件路径等信息;uWSGI 需要在 uwsgi.ini 文件中配置项目路径、端口号、进程数等信息。

总结一下:

  • Nginx:HTTP 服务器,反向代理服务器。
  • uWSGI:应用服务器,或者更精确地说是 WSGI 应用容器。
  • Django:WSGI 应用程序(框架)。

二、Nginx正向代理和反向代理的区别

正向代理和反向代理是两种不同的代理模式,它们的区别主要在于代理的对象和目的不同:

  • 正向代理:指客户端(如浏览器)通过代理服务器来访问目标服务器,目的是为了隐藏客户端的真实身份或者突破访问限制。正向代理的特点是客户端知道目标服务器的地址,而目标服务器不知道客户端的地址。例如,如果你想访问某个国外的网站,但是由于网络封锁或者速度慢,你可以通过一个正向代理服务器来转发你的请求,这样就可以提高访问效率或者绕过限制。
  • 反向代理:指客户端(如浏览器)直接访问代理服务器,然后代理服务器再转发请求给目标服务器,目的是为了提高目标服务器的性能或者安全性。反向代理的特点是客户端不知道目标服务器的地址,而目标服务器知道代理服务器的地址。例如,如果你想访问某个网站,但是这个网站有多台后端服务器提供服务,你可以通过一个反向代理服务器来分发你的请求,这样就可以实现负载均衡或者缓存等功能。

总之,正向代理和反向代理的区别就是看你是站在客户端的角度还是目标服务器的角度。正向代理是为了满足客户端的需求,而反向代理是为了满足目标服务器的需求。

三、Nginx与uWSGI的配置文件示例

要在 Django 应用程序中使用 Nginx 和 uWSGI,你需要做以下几个步骤:

  • 安装 Nginx 和 uWSGI,你可以使用 aptpip 命令来安装它们:
apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring  # 安装Nginx依赖包
apt-get update
apt-get install nginx  # 安装Nginx
nginx -v  # 查看版本号systemctl start nginx  # 启动Nginx
systemctl status nginx  # 查看运行状态# 如果systemctl指令报错可以使用service指令启动
service nginx start
service nginx statuspip install uwsgi  # 安装uWSGIsudo /etc/init.d/nginx start  # 启动Nginx服务
uwsgi --ini scripts/uwsgi.ini  # 启动uWSGI服务(假设配置文件在scripts目录下)
  • 配置 uWSGI,你需要创建一个 ini 文件,指定你的项目目录、模块、端口、进程、日志等信息。
  • 配置 Nginx,你需要创建一个 conf 文件,指定你的监听端口、服务器名、静态文件路径、反向代理规则等信息。
  • 启动 uWSGI 和 Nginx,你可以使用 systemctl/serviceuwsgi 命令来启动它们。

Nginx 配置文件的位置一般是在 /etc/nginx/nginx.conf,它用来定义 Nginx 服务器的基本参数。Nginx 配置文件的语法格式是由多个块组成,每个块用花括号 {} 包围,每个指令用分号 ; 结束。例如,一个简单的 Nginx 配置文件可以写成这样:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;events {worker_connections 768;# multi_accept on;
}http {sendfile on;tcp_nopush on;tcp_nodelay on;keepalive_timeout 65;types_hash_max_size 2048;include /etc/nginx/mime.types;default_type application/octet-stream;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLEssl_prefer_server_ciphers on;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;gzip on;include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;server {listen 80;  # 监听80端口,作为默认服务器server_name app4007.acapp.acwing.com.cn;  # 服务器名,可以是域名或IP地址rewrite ^(.*)$ https://${server_name}$1 permanent;}server {listen 443 ssl;  # 将80端口的HTTP请求重定向到443端口的HTTPS请求,提高安全性,使用SSL证书和协议来保证HTTPS请求的加密和验证server_name app4007.acapp.acwing.com.cn;ssl_certificate   cert/acapp.pem;ssl_certificate_key  cert/acapp.key;ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;charset utf-8;access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;client_max_body_size 10M;location / {  # 匹配所有请求路径include /etc/nginx/uwsgi_params;  # 包含uWSGI的请求参数uwsgi_pass 127.0.0.1:8000;  # 转发请求给uWSGI服务器,由Django应用程序处理uwsgi_read_timeout 60;  # 设置uWSGI的读取超时时间}location /static {  # 匹配以'/static'开头的请求路径,将以'/static'开头的请求直接返回静态文件内容,提高效率alias /home/asanosaki/djangoapp/static/;  # 指定静态文件存放的目录}location /wss {  # 匹配以'/wss'开头的请求路径,将以'/wss'开头的请求转发给WebSocket服务器,实现双向通信proxy_pass http://127.0.0.1:5015;proxy_set_header X-Real-IP $remote_addr;proxy_set_header Host $http_host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}}
}

uWSGI 配置文件的位置可以自己指定,一般放在项目目录下,假设我们在项目根目录下的 scripts/uwsgi.ini 文件中。uWSGI 配置文件的语法格式是由多个节组成,每个节用方括号 [] 包围,每个指令用等号 = 赋值。例如,一个简单的 uWSGI 配置文件可以写成这样:

[uwsgi]
socket = 127.0.0.1:8000  # 用于和Nginx进行数据交互的端口
chdir = /home/asanosaki/djangoapp  # Django项目的根目录,使用绝对路径
wsgi-file = djangoapp/wsgi.py  # wsgi.py在Django项目中的位置
master = true  # 启动主进程,来管理其他进程
processes = 2  # 最大开启的进程数
threads = 5  # 每个进程的线程数
vacuum = true  # 当服务器退出的时候自动删除unix socket文件和pid文件,避免在下次启动服务器时出现文件冲突或占用的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/94805.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决每次重启ganache虚拟环境,十个账号秘钥都会改变问题

很多时候 我们启动一个 ganache 环境 然后 通过私钥 在 MetaMask 中 导入用户 但是 当我们因为 电脑要关机呀 或者 ETH 消耗没了呀 那我们就不得不重启一个ganache虚拟环境 然后 你在切一下网络 让它刷新一下 你就会发现 上一次导入的用户就没有了 这是因为 你每次 ganache…

第2篇 机器学习基础 —(1)机器学习方式及分类、回归

前言:Hello大家好,我是小哥谈。机器学习是一种人工智能的分支,它使用算法和数学模型来使计算机系统能够从经验数据中学习和改进,而无需显式地编程。机器学习的目标是通过从数据中发现模式和规律,从而使计算机能够自动进…

React封装自定义表单校验方法

一、表单校验 为什么要封装自定义表单校验方法,因为在后台管理系统中,通常我们会涉及到用户的添加或则信息的修改,这时候通常就涉及表单的相关校验。但通常一个系统中的表单校验针对同一个字段来说是统一的。因此我们就需要将对应的校验字段的…

STM32复习笔记(五):FSMC连接外部SRAM

目录 Preface: (一)原理相关 (二)CUBEMX配置 (三)轮询方式读写 (四)DMA方式读写 Preface: STM32F4有一个FSMC(Flexible Static Memory Contr…

侯捷 C++ STL标准库和泛型编程 —— 9 STL周围

最后一篇,完结辽!😋 9 STL周围 9.1 万用Hash Function Hash Function的常规写法:其中 hash_val 就是万用Hash Function class CustumerHash { public:size_t operator()(const Customer& c) const{ return hash_val(c.fna…

BASH shell脚本篇5——文件处理

这篇文章介绍下BASH shell中的文件处理。之前有介绍过shell的其它命令,请参考: BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 BASH shell脚本篇3——字符串处理 BASH shell脚本篇4——函数 在Bash Shell脚本中,可以使用…

【C++】String -- 详解

⚪C语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便,C 标准库中提供了一些 str 系列的库函数,但是这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户自己…

【Linux】工具:gcc/g++ 升级 7.3 版本

安装语言信息 sudo yum install -y centos-release-scl-rh centos-release-scl安装 7.3 版本 gcc 和 g 编译器 sudo yum install -y devtoolset-7-gcc devtoolset-7-gcc-c加载配置文件 临时生效 source /opt/rh/devtoolset-7/enable 将相应内容重定向到配置文件中&#xff…

Is This The Intelligent Model(这是智能模型吗)

Is This The Intelligent Model 这是智能模型吗 Ruoqi Sun Academy of Military Science Defense Innovation Institute, Beijing, 100091, China E-mail: ruoqisun7163.com The exposed models are called artificial intelligent models[1-3]. These models rely on knowled…

讲讲项目里的仪表盘编辑器(二)

应用场景 正常来说,编辑器应用场景应该包括: 编辑器-预览 编辑器 最终运行时 怎么去设计 上一篇推文,我们已经大概了解了编辑器场景。接下来,我们来看预览时的设计 编辑器-预览 点击预览按钮,执行以…

[Unity][VR]Oculus透视开发图文教程1-Passthrough应用XR项目设置

Oculus现在已向开发者公布了如何使用自己的设备Camera,本系列课程就来手把手地告诉你如何在Unity中使用这个特性。 第一步,既然用的是Quest的特性,那就需要先引入Quest的Unity开发SDK。并且完成基本的VR开发项目设置。 新建Unity项目后,在编辑器界面先点击Window,打开资…

虹科分享 | 为工业机器人解绑,IO-Link wireless无线通讯技术可实现更加轻量灵活的机器人协作

背景 机器人是一种能够半自主或全自主工作的智能机器。中国电子学会组织发布的《中国机器人产业发展报告(2022年)显示,近些年,我国机器人市场规模持续快速增长,“机器人”应用不断拓展深入,预计五年年均增…

YOLOv5、YOLOv8改进:RepVGG结构

1.简介 论文参考:最新RepVGG结构: Paper 我们所说的“VGG式”指的是: 没有任何分支结构。即通常所说的plain或feed-forward架构。 仅使用3x3卷积。 仅使用ReLU作为激活函数。 主要创新点为结构重参数化。在训练时,网络的结构是多分支进…

P4727 [HNOI2009] 图的同构计数

B u r n s i d e : ∣ X / G ∣ 1 ∣ G ∣ ∑ g ∈ G ∣ X ( g ) ∣ Burnside:|X/G|\frac{1}{|G|}\sum\limits_{g\in G}|X^{(g)}| Burnside:∣X/G∣∣G∣1​g∈G∑​∣X(g)∣ 该题: ∣ X / G ∣ 1 ∣ G ∣ ∑ b 2 k Π ( b i …

Visopsys 0.92 发布

Visopsys 是一个 PC 机的操作系统,系统小型、快速而且开源。有着丰富的图形界面、抢先式多任务机制以及支持虚拟内存。Visopsys 视图兼容很多操作系统,但并不是他们的克隆版本。Visopsys 0.92 现已发布,此维护版本引入了多任务处理程序、文件…

JS里实现判断条件不通过退出整个循环

总结,使用for...in循环实现。 如果你需要在JavaScript中使用类似break的行为,你可以使用for...in循环。下面是一个例子: let arr [1, 2, 3, 4, 5];for (let index in arr) {if (arr[index] > 3) {console.log(找到了大于3的元素&#xf…

3126: 【C2】【结构体】小明做调查

题目描述 小明的班级同学们很不喜欢小明,小明想做点什么改变同学们的印象,现在小明想调查班级中每个同学的生日,并按照从大到小的顺序排序。但和蔼的编程老师总让他去放鸭子了,没有时间,所以请你帮他排序。 输入 有…

二叉树题目:路径总和 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:路径总和 II 出处:113. 路径总和 II 难度 4 级 题目描述 要求 给你二叉树的根结点 root \tex…

MySQL找回误删的数据,数据恢复

原创作品,未经同意,请勿转载;允许复制链接,对原文直接进行转发。 原创作者玉龙有着十几年大厂软件开发工作经验, 目前自由职业, 欢迎业务洽谈。 误删了几十万条MySQL记录, 要如何找回物理删除的…

我的第一个react.js 的router工程

react.js 开发的时候,都是针对一个页面的,多个页面就要用Router了,本文介绍我在vscode 下的第一个router 工程。 我在学习react.js 前端开发,学到router 路由的时候有点犯难了。经过1-2天的努力,终于完成了第一个工程…