为什么要写这篇文章?
最近想把写好的django项目上线,于是就去网上寻找方案。但是发现怪的很,每个人有每个人不同的做法。终于自己摸索出来部署的流程。
处理流程
在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。大概关系如下图。
为什么选择nginx+uwsgi?
nginx轻量,属于反向代理服务器,他可以监听一个端口比如80,然后配置一个反向代理端口如8000。这样通过浏览器访问80端口,实际上是请求了8000端口的数据。这样能隐藏自己的真实端口。
uwsgi是一个web服务器,其实django+uwsgi就能工作。但是如之前所言nginx处理静态文件的能力更强。所以我们使用这套组合拳nginx+uwsgi,现在我们开始部署。
STEP0 先把你的项目跑起来
笔者这里使用的是腾讯云上的学生服务器,要注意的一点就是:你得配置安全组的入站规则,不然项目运行起来怎么也访问不了。
STEP1 配置uwsgi
- 安装
以Ubuntu/Debian 为例,先安装依赖包:
apt-get install build-essential python-dev
pip install uwsgi
- 启动
以我自己的项目为例。项目结构大概是这个样子
我们现在进入wsgi.py同级目录下
uwsgi --http :9090 --wsgi-file wsgi.py
如果访问9090端口,如果项目正常运行,第一步就OK了。
- xx.ini
用命令启动uwsgi是比较麻烦,而且不方便后面的一个维护和修改。
uwsgi 有多种配置可用:
ini/yaml/xml/json
从uwsgi的官方文档来看,貌似(我个人的理解)推荐用ini方式,所以下面的配置也都是基于ini的。
ini 格式说明:
1,ini配置为 key=value 形式
2,在ini配置文件里,#号为注释,
3,布尔值为 true 和 false
4,在命令行里,uwsgi myconf.ini 等价于 uwsgi --ini myconf.ini
新建一个xx.ini文件,放在哪里都是可以的。
对里面参数的一些解释:
chdir
代表着项目的绝对路径
wsgi-file
是wsgi相对chdir的一个路径,
他的真实路径是/Users/zhoumeng/Desktop/test_two/mysite/mysite/wsgi.py
==注意==:socket
uwsgi和Nginx交互需要使用socket参数,即使用TCP协议,WSGI和uwsgi协议都在TCP协议之上。
socket参数也可以配置为网络地址,如socket=127.0.0.1:8080,但如果Nginx和uWSGI同在一个服务器上,可以使用socket文件的形式。
=启动方式:
uwsgi xx.ini 或 uwsgi --ini xx.ini
STEP2 配置nginx
- 安装
参考
菜鸟教程这里不进行赘述。
当你看到这张图,说明安装成功了。
- nginx.conf
1. 找到nginx.conf所在位置
nginx -h
找到你nginx.conf所在位置,根据不同操作系统,存放的位置不同。
2. 编辑nginx.conf
在http{
server{
}
}下修改成如下图。
uwsgi_params就在nginx.conf 同目录下。
uwsgi_pass 刚才xx.ini里socket就派上用场啦。
总结一下:现在流程就是用户访问80端口,nginx和uwsgi通过8080端口来进行交互,
当然生产环境别用8080端口,端口容易被占用。
启动
uwsgi xx.ini
注意一下nginx是否还在运行。如果还在运行
sudo nginx -s stop
sudo nginx
STEP3 最后的工作
现在我们的工作完成了一大部分,现在去访问/admin。有没有觉得页面变丑了??
通常来说,你会有两种静态资源/media/开头的链接和/static/开头的。static用来处理一些网站原始图片,视频,js,css文件那么如何关闭让Django处理/static/开头的文件呢,很简单,在setting.py中将DEBUG值改为False,这时,Django就不去处理/static/文件了。
那么/media/呢?一般来说,用户上传的图片,我们会保存起来,在网页上显示时候就用/media/,在setting.py中设置。
MEDIA_URL = '/media/' #
MEDIA_ROOT = os.path.join(BASE_DIR, '../media') #
再在url.py中添加
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
这里的意思是在DEBUG=True时,会解析/media/文件,文件存放的位置是第二个参数。
如此一来当即在部署为生产环境时,只需要把DEBUG改为False,Django就不会去处理static和media了。
收集静态文件
运行python3 manager.py collectstatic
在之前先在setting.py中设置STATIC_ROOT = os.path.join(BASE_DIR, '../collectedstatic')
这样收集的静态文件就都放进上面的目录里了。
配置nginx解析静态文件
同样,nginx.conf
首先,在文件顶部加入
user root onwer
声明让root 用户跑nginx,否则访问静态文件可能提示没有权限
其次,在上面说的配置文件location /前加入以下带内容
location /static/ {
autoindex on;
alias /Users/zhoumeng/Desktop/test_two/collectedstatic/;
}
location /media/ {
autoindex on;
alias /Users/zhoumeng/Desktop/test_two/mysite/media/;
}
大功告成,重启nginx应该就没有问题了。