关于nginx和uWSGI和Django之间的关系
-
为什么要用nginx?
因为我们要使用https协议访问。(y总说django不支持,但是我查了一下,django也可以支持https,但是需要安装另外的库。确实不如nginx方便,而且nginx还能提供其他的功能。) -
uWSGI是什么?
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
WSGI协议是Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。
所以简单来说uWSGI就是用来沟通nginx和django的一座桥梁。 -
为什么要nginx+uwsgi+diango这样来部署?
首先他们的工作流程是这样的:nginx 是对外的服务接口,外部浏览器通过url访问nginx。nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。
但是要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程。 -
那么nginx到底可以干嘛?
安全:程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。
负载均衡:一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
静态文件处理高效:用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。这就是这几者之间的关系。
作者: 菊花 来源:AcWing
部署nginx
将nginx.conf
中的内容写入服务器/etc/nginx/nginx.conf
文件中。如果django项目路径与配置文件中不同,注意修改路径。
配置https认证证书
将app.key
中的内容写入服务器/etc/nginx/cert/app.key
文件中。
将app.pem
中的内容写入服务器/etc/nginx/cert/app.pem
文件中。
将分配的域名添加到ALLOWED_HOSTS
列表中。注意只需要添加https://后面的部分。域名代替了公网IP:端口号
sudo /etc/init.d/nginx start
启动nginx
sudo nginx -s reload
重新加载
在django项目中添加uwsgi的配置文件:scripts/uwsgi.ini,scripts存放第三方服务,内容如下:
[uwsgi]
socket = 127.0.0.1:8000
chdir = /home/wal/app ;django工程的绝对路径。
wsgi-file = app/wsgi.py ;根模块中的wsgi.py
master = true
processes = 2
threads = 5
vacuum = true
uwsgi --ini ./scripts/uwsgi.ini
启动uwsgi
pkill -f uwsgi -9
关闭uwsgi
admin后台——定制
在app中的admin.py
中,自定义数据显示项
class ArticleAdmin(admin.ModelAdmin):
'''设置列表可显示的字段'''
list_display = ('title', 'author', 'status', 'mod_date',)
'''设置过滤选项'''
list_filter = ('status', 'pub_date', )
'''每页显示条目数'''
list_per_page = 5
'''设置可编辑字段'''
list_editable = ('status',)
'''按日期月份筛选'''
date_hierarchy = 'pub_date'
'''按发布日期排序'''
ordering = ('-mod_date',)
数据库其它操作
filter
和get
都可以查询数据库,区别是get
没找到会返回错误信息
filter
没找到就返回空列表,所以当一个数据可能存在,可能不存在的时候,用filter
处理,判断第0位是否为空,检查是否存在方便一点
filter
查询返回的数据类型是Query<set>
不能直接返回给前端