赞
踩
HTTP, Nginx, WSGI, uWSGI, Django之间的关系
在学习Django部署之前,先了解一个web应用的运行过程是怎么样的,这有利于理解整个部署过程。
接下来把服务器的内容细化,明确服务器的工作本质就是接受HTTP请求、解析HTTP请求、处理HTTP请求,发送HTTP响应包发送回客户端。通俗点讲就是:
客户端:将要求封装成一封书信给服务器端,里面写着我要李白的一首诗
服务器:拿到书信拆解之后,根据要求写下李白的某首诗,再次封装成书信,送回去
客户端:拿到回信,把李白的诗挂着展示出来
封装书信相当于把要求封装成HTTP包,要李白的诗相当于申请某页html,拆解书信就是解析HTTP,写下李白的诗就是生成要求html文档,封装书信就是封装成HTTP包,展示李白的诗就是把html文档内容展示到浏览器上。
现在先跳过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服务器了。
python我用的是系统自带的python3.9,路径为/usr/bin/python3
终端输入:
sudo apt-get update
sudo apt-get install nginx
nginx安装完成后,在本地浏览器输入你的云服务器公网IP地址,就会出现nginx的欢迎界面,代表安装成功。如果显示失败,先查看云服务器80端口的防火墙有没有打开,或者云服务器的网络安全组规则添加80端口。具体可以参考这个文章:
sudo pip3 install uwsgi
看到最后出现successful就可以了。
先测试一下不使用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')
在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的配置文件
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
现在可以开始准备运行
首先,重启nginx和uwsgi
sudo service nginx restart
sudo killall -9 uwsgi
# 稍等几秒钟,电脑关闭端口需要时间
cd project
sudo uwsgi uwsgi.ini
然后在客户端浏览器直接输入IP地址就可以访问了,如果出错了,查看run.log日志文件一个一个排查错误。
后续可以添加还有,为IP申请域名,将域名部署到web应用,通过域名来访问网站;使用https协议安全访问网页。
如果有什么不对的地方,请各位批评指正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。