概念解析
HTTP, Nginx, WSGI, uWSGI, Django之间的关系
在学习Django部署之前,先了解一个web应用的运行过程是怎么样的,这有利于理解整个部署过程。
首先是浏览器客户端发出请求,请求一个html页面,客户端采用HTTP协议将请求发送到服务器端,服务器端解析HTTP协议,从中得到客户的请求内容,并把请求内容同样采用HTTP协议发送给客户端。这就是打开某个网页的全过程。
接下来把服务器的内容细化,明确服务器的工作本质就是接受HTTP请求、解析HTTP请求、处理HTTP请求,发送HTTP响应包发送回客户端。通俗点讲就是:
客户端:将要求封装成一封书信给服务器端,里面写着我要李白的一首诗
服务器:拿到书信拆解之后,根据要求写下李白的某首诗,再次封装成书信,送回去
客户端:拿到回信,把李白的诗挂着展示出来
封装书信相当于把要求封装成HTTP包,要李白的诗相当于申请某页html,拆解书信就是解析HTTP,写下李白的诗就是生成要求html文档,封装书信就是封装成HTTP包,展示李白的诗就是把html文档内容展示到浏览器上。
现在我们理解这个流程了,假设你正在制作web应用,相当于制作一个服务器端,即你要接受HTTP请求、解析HTTP请求、处理HTTP请求,发送HTTP响应。这些实质上是网络传输协议的内容,但是你只是要做一个管理系统玩一下而已,如果按照上面的流程一步一步去实现,那你第一步就得先去了解学习实现HTTP协议,我都还没开始写诗呢(制作html文档),就得花大部分时间去处理HTTP,而且实现出来的HTTP协议大概率还没别人做得好,你说这是何苦呢?这无疑增加了学习的成本,很明显这个时候你就会想:“如果我仅仅负责生成html文档就好。”
没错,就是这样,WSGI就是为了让你去专心生成html,至于HTTP封装、拆箱什么的就不用你管了,我就负责好好写诗,写完之后怎么把诗包装成信,这就不用我们管了,这就简化了我们开发web应用的流程。总的来说,WSGI就是把HTTP翻译成web应用框架能理解的语言,让web应用框架知道客户端正在请求哪个页面,然后web应用框架就提交这个页面给WSGI,让它再翻译成HTTP送给客户端。
现在先跳过nginx,这个不是必须的,没有nginx,uWSGI也可以和客户端进行交互。
WSGI概念:全称 Web Server Gateway Interface(Web服务器网关接口),是一个标准的Python应用程序编程接口(API),用于连接Web服务器和Python Web应用程序框架之间的接口。WSGI定义了一种规范的协议,使得Web服务器和Python应用程序之间可以通信和交换数据。WSGI的目的是让开发人员能够使用Python编写Web应用程序,同时与各种Web服务器和Web框架进行交互。使用WSGI可以使Web应用程序更易于开发、测试和部署,并且可以使应用程序具有更高的可移植性,因为它们可以在不同的Web服务器和框架之间进行移植。
uWSGI:是一个Web服务器和应用服务器,他本质就是实现了WSGI,http等协议,它的任务就是把HTTP协议转化成web应用所支持的网络协议,比如说http转WSGI和WSGI转http,就是上面例子中的拆信和装信的步骤。
Django框架:一个基于Python的开源的Web应用开发框架,框架的作用在于处理和回复请求,其他的内容不是它要care的,只写诗,剩下的一概不管。
好了,介绍完流程之后,这个时候可能就有人有疑问了:“你不是说Django只写诗其他的一概不管的吗?那我在本地开发的时候,运行python manage.py runserver
,就可以实现网站的运行,也没用到uWSGI啊?那岂不是http处理部分也是Django负责的。”对于这个问题呢,http处理部分也是Django负责的,这个是没错的,但是负责WSGI部分是Python内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。所谓“参考实现”是指该实现完全符合WSGI标准,但是不考虑任何运行效率,仅供开发和测试使用。你如果拿他来部署,你的网站恐怕是要经常出事的,所以还是交给uWSGI或者其他web服务器比较好。
现在回过头去说说Nginx的作用,这个时候先说说正向代理和反向代理
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
简单来说,正向代理就是我知服务器,服务器不知我;反向代理就是,我知要访问的服务器,但是访问是不是处理我要的信息的服务器,我就不知道了,简单来说我就是不知道哪台机子回答了我的问题。Nginx就是实现方向代理的服务器接口。
Nginx是一个高性能的Web服务器和反向代理服务器,Nginx的特点是占用资源少、并发能力强、稳定性高,并且可以处理大量的并发连接和请求。Nginx最初是为解决C10K问题而开发的,即如何处理数万个并发连接。它采用了异步、事件驱动的处理方式,能够高效地处理大量的并发连接,使得Web应用程序可以更快地响应用户请求。Nginx还支持反向代理、负载均衡、静态文件服务、SSL/TLS加密等功能,可以作为一个高效的Web服务器、反向代理服务器或应用程序服务器来使用。同时,Nginx还提供了强大的配置选项和插件机制,可以根据需求进行灵活的定制和扩展。
好了,现在理顺完所有的概念和过程了,现在我们就可以开始部署Django服务器了。
部署Django到服务器
1、环境安装
python我用的是系统自带的python3.9,路径为/usr/bin/python32、安装nginx
终端输入:
sudo apt-get update
sudo apt-get install nginx
nginx安装完成后,在本地浏览器输入你的云服务器公网IP地址,就会出现nginx的欢迎界面,代表安装成功。如果显示失败,先查看云服务器80端口的防火墙有没有打开,或者云服务器的网络安全组规则添加80端口。具体可以参考这个文章:
3、安装uWSGI
sudo pip3 install uwsgi
看到最后出现successful就可以了。
4、运行测试
先测试一下不使用Nginx和uWSGI,django能不能正常运行
cd /你的项目地址
python3 manage.py runserver
如果可以正常运行就说明Django程序移植到ubuntu没问题,如果出现错误,就要先去解决这些问题,包括包的安装问题,搜索不到包的问题
如果不是root用户,pip安装的时候,可能会把包安装到/home/ecs-user/.local/bin/
目录下,这样运行django项目的时候,会报django import出错。解决办法是manage.py文件,在最前面加入:
import sys
sys.path.append('/home/ecs-user/.local/lib/python3.9/site-packages')
5、部署Nginx,uWSGI
首先针对uwsgi
在Django的Project目录下(与manage.py同级)新建一个名为uwsgi.ini
和run.log
和uwsgi.pid
的文件,终端输入:
touch uwsgi.pid
touch run.log
sudo vim uwsgi.ini
然后文件里加入
[uwsgi]
chdir = /home/ecs-user/Project
module = Project.wsgi:application
socket = 127.0.0.1:8000
master = true
processes = 4
threads = 2
pidfile=uwsgi.pid
daemonize = /home/ecs-user/Project/run.log
disable-logging = true
保存。
接下来是nginx
终端输入,找到nginx的配置文件
sudo nginx -t
结果一般为
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
/etc/nginx/
就是nginx的目录,cd到这个路径,然后找到conf.d文件夹,在该文件夹下新建django项目的nginx的配置文件,后缀必须为.conf,名字无所谓。
cd /etc/nginx/conf.d
vim django.conf
然后复制粘贴:
# HTTP
server {
listen 80;
server_name 公网IP;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
}
location /static {
alias /home/ecs-user/Project/static;
}
}
修改保存之后,输入sudo nginx -t
看看修改之后的配置有没有问题,出现success就ok了。
静态文件的话,nginx会直接去找static的静态文件夹/home/ecs-user/Project/static
,这里填入你的静态文件夹路径就好,动态请求会去找uWSGI。设置完之后,别忘了把Django的settings里的Debug部分修改:
DEBUG = False
ALLOWED_HOSTS = ['*']
最后,如果你不是root用户,要先给你的静态文件添加权限,我为了防止还有其他权限问题,我直接给整个项目文件夹添加权限:
sudo chmod +R 777 project
6、设置部分大功告成
现在可以开始准备运行
首先,重启nginx和uwsgi
sudo service nginx restart
sudo killall -9 uwsgi
# 稍等几秒钟,电脑关闭端口需要时间
cd project
sudo uwsgi uwsgi.ini
然后在客户端浏览器直接输入IP地址就可以访问了,如果出错了,查看run.log日志文件一个一个排查错误。
后续
后续可以添加还有,为IP申请域名,将域名部署到web应用,通过域名来访问网站;使用https协议安全访问网页。
参考:
文章来源:https://www.toymoban.com/news/detail-549149.html
补充
如果有什么不对的地方,请各位批评指正!文章来源地址https://www.toymoban.com/news/detail-549149.html
到了这里,关于Django部署服务器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!