nginx、uWSGI、django之间的具体联系

2023-10-31

前言

看了网上很多的nginx、uWSGI、django服务器框架搭建配置过程,但是绝大多数都只是说说搭建过程,并没有说过之间具体的联系。

三者之间的区别与联系

uwsgi、wsgi和nginx的区别和关系
参考博文写的特别棒,浅显易懂。在这说说我自己的理解就是,通过网页端实现对浏览器的访问,需要两部分,web服务器与web框架
1.django是一个web框架,关于html文件的编辑,文件路由的设置,数据库的管理主要在django框架下实现的。
2.uWSGI是web服务器,uWSGI服务器实现了WSGI协议,并通过该协议与django"通信"。其实在创建django项目的时候,在 ‘项目名’/‘项目名’/ 下有一个wsgi.py文件,本人猜测,该文件是实现WSGI协议的一个python文件,因为在单独启动django项目,没有启动uWSGI的时候,我们仍然是可以通过浏览器访问到django框架下的html页面的。为什么要使用uWSGI服务器呢? 就是因为,django框架自己实现WSGI协议的性能太差了,使用uWSGI服务器来提高性能。
(个人直观感觉,性能主要体现在访问一个网页的请求时间与失败率)
3.nginx是一个代理服务器,举个例子就是,比如三十个请求同时访问一个网站,三十个请求同时响应到了nginx服务器这里,nginx服务器就这三十个请求分配给后台的三台服务器,每一台处理十个请求,后台的三台服务器就是前边提到的uWSGI+django 架构。(非专业的、浅显的理解)

nginx、uWSGI、django启动过程的联系

从django开始说起,

#创建django项目
django-admin.py startproject HelloWorld
#进入项目目录
cd HelloWorld
#修改 setting.py,允许其他主机访问
ALLOWED_HOSTS = [‘*’]
#启动 django 项目
python3 manage.py runserver 0.0.0.0:8000

这样就可以打开浏览器,输入127.0.0.1:8000 访问django起始页面,0.0.0.0:8000代表本机的8000端口,在浏览器中127.0.0.1即是代表了本机。

配置uWSGI服务器,启动该服务器其实很简单,只要创建并配置好uwsgi.ini文件,执行启动命令即可。

#django项目简要路径
HelloWorld
| – manager.py
| – HelloWorld
| – | – settings.py
| – | – urls.py
| – | – wsgi.py
| – script (创建)
| – | – uwsgi.ini (创建)
| – | – uwsgi.log (创建)
| – | – nginx_access.log (创建)
| – | – nginx_error.log (创建)

下面是我参考别人文章的uwsgi.ini文件的配置,在这里主要有两个地方,一个是uWSGI服务器与django框架的联系,另一个是对uWSGI服务器的访问端口。

uwsig使用配置文件启动

[uwsgi]

#项目目录

chdir=/home/st/Django/HelloWorld/

#指定项目的application

module=HelloWorld.HelloWorld.wsgi:application

#指定sock的文件路径,这个文件与django建立联系,该文件在django项目中原本不存在,启动uWSGI之后,会自动生成

socket=/home/st/Django/HelloWorld/HelloWorld.sock
#进程个数
workers=5
pidfile=/home/st/Django/HelloWorld/script/uwsgi.pid

#指定IP端口

#http=0.0.0.0:8010

#指定静态文件
static-map=/static=/home/st/Django/HelloWorld/static
#启动uwsgi的用户名和用户组
uid=root
gid=root
#启用主进程
master=true
#自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
#序列化接受的内容,如果可能的话
thunder-lock=true
#启用线程
enable-threads=true
#设置自中断时间
harakiri=30
#设置缓冲
post-buffering=8192
#设置日志目录
daemonize=/home/st/Django/HelloWorld/script/uwsgi.log

#connect to django !!!

wsgi-file=/home/st/Django/HelloWorld/HelloWorld/wsgi.py

加粗部分说明了配置的要点,一是指定目录地址,一是指定uWSGI的访问端口,另一个是uWSGI与django之间的联系。之后启动 uWSGI服务器,在—目录中执行,

uwsgi --ini uwsgi.ini

在这对于uWSGI服务器的访问端口设置成了127.0.0.1:8010,即是在浏览器中输入127.0.0.1:8010就可以访问到,django的起始页面。

配置nginx代理服务器,该服务器的启动也很简单,配置好nginx.conf启动文件,执行命令即可

  server {
 		# **访问nginx的端口**
 		isten 8888;
  		server_name localhost;
  		# charset     utf-8;
  		access_log      /home/st/Django/HelloWorld/script/nginx_access.log;
  		error_log       /home/st/Django/HelloWorld/script/nginx_error.log;
  		client_max_body_size 75M;
  		location / {
  		# 导入一个Nginx模块他是用来和uWSGI进行通讯的
  		include     /usr/local/nginx/uwsgi_params;
   		# uwsgi_pass  127.0.0.1:8010;                     
  		# **从nginx到uwsgi的连接文件**
  		uwsgi_pass unix:/home/st/Django/HelloWorld/HelloWorld.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给ta
  		}
  		# 指定静态文件路径
  		location /static {
   		alias /home/st/Django/HelloWorld/static;
  		}
  }

说明:nginx启动后会一直监听着8888端口,当有请求发起时,它将转到HelloWorld.sock文件中所设置的地址去,也即是uWSGI中的8010端口,再进入django框架中的html页面。直接设置 uwsgi_pass 127.0.0.1:8010; 应该也是可行的,不过我自己一直没有成功,尚不知问题在哪,没多余时间去尝试了。

#通过默认的nginx.conf启动
sudo nginx
#自定义的.conf文件启动
sudo nginx -c xxx/xxx/***.conf

在nginx.ini文件中,有两个要点,一是设置针对nginx的一个访问端口,另一个是设置nginx访问端口代理的端口,也就是从哪个端口进入nginx,之后去向哪个端口。在很多的文章教程中都说了很多的在nginx.conf中添加server模块,但是并没有详细说明要点。

要点说明1,启动uWSGI服务器之后

对于django起始页面的访问有两种方式,127.0.0.1:8000与127.0.0.1:8010,8000端口是通过django进行访问的,8010端口是通过uWSGI服务器进行访问的。想要通过8000端口进行访问,需要启动django(python3 manage.py runserver 0.0.0.0:8000);想要通过8010端口进行访问,需要启动uWSGI(uwsgi --ini uwsgi.ini),此时不管djangou是否启动,8010端口都可以正常访问。

要点说明2,启动nginx服务器之后

对于django起始页面的访问有三种方式,127.0.0.1:8000、127.0.0.1:8010、127.0.0.1:8888 ,8000是通过django进行访问的,前提是django服务没有关闭。8010是通过uWSGI进行访问的。8888是通过nginx进行访问的。
对服务器进行访问,需要实现WSGI协议。通过8888端口访问,启动nginx,之前还需要启动uWSGI,django不需要启动,因为WSGI协议由uWSGI实现了。

相关命令

django

#创建
django-admin.py startproject HelloWorld
#启动
python3 manager.py runserver 0.0.0.0:8000

uwsgi

#启动
uwsgi --ini uwsgi.ini
#停止
uwsgi --stop uwsgi.pid

nginx

#启动
sudo nginx
#停止
sudo nginx -s stop

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx、uWSGI、django之间的具体联系 的相关文章

  • Django - 在基于类的视图中从另一个类方法调用一个类方法

    我在基于 django 类的视图中有一个方法 例如称为get player stats 我想从这个方法中调用同一个类中的另一个方法 但我无法这样做 代码如下 class ScoreView TemplateView def get play
  • Django DateField 表单在 clean_data 中生成 None

    从 django 中的 DateField 表单中选择日期并点击提交按钮后 is valid 成功 但 clean data 显示 None 有谁知道是什么问题 谢谢 forms py class DateForm forms Form d
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • 重定向到 /admin/login/ 结果为 302

    当用户未经身份验证时 我尝试重定向到登录页面 在我的settings py我的课程有 MIDDLEWARE CLASSES path to AuthRequiredMiddleware 这是我的课程 class AuthRequiredMi
  • Django while 循环

    我想知道是否有任何方法可以在 django 中执行 while 循环 我认为这就是我所追求的 我想做的是一个嵌套的 ul li 列表 该列表是由 for 循环中的 for 循环生成的 但由于第二个 for 循环中的某些元素有更多的子节点 我
  • Django send_mail SMTPSenderRefused 530 与 gmail

    一段时间以来 我一直在尝试使用 Django 从我正在开发的网站接收电子邮件 现在 我还没有部署它 并且我正在使用Django开发服务器 我不知道这是否会影响它 这是我的 settings py 配置 EMAIL BACKEND djang
  • 当数据库不是 Django 模型时,是否可以使用数据库中的表?

    是否可以从应用程序数据库中的表获取查询集 该表不是应用程序中的模型 如果我有一个不是名为 cartable 的模型的表 从概念上讲 我想这样做 myqueryset cartable objects all 有没有相对简单的方法来做到这一点
  • 如何将我的 html 表单发布到 django 模型并保存?

    我有 html 表单 我想发送并保存到 django 模型 当我尝试发送消息时出现错误 ValueError at account userinfo akylson
  • 如果django项目位于子文件夹和子域中,如何编写.htaccess?

    我的 django 站点的路径是 staging ninjawebsite com clients project 我希望将其视为基本网址 django 项目位于public html clients project子文件夹 一切似乎都工作
  • 在视图之间共享并在 AppConfig 中初始化的变量

    我想要一个在应用程序启动时初始化的变量 并且可以从视图访问该变量 my app my config py class WebConfig AppConfig name verbose name def ready self print lo
  • 如何在浏览器中打开生成的PDF文件?

    我编写了一个 Pdf 合并器 它将原始文件与水印合并 我现在想做的是通过 Django 视图在浏览器中打开 document output pdf 文件 我已经检查了Django的相关文章 但是由于我的方法相对不同 我不直接创建PDF对象
  • 如何覆盖 Django 中的默认用户模型字段?

    问题是默认的用户模型没有为字段提供一些非常有用的选项 例如唯一 真实到电子邮件字段 我读过这个问题 覆盖默认的用户模型方法 https stackoverflow com questions 1817244 django override
  • Django中的自动递增值

    我在 django 中有一个表并尝试自动递增它的序列号 在自定义模板中 for 循环用于变量 自定义模板 for i in getodeskview tr td 1 td td i odesk id td td i hours td td
  • Django 多个外键,相同的相关名称

    我想创建一个模型 1 其中具有相同其他模型 2 的多个外键 我希望这些外键具有相同的related name因为每个外键将指向 model 2 的不同实例 因为我需要所有外键的一个反向关系 也许一个例子会更明确 class Parent M
  • 使用代理协议的 kubernetes nginx 入口最终出现损坏的标头

    我尝试使用代理协议在 google 容器上设置 nginx 入口 nodeport 以便可以将真实 IP 转发到后端服务 但最终导致标头损坏 2017 02 05 13 48 52 error 18 18 2 broken header H
  • 使用 django-rest-framework 设置对象级权限

    尝试使用 django rest framework 最干净 最规范地管理 django guardian 对象级权限 我想将对象的读取权限 module view object 分配给在执行 POST 时发出请求的用户 我的基于阶级的观点
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 如何在 Django-admin 中呈现自定义嵌套复选框树视图?

    我有一个bugs映射到的模型categories 类别可以拥有其他类别 class Bug models Model categories models ManyToManyField Category name models CharFi
  • nginx + php-fpm = 找不到文件

    当我尝试访问时info php我得到一个File not found error 我尝试了一些教程但无济于事 配置 默认 server listen 80 listen 80 default ipv6only on server name
  • 如何使 Django ManyToMany “直通”查询更加高效?

    我使用的是 ManyToManyField 和 through 类 这会在获取事物列表时产生大量查询 我想知道是否有更有效的方法 例如 这里有一些描述书籍及其几位作者的简化类 它们通过角色类 定义 编辑器 插画家 等角色 class Per

随机推荐