Linux/Deepin环境下部署Nginx+uwsgi+Django,使产品项目上线
前言
最近这段时间想着把Django在学一学,就从网上找了个几年前的项目,收获颇丰,这篇博客就是记录我在最后部署项目上线的时候踩过的一些坑。说的不明白的地方还请各位指出,免得误人子弟。(备注:在部署前,大家一定先让自己的Django能够在Linux/Deepin跑起来。)
Linux/Deepin
这边的话就长话短说了,这俩系统的话在平常上实验课的时候机房都是Linux的,但是Deepin这款系统相比较Linux来说的话特别华丽,而且功能的话不比Linux弱,所以就在虚拟机中装了Deepin,具体安装的话百度上边都有的,这边就不在一一赘述,大家可以看下页面。
Nginx和uwsgi的关系
想要安装Nginx和uwsgi之前,我想说让大家先了解这二者之间的关系,因为只有你更加了解他们之间的关系,以后的部署和操作大家看起来就不会有这么多的疑问。(这块很重要一定要看,别嫌多,对以后你开发来说很有帮助)
uwsgi
uWGSI:是一个web服务器,或者wsgi server服务器,他的任务就是接受用户请求,由于用户请求是通过网络发过来的,其中用户到服务器端之间用的是http协议,所以我们uWSGI要想接受并且正确解出相关信息,我们就需要uWSGI实现http协议,没错,uWSGI里面就实现了http协议。所以现在我们uWSGI能准确接受到用户请求,并且读出信息。现在我们的uWSGI服务器需要把信息发给Django,我们就需要用到WSGI协议,刚好uWSGI实现了WSGI协议,所以。uWSGI把接收到的信息作一次简单封装传递给Django,Django接收到信息后,再经过一层层的中间件,于是,对信息作进一步处理,最后匹配url,传递给相应的视图函数,视图函数做逻辑处理…后面的就不叙述了,然后将处理后的数据通过中间件一层层返回,到达Djagno最外层,然后,通过WSGI协议将返回数据返回给uWSGI服务器,uWSGI服务器通过http协议将数据传递给用户。这就是整个流程。
这个过程中我们似乎没有用到uwsgi协议,但是他也是uWSGI实现的一种协议,鲁迅说过,存在即合理,所以说,他肯定在某个地方用到了。我们过一会再来讨论
我们可以用这条命令:python manage.py runserver,启动Django自带的服务器,具体叫什么名字,我真不知道(知道的可以留言)。DJango自带的服务器(runserver 起来的 HTTPServer 就是 Python 自带的 simple_server)。是默认是单进程单多线程的,对于同一个http请求,总是先执行一个,其他等待,一个一个串行执行。无法并行。而且django自带的web服务器性能也不好,只能在开发过程中使用。于是我们就用uWSGI代替了。但是uWSGI也不够好,为什么看下图。
为什么有了uWSGI为什么还需要nginx?
因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。这时候nginx和uWSGI之间的沟通就要用到uwsgi协议。
嫌弃上边文字多的一定要看图!!一定要看图!!一定要看图!!
Nginx安装
在终端下输入sudo apt-get install nginx
,我这里已经安装过了,大家安装的时候页面会稍许不同。
紧接着输入ps aux|grep nginx
查看nginx是否运行。
这时候我们就可以访问nginx了,大家可以在命令行下输入ifconfig查看自己的本机ip地址。然后复制到浏览器进行访问。
哒哒哒,这就出来了!
uwsgi安装
这个安装还是很好说的直接pip3 install uwsgi
,等待安装成功。安装成功以后这时候我们就可以测试uwsgi了。测试的时候大家根据情况输入uwsgi --http :8000 --module 你自己的项目名称.wsgi
,这里呢我提醒下大家,大家运行这句话的时候是在自己的项目文件夹下运行的,比如说我的文件项目名叫做MX_Django,就cd到这个文件夹下运行uwsgi --http:8000 --module MX_Django.uwsgi
就可以了。
正式部署
大家可以看到,虽然项目跑起来了,但是静态文件却没有加载进去,这就是因为前边我给大家说的nginx和uwsgi之间的关系(ps:如果没懂的再去前边看看),所以这时候就nginx就派上了用场了,这里我们就开始配置我们的nginx,让它能够找到我们自己的静态文件。
- 首先我们新建一个uc_nginx.conf配置文件,这里我是直接将该配置文件新建到我的项目下,然后将下边这段代码复制进去,具体的目录大家根据自己的项目进行配置。
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8000; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
server_name 你的ip地址 ; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias 你的目录/项目名称/media; # 指向django的media目录
}
location /static {
alias 你的目录/项目名称/static; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
- 然后我们将该配置文件加入到nginx的启动配置文件中
sudo ln -s 你的目录/项目名称/uc_nginx.conf /etc/nginx/conf.d/
或者可以直接将你的配置文件复制过去
sudo cp uc_nginx.conf /etc/nginx.conf
这两种方法都行,大家选其一就可以,具体的区别大家可以百度一下,我这稍微一提,ln就是相当于软链接,用这个方法配置的,大家在对源文件的内容修改以后,目标文件也会随之修改,cp的话就只是单纯的复制过去。
- 紧接着配置完成以后重新启动nginx服务器
sudo service nginx restart
- 接下来我们就需要配置Django的settings文件了,我们在settings文件的最下边加入
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
,同时将STATICFILES_DIRS这个注释掉,因为这句话使我们在开发的时候使用的,真正部署项目的时候就用不到了。 - 在总的urls.py文件中配置如下两句话
from MX_Django.settings import STATIC_ROOT
urlpatterns = [
url(r'^static/(?P<path>.*)$', serve, {"document_root": STATIC_ROOT}),
]
- 然后运行
python manage.py collectstatic
,将所有的静态文件配置到static文件夹下。
- 新建一个uwsgi的配置文件叫做uwsgi.ini。
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /目录/项目名称
# Django's wsgi file
module = 项目名称.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8000
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# virtualenv = 虚拟环境目录
# 注:
# chdir: 表示需要操作的目录,也就是项目的目录
# module: wsgi文件的路径
# processes: 进程数
# virtualenv:虚拟环境的目录
- 运行该配置文件
uwsgi -i uwsgi.ini &
- 最后在浏览器输入自己的ip地址,当当当!!!大功告成
写在最后
其实django部署上线坑很多,还有好多我没有列出来,如果你们有不明白或者疑惑的地方在下方评论留言,我看到会及时回复的,最后祝大家项目部署成功!!!