简介:许多朋友询问了Django如何处理高和合并的问题。首席执行官在本文中注明将为您提供详细的答案,以供所有人参考。我希望这对每个人都会有所帮助!让我们一起看看!
Django具有自身的效率,并且不使用Epoll/Kqueue。
很难说有多少人在线。
测试后,对于我的计算机,最初的Django项目的能力约为294。
相反,龙卷风是高性能的服务器。其文档的网络示例约为1324。
一个仅包含“ Hello World!”的静态文件在nginx上,约为2942
通过nginx部署Django(基于Ubuntu)
部署Django有很多方法。NGINX+UWSGI的方法是一种更常见的方法。
这样,我们通常的方法是将NGINX用作服务器的前端,它将接收Web的所有请求并均匀地管理请求。NGINX请求所有静态请求以处理自身(这是NGINX的优势)。
可以看出,UWSGI的作用类似于桥梁。它扮演了桥梁的角色。
Linux的强度用于用作服务器,因此我们选择完成以下整个部署过程。
1.安装nginx
NGINX是一款轻巧的Web服务器/反向代理服务器和电子邮件(IMAP/POP3)代理服务器,并根据BSD样协议发行。它的特征是拥有较少的内存和强大的并发症。实际上,NGINX的并发能力确实在同一类型的Web服务器中表现良好。
Nginx也是一家非常受欢迎的Web服务器。在其部署Django的情况下,我们还在这里简要介绍。
NGINX官方网站:
打开Ubuntu控制台(CTRL+ALT+T),以使用Ubuntu的仓库安装。
fnngj@ubuntu:?$ sudo apt-get安装nginx #installation
启动nginx:
fnngj@ubuntu:?$ /etc/init.d/nginx开始#startup
fnngj@ubuntu:?$ /etc/init.d/nginx stop #close
fnngj@ubuntu:?$ /etc/init.d/nginx restart #restart
修改nginx的默认端口号,打开/etc/nginx/nginx.conf文件,然后修改端口号。
复制代码
服务器 {
听8088;#修改端口号
server_name localhost;
#Charset KOI8-R;
#access_log logs/host.access.log main;
地点 / {
根HTML;
索引index.html index.htm;
}
复制代码
关于文件36的位置,默认的80端号更改为其他端口号,例如8088。由于其他应用程序很容易占用默认的80 -port号码。
然后,通过上面的命令重新启动nginx。访问:http // 127.0.0.1:8088/
如果图片出现在上方,则NGINX启动成功。
第二,安装UWSGI
通过PIP安装UWSGI。
root@ubuntu:/etc#python3 -m pip安装uwsgi
测试UWSGI并创建一个test.py文件:
def应用程序(env,start_response):
start_response('200 ok',[('content-type','text/html')]))))))
返回[B“ Hello World”]]
通过UWSGI运行文件。
fnngj@ubuntu:?/pydj $ uwsgi-http:8001-wsgi-file test.py
下一个配置Django连接到UWSGI。
fnngj@ubuntu:?/pydj $ uwsgi-http:8001-chdir/home/fnngj/pydj/myweb/-wsgi-file myweb/wsgi.py-master-master-master-master-master-processers 4-threads 2-stats127.0.0.0.0.0.0.0.0.1:9191919191:919191:919191
共同选择:
HTTP:协议类型和端口号
过程:启动过程的数量
工人:启动过程的数量等同于流程
CHDIR:指定操作目录
WSGI文件:已加载的WSGI文件(load.wsgi文件)
统计:在指定的地址上,开始状态服务
线程:运行threads.due to gil的存在,我认为这确实没有用。
主:允许主进程(启用主过程)
DAEMONIZE:使该过程在后台运行,并将日志击中指定的日志文件或UDP服务器(DAEMONIZE UWSGI)。实际上,最常用的是在本地文件上输出操作记录。
PIDFILE:指定PID文件的位置并记录主过程的PID号。
真空:当服务器退出时,自动清理环境,删除UNIX套接字文件和PID文件(尝试删除所有生成的文件/插座)
3. nginx+uwsgi+django
接下来,我们必须结合三个。第一个列表项目的必需文件:
myweb/
e- manage.py
b - ├myweb/
│_ _- __init__.py
│e ─—设置.py
│u - urURLS.PY
│s-wsgi.py
b - ─myweb_uwsgi.ini
当我们通过django创建MyWeb项目时,由sub -directory myweb生成的wsgi.py文件。因此,我们只需要创建myweb_uwsgi.ini配置文件即可。当然,UWSGI支持多种类型的配置文件,例如XML,INI等。
复制代码
#myweb_uwsgi.ini文件
[UWSGI]
#与Django相关的设置
插座=:8000
#基本目录(完整路径)
chdir =/home/fnngj/pydj/myweb
#django s wsgi文件
模块= myweb.wsgi
#与过程相关的设置
# 掌握
主= true
#最大工程数量
过程= 4
#...有适当的权限 - 可能需要
#chmod-socket = 664
#出口清除环境
真空= true
复制代码
这种配置实际上等同于上一节中的WSGI命令,以及用一堆参数归档的方法。
套接字指定项目执行的端口号。
CHDIR指定项目目录。
模块myweb.wsgi,您可以这样理解。对于myweb_uwsgi.ini文件,有一个具有级别的myWeb目录。此目录中有一个wsgi.py文件。
几个参数可以参考上一节中的参数引入。
接下来,切换到MyWeb项目目录,然后读取myweb_uwsgi.ini文件以通过UWSGI命令启动项目。
复制代码
fnngj@ubuntu:?cd/home/fnngj/pydj/myweb/
fnngj@ubuntu:?/pydj/myweb $ uwsgi -ini myweb_uwsgi.ini
[uwsgi]从myweb_uwsgi.ini获取INI配置
***开始UWSGI 2.0.12(32bit)[星期六3月12日13:05:06 2016] ***
编译版本:4.8.4,2016年1月26日06:14:41
操作系统:Linux-3.19.0-25代#26?14.04.1-ubuntu SMP星期五24:18:00 UTC 2015
Nodename:Ubuntu
机器:I686
时钟来源:UNIX
检测到的CPU核心数:2
当前的工作目录:/home/fnngj/pydj/myweb
检测到的二进制路径:/usr/local/bin/uwsgi
!!!没有Interzal路由支持,可以通过PCRE支持重建!!!
chdir()to/home/fnngj/pydj/myweb
您的过程编号限制为15962
您的内存页面大小为4096字节
检测到的最大文件描述符编号:1024
锁发动机:Pthread robust Mutexes
雷霆锁:禁用(您可以使用锁定锁)启用它)
UWSGI插座0绑定到TCP地址:8000 FD 3
Python版本:3.4.3(默认,2015年10月14日,20:37:06)[GCC 4.8.4]
*** Python线程支持被禁用。您可以使用-nable-threads ***启用它
Python主解释器在0x8B52DC0初始化
您的服务器插座收听积压限制为100个连接
您对工人的优雅运营的怜悯是60秒
映射4核的319920字节(312 kb)
***操作模式:预叉***
WSGI应用程序0(MountPoint ='')在解释器0x8b52dc0 pid:7158(默认应用程序)上准备就绪。
*** UWSGI以多解释器模式运行***
产卵的UWSGI主处理(PID:7158)
产卵的UWSGI工人1(PID:7160,核心:1)
产卵的UWSGI工人2(PID:7161,核心:1)
产卵的UWSGI工人3(PID:7162,核心:1)
产卵的UWSGI工人4(PID:7163,核心:1)
复制代码
注意UWSGI的启动信息。如果有任何错误,请检查是否设置了配置文件的参数。
我需要做的下一步是修改nginx.conf配置文件。open/etc/nginx/nginx.conf文件并添加以下内容。
复制代码
本国的
服务器 {
听8099;
server_name 127.0.0.1
charset UTF-8;
access_log/var/log/nginx/myweb_access.log;
error_log/var/log/nginx/myweb_error.log;
client_max_body_size 75m;
地点 / {
包括uwsgi_params;
UWSGI_PASS 127.0.0.1:8000;
uwsgi_read_timeout 2;
}
位置 /静态{
到期30d;
自动索引;
add_header缓存控制prive;
别名/home/fnngj/pydj/myweb/static/;
}
}
本国的
复制代码
侦听指定NGINX代理UWSGI的外部端口号。
server_name Internet上的大多数信息是URL集(例如,wwwexamplecom)。如果我将其设置在此处,则无法访问它,因此指定了指定的默认IP。
配置后,我有一个问题,我一直在考虑它。nginx如何与UWSGI关联。现在看来,最重要的是这两行配置。
包括uwsgi_params;
UWSGI_PASS 127.0.0.1:8000;
必须指定包含为uwsgi_params;以及uwsgi_pass和myweb_uwsgi.ini配置文件的IP端口。
现在重新启动nginx并查看上面的nginx的命令。然后,请访问:http // 127.0.0.1:8099/
通过此IP和端口号的方向,请求首先为nginx。如果您在页面上执行一些请求,则将看到这些请求最终将转移到UWSGI以处理它。
Python的网络框架
Django(大型,全面,模板,随附)
烧瓶(由Pocoo生产,这是一家精品店,带有Jinja2模板,可以更换))))
web.py(我还没有使用过,作者自杀了,主人是盲目的)
瓶子(只有一个文件框架,您需要自己构建整个开发系统)
Uliweb(由中文开发,也很好)
龙卷风(异步框架,适合长时间连接,例如在线聊天)
尽管据说Python框架充满了鲜花,但仍然有最大的框架,它是Django.Django的位置,主要称为:
①完美的文档,Django的成功,我认为很大一部分原因是归因于Django几乎完美的官方文档(包括Django Book)。
②一组完整的解决方案,例如Rails,提供了一套完整的解决方案(包括全堆栈框架 +电池),基本上需要的内容(例如:缓存,会话,feed,feed,orm,auth),以及所有djangocrecocretect由开发网站开发的Django本人基本上为您做了。因此,不必说开发效率很容易找到。它不在Django的源代码中。
③功能强大的URL路由配置,Django允许您设计一个非常优雅的URL。在Django中,您基本上可以对丑陋的获取参数说。
④自我服务背景,管理界面是对Django更具吸引力的Django。它使您在不编写代码行的情况下具有完整的背景管理界面。
做一个隐喻。如果A是服务器,则B是客户端,现在您必须在家吃热锅。尽管A说您可以来,但是B认为您必须带上一些东西,所以他去了市场。
我先去了蔬菜店。b想买一些菠菜,但我担心这个家庭已经可用,所以我打电话给
B:“我带一些菠菜,对吗?”
答:“好”
然后挂断电话。一段时间后,我到达了水上区域
B:“我带一点虾,对吧?”
答:“不”
...重复了很多之后,突然发现他确实做了一些少的准备,所以一个要求B打电话给B
答:“我忘了准备蘸酱,你买东西,然后不要先挂断电话”
Em
答:“买一瓶葡萄酒”
Em
这是Websocket
Django还应为Websocket提供支持,尽管这似乎不是更好。我们可以通过渠道实现Websocket连接
上面示例之类的场景是合适的场景
例如,例如,例如,聊天室,每个人发送的新闻都应实时显示在他人的屏幕上。
例如,数据监视,波动状态必须在屏幕上实时显示,而不是依靠用户刷新。
您需要安装频道,asgi_redis,asgiref,channels_redis。后三个可能无法安装,尚不清楚。
install_apps需要添加“频道”。应该注意的是,这是因为它是一个列表,其顺序有顺序。最好将其添加到第一个。
在这里,我们的频道通过REDIS实现,必须在settings.py中配置
这里也有一个小坑。官方文档中的主机不是这种格式,而是“ URI”模式,但是如果您设置了特殊符号('#$%'),如果设置了redis密码,您将发现REDIS的URI可以t直接使用它。在此期间,我尝试了各种方法,但我无法尝试。然后我去了Github打开一个问题。结果,作者说我们是由Aioredis建立联系的。
然后我找到了这种方式。
常规WSGI不支持WebSocket,因此您需要配置ASGI
asgi_application ='Project.Routing.Application'
像WSGI的配置一样,这是指项目文件夹下的Routing.py文件的应用
在这里,我建议您使用本官方教程的教程。有更多的悲剧。互联网上有许多渠道使用指南。他们中的大多数都有一个简单的聊天室或其他东西。因为频道在2.0升起后改变了一些方法,这些教程基本上是1.x版本。
简而言之,首先,StartApp称为聊天。如果我们没有正面和后端分离,则分别有两个html:索引和房间的模板。
创建一个新的Consuamers.py来编写WebSocket方法
如上所述,连接和断开连接的含义就像函数名称。因为这是一个聊天室,所以新闻应该分享同一聊天室中的人们。使用ROOM_GROUP_NAME区分其所在的通道。
接收和chat_message是消息的处理。当用户发送消息时,前端将通过websocket发送消息。Personnel将接收此消息推动,将接收到前端推动,然后在屏幕上显示。
定义Websocket的地址
类似于django的URL(cumputers.py与views.py相似),新routing.py是在同一级别上新创建的
统一使用WS/区分Websocket的连接
其余的常规页面配置与Django相同
Views.py:
urls.py:
注意:如果网站是http,则连接使用WS,如果是https,则将其修改为WSS
找到自己留下的信息,我对前端不了解
如果本地,Runserver很好,但是您仍然必须在线更改“开始”方法以处理高并发。
传统的UWSGI不支持WebSocket。
Gunicorn似乎同时支持Websocket,但性能不太好
在这里我们使用达芙妮
您需要在此处打开额外的服务,并且负责处理Websocket。
在入口中
Django本身带来了Runserver,但是我们仅在测试时使用它,而实际生产部署通常使用UWSGI+NGINX方法。
因为我们的生产环境通常具有大量并发访问,并且runserver带有django非常不稳定,因此最大连接数量大约是数十个,并且过多的并发连接导致服务崩溃,并且安全性不在术语中。安全。
NGINX可以支持高并发连接。官方放弃的连接数量约为50,000,在实际生产中,它也约为20,000?40,000。在情况下,该版本已升级)。
相对比较,Django随附的Runserver仅适合我们在测试过程中使用它。
结论:以上是首席CTO注释如何引入Django的全部内容。我希望这对每个人都会有所帮助。如果您想了解有关此信息的更多信息,请记住要收集对该网站的关注。