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,你可以使用
apt
或pip
命令来安装它们:
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/service
或uwsgi
命令来启动它们。
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文件,避免在下次启动服务器时出现文件冲突或占用的问题
相关文章:
Django、Nginx、uWSGI详解及配置示例
一、Django、Nginx、uWSGI的概念、联系与区别 Django、Nginx 和 uWSGI 都是用于构建和运行 Web 应用程序的软件,这三个软件的概念如下: Django:Django 是一个基于 Python 的开源 Web 框架,它提供了一套完整的工具和组件…...
王道考研计算机组成原理——计算机硬件的基础知识
计算机组成原理的基本概念 计算机硬件的针脚都是用来传递信息,传递数据用的: 服务程序包含一些调试程序: 计算机硬件的基本组成 控制器通过电信号来协调其他部件的工作,同时负责解析存储器里存放的程序指令,然后指挥…...
[晕事]今天做了件晕事21;设置代理访问网站的时候需注意的问题
今天在家上班,设置好VPN,通过代理来访问公司内部的一个系统浏览器的反应如下: Hmmm… can’t reach this page ***.com refused to connect. 这个返回的错误,非常的具有迷惑性,提示的意思:拒绝链接…...
Go通过reflect.Value修改值
到目前为止,反射还只是程序中变量的另一种读取方式。然而,在本节中我们将重点讨论如何通过反射机制来修改变量。 回想一下,Go语言中类似x、x.f[1]和*p形式的表达式都可以表示变量,但是其它如x 1和f(2)则不是变量。一个变量就是一…...
【MySql】4- 实践篇(二)
文章目录 1. SQL 语句为什么变“慢”了1.1 什么情况会引发数据库的 flush 过程呢?1.2 四种情况性能分析1.3 InnoDB 刷脏页的控制策略 2. 数据库表的空间回收2.1 innodb_file_per_table参数2.2 数据删除流程2.3 重建表2.4 Online 和 inplace 3. count(*) 语句怎样实现…...
获取多个接口的数据并进行处理,使用Promise.all来等待所有接口请求完成
Promise.all (等待机制) 方法 它调用了多个函数,这些函数返回了Promise对象,每个Promise对象代表了一个异步操作。 然后,使用Promise.all将这多个Promise对象包装成一个新的Promise对象,它会等待所有的Promise都完成(或…...
利用C++开发一个迷你的英文单词录入和测试小程序-升级版本
我们现在有了一个本地sqlite3的迷你英文单词小测试工具,需求就跟工作当中一样是不断变更的。这里虚构两个场景,并且一步一步的完成最终升级后的小demo。 场景:数据不依赖本地sqlite3,需要支持远程访问,用目前的restfu…...
用c动态数组(实现权重矩阵可视化)实现手撸神经网络230902
变量即内存、指针使用的架构原理: 1、用结构struct记录 网络架构,如 float*** ws 为权重矩阵的指针(指针地址); 2、用 = (float*)malloc (Num * sizeof(float)) 给 具体变量分配内存; 3、用 = (float**)malloc( Num* sizeof(float*) ) 给 指向 具体变量(一维数组)的…...
Android.mk和Android.bp
公司承接Android、iOS等APP开发、前后端网站开发、小程序开发、安全服务等项目! 公司官网:www.bincodesec.com 项目案例 一、编译不同类型的模块 1.编译成Java库 Android.mk include $(BUILD_JAVA_LIBRARY)Android.bp java_library {} 2.编译成Java静态库 And…...
CSS 常用样式-文本属性
一、水平对齐 text-align CSS中的text-align属性用于水平对齐文本。它可以应用于块级元素和表格单元格。 常见的属性值包括: left:左对齐,文本在容器的左侧。right:右对齐,文本在容器的右侧。center:居中…...
BootstrapBlazor企业级组件库:前端开发的革新之路
作为一名Web开发人员,开发前端我们一般都是使用JavaScript,而Blazor就是微软推出的基于.Net平台交互式客户Web UI 框架,可以使用C#替代JavaScript,减少我们的技术栈、降低学习前端的成本。 而采用Blazor开发,少不了需…...
力扣 -- 1745. 分割回文串 IV
解题步骤: 参考代码: class Solution { public:bool checkPartitioning(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));for(int in-1;i>0;i--){for(int ji;j<n;j){if(s[i]s[j]){dp[i][j]i1<j?dp[i…...
C# 给某个方法设定执行超时时间
C# 给某个方法设定执行超时时间在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死。 在这时、我们可以通过Thread、Thread Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死, 但是…...
安装NodeJS并使用yarn下载前端依赖
文章目录 1、安装NodeJS1.1 下载NodeJS安装包1.2 解压并配置NodeJS1.3 验证是否安装成功2、使用yarn下载前端依赖2.1 安装yarn2.2 使用yarn下载前端依赖参考目标:在Windows下安装新版NodeJS,并使用yarn下载前端依赖,实现运行前端项目。 1、安装NodeJS 1.1 下载NodeJS安装包…...
(Java高级教程)第三章Java网络编程-第八节:博客系统搭建(前后端分离)
文章目录 一:前端页面回顾二:博客功能展示三:数据库表设计(1)表设计(2)封装DataSource 四:实体类和数据访问对象(1)实体类(2)数据访问…...
901. 股票价格跨度
设计一个算法收集某些股票的每日报价,并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。 例如,如果未来 7 天股票的价格是 [100,…...
JavaScript中的模块化编程,包括CommonJS和ES6模块的区别。
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 模块化编程概述⭐ CommonJS 模块⭐ ES6 模块⭐ 区别⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、…...
从零开始 Spring Cloud 13:分布式事务
从零开始 Spring Cloud 13:分布式事务 1.分布式事务问题 用一个示例项目演示在分布式系统中使用事务会产生的问题。 示例项目的 SQL:seata_demo.sql 示例项目代码:seata-demo.zip 这个示例项目中的微服务的互相调用依赖于 Nacos…...
2023Node.js零基础教程(小白友好型),nodejs新手到高手,(二)NodeJS入门——buffer模块、计算机基础、fs模块、path模块
就算步子乱了又如何,接着跳下去就好了。——《闻香识女人》 开始 011_Buffer_介绍与创建 hello,大家好,我们来学习一下buffer。首先来看看 buffer 是一个什么东东。buffer,中文译为缓冲区,是一个类似于数组的对象&am…...
lua如何调用C/C++
1 lua vs C/C lua是脚本语言,优点是门槛低,可以热更新,缺点当然就是性能。C/C是编译型语言,有点是性能高,但是相对的,门槛高,技术不好的人写的代码可能还没有lua的性能高,容易出现c…...
简单聊一聊公平锁和非公平锁,parallel并行流
目录 一、降低锁的粒度,将synchronized关键字不放在方法上了,改为synchronized代码块。二、先区分一下公平锁和非公平锁1、公平锁2、非公平锁3、公平锁的优缺点:4、非公平锁的优缺点: 三、是否对症下药四、IntStream.rangeClosed是…...
【SpringCloud】微服务技术栈入门4 - RabbitMQ初探
目录 RabbitMQ安装 rabbitmqSpringAMQP 基础队列WorkQueue路由发布订阅 FanoutExchangeDirectExchangeTopicExchange RabbitMQ 安装 rabbitmq 首先确保自己已经安装好了 docker 是 docker 拉取镜像文件:docker pull rabbitmq:3-management 拉取完毕,打…...
cefsharp(117.2.20)cef117.2.2最新体验版
一、下载nupkg https://www.nuget.org/packages/CefSharp.WinForms/ https://www.nuget.org/packages/CefSharp.Common/ https://www.nuget.org/packages/cef.redist.x64/ https://www.nuget.org/packages/cef.redist.x86/ 此版本暂时不支持H264。上一版本支持H264 cefsharp…...
layui在上传图片在前端处理图片压缩
有的人会遇到需要在前端代码处理图片压缩的问题,下面给大家分享怎么处理。 // 上传图片 var image_src var IsImgDealfalse; layui.upload.render({ elem: "#{tag}{id}", url: sessionStorage.getItem(httpUrlPrefix) /upload/uploadImage, // dataT…...
js 事件参考
事件参考 事件介绍 触发事件是为了通知代码可能影响代码执行的“有趣变化”。这些可能来自用户交互,例如使用鼠标或调整窗口大小,底层环境状态的变化(例如,低电量或来自操作系统的媒体事件)以及其他原因。 每个事件都由一个基于Event接口的…...
卷积网络的发展历史-LeNet
简介 LeNet是CNN结构的开山鼻祖,第一次定义了卷积神经网络的结构。 LeNet模型包含了多个卷积层和池化层,以及最后的全连接层用于分类。其中,每个卷积层都包含了一个卷积操作和一个非线性激活函数,用于提取输入图像的特征。池化层…...
(2023,GPT-4V,LLM,LMM,功能和应用)大型多模态模型的黎明:GPT-4V(ision) 的初步探索
The Dawn of LMMs: Preliminary Explorations with GPT-4V(ision) 公众号:EDPJ(添加 VX:CV_EDPJ 或直接进 Q 交流群:922230617 获取资料) 目录 0. 摘要 1. 简介 1.1 动机和概述 1.2 我们探索 GPT-4V 的方法 1.3…...
【C++设计模式之装饰模式:结构型】分析及示例
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许在运行时动态地给一个对象添加额外的行为。 描述 装饰模式通过创建一个包装器(Wrapper)来包裹原始对象,并在原始对象的行为前后添加额外的功能。…...
绘制散点图、曲线图、折线图和环形图失败, 设置迭代次数和进度无法保存图片
错误❌ 分别input设置(我想知道微积分的力量) 设1个人,他有每天3种方案,每天进步千分之一,千分之一,十万分之一等到他们迭代 200,500,1000,2000,3000,5000,9000次 他们在图片什么位置画曲线图࿰…...
micro-ROS中对消息的内存管理
文章目录 1.背景2.答案2.1.基本类型及其数组,不需要2.1.序列类型(复合类型、复合序列类型),需要 3.内存申请方法3.1.手动申请(Manual allocation)3.1.工具辅助(micro-ROS utilities)…...
武汉住房和城乡建设厅网站/站长工具seo综合查询网
https://blog.csdn.net/sky__man/article/details/78178821 转载于:https://www.cnblogs.com/tao-yuan/p/9144838.html...
找人做网页要多少钱/云南网络营销seo
比如计算好某个品种的价差,符合无风险套利,然后进行编程。当市场波动有先有后的时候,出现这种交易机会,马上成交。其实这是在做价差或者某个比价的极值。目前这种交易方式在国内也有非常多。比如股指期货的期现套利,比…...
做网站的关键词/百度首页优化
2016年6月毕业以来,生活开始渐渐只剩下工作,除了工作时间,更是大把的时间留给了学习,虽然说专业技能有所提升,但是生活开始慢慢变得无聊不明确,工作是为了什么,赚钱是为了什么,怎么平…...
开发网站监控工具/草根seo博客
开发移动应用是一项非常复杂的工作,但作为开发者,我们就是来解决这个复杂的。状态机(state machine)是一个很好的工具,它可以帮助我们简化开发中的复杂问题。因此,在本篇基于Swift语言的Xcode教程中&#x…...
番禺网站建设品牌好/百度客服电话人工服务
冯诺依曼体系结构五大部分 冯诺依曼五大结构体系 CSDN冯 诺依曼原理中,计算机硬件系统由那五大部分组成的 急急急急急急急急急急急急急急急急急急急急急急冯诺依曼结构原理及层次结构分析冯 诺依曼体系结构的发展背景冯诺依曼结构和哈佛结构的详细资料说明计算机组成原理学习笔…...
陵水网站建设哪家好/软文营销经典案例200字
a:link 链接未点击上去时候 a:visited 链接已经点击过的 a:hover 鼠标放在链接上未点击 a:active 是介于hover visited 之间的一个状态,可以说是链接被按下时候的状态...