虽然在开发时runserver 命令也可让服务器启动,但是毕竟不适合生产环境,因此,在部署项目时就要采用新的方式。
本次项目在ubuntu 16.04系统上进行部署。部署时,注意配置防火墙,放开对应端口,当然,也可直接关闭防火墙。
假设现在已经有一个名为webnote的项目。部署前,请先确认静态文件已收集完成,且设置了debug=False(关于静态文件部分在我之前的文章中已经讲过,这里附上链接)
Django中静态文件之各个配置详解
Django如何正确加载静态文件
一,配置项目所需python环境
1.在本地开发环境上执行命令,导出开发时依赖的所有包
#文件名可以随便取
$ pip freeze >req_list.txt
2.通过ftp或git将项目的代码和req_list.txt同步到Ubuntu系统中
#方法有很多,这个不是本文的重点,这里不做演示
- 这里注意文件夹的权限
#进入当前项目所在目录,并给该文件夹赋予权限,为了方便,直接赋值777
$sudo chmod -R 777 ./webnote
3.在Ubuntu上创建虚拟环境,并安装所有包
#创建一个名为py3_django的虚拟环境(如果想使用的Ubuntu本机的环境,就跳过前两个步骤)
#(关于如何安装虚拟环境不是本文重点,不进行演示)
$ mkvirtualenv py3_django
#进入虚拟环境
$ workon py3_django
#在虚拟环境中安装所有依赖包
$ pip install -r req_list.txt
-
注意
:如果你在开发时就直接连接的linux的数据库,则此次部署时,无需数据库同步。否则要先在linux系统上创建一个同名数据库,然后把项目中每个app对应下的migrations
文件夹下的数据迁移部分给删除,然后分别执行python manage.py makemigrations
和python manage.py migrate
。当然,你也可以直接导出开发时的数据库文件,然后再把数据导入到linux系统的数据库中。
二,nginx
- nginx作为前端web服务器,处理静态资源,然后将非静态资源请求转发给uwsgi处理,编辑nginx的配置文件,在server中增加以下内容:
server {
listen 80;
server_name localhost;
location / {
#将所有的参数转到uwsgi下
include uwsgi_params;
#uwsgi的ip与端口,要与uwsgi.ini里的配置一致
uwsgi_pass 127.0.0.1:8000;
}
location /static {
#设置静态资源的存放位置,写绝对路径,注意文件夹权限
alias /root/vscoder/webnote/static/;
}
}
- nginx可进行手动安装或自动安装(
sudo apt-get install nginx
),如果不知道nginx的配置文件在哪,可通过whereis nginx
命令查看nginx的位置
$ whereis nginx
$ nginx: /usr/local/nginx
三,uwsgi
当创建Django项目时,你会发现有一个wsgi的配置,作为python web的服务器,项目默认会生成一个wsgi.py文件,而uwsgi实现了wsgi的接口,项目中使用uwsgi作为后端web服务器,用来处理非静态资源的请求
1.安装uwsgi
- 这里注意:uwsgi要安装在系统级环境中,并非虚拟环境,我们之后会通过配置文件来指定项目的虚拟环境,最后启动项目的时候也无需进入虚拟环境。
$ pip install uwsgi
2.配置uwsgi
- 在当前项目文件夹下创建一个uwsgi.ini的配置文件,并进行如下配置
#使用nginx连接时使用,填入项目的ip和端口
socket=127.0.0.1:8000
#如果想直接使用uwsgi做web服务器使用而不使用nginx的话,就这样配置:
#http=127.0.0.1:8000
#你的项目所在路径,注意要填绝对路径(可通过pwd命令查看路径)
chdir=/home/xe/Desktop/webnote
#项目中wsgi.py文件的目录,相对于当前项目目录
wsgi-file=webnote/wsgi.py
#工作进程数
processes=4
#进程中的线程数
threads=2
#是否是主进程
master=True
#uwsgi主进程pid
pidfile=uwsgi.pid
#设置uwsgi后台运行,并记录日志
daemonize=uwsgi.log
#设置虚拟环境的路径,我的虚拟环境存放在这里,名为py3_django
virtualenv=/home/xe/.virtualenvs/py3_django
- 如果不知道虚拟环境的存放位置,可先进入虚拟环境,然后执行cdvirtualenv命令
$ workon py3_django
$ cdvirtualenv
#这里就是我的虚拟环境的存放位置
$~/.virtualenvs/py3_django
3.启动uwsgi
配置到这里,我们就可以先启动uwsgi,看看配置是否正确
- 进入uwsgi.ini所在的文件目录,通过命令方式启动uwsgi
$ uwsgi --ini uwsgi.ini
-
如果没报错,在浏览器输入ip,查看是否可以正常加载
在浏览器端查看部署的项目
uwsgi启动后,会生成一个uwsgi.pid文件,里面是它的进程pid除了启动以外,uwsgi还有一些其他命令
#uwsgi停止,uwsgi.pid就是刚刚生成的pid文件
$ uwsgi --stop uwsgi.pid
- 如果遇到uwsgi无法正常结束的时候,还可以强行结束:
#查看uwsgi进程,获得进程pid
$ ps aux | grep uwsgi
#强行结束(这里填入你自己的进程pid,我这里是6256)
$ kill -9 6256
查看uwsgi进程
四,supervisior
- 使用supervisor的目的是让supervisor管理uwsgi,用来对进程进行守护和监控,方便对进程的守护,监听,停止,重启
1.安装supervisor
- supervisor也要安装在系统级环境中,而非虚拟环境
$ pip install supervisor
2. 配置supervisor
- 在当前项目下创建一个名为supervisor.conf的配置文件,配置如下:
# supervisor的程序名字
[program:webnote]
# supervisor执行的命令,注意这里的配置文件名称要与之前创建的一致
command=uwsgi --ini uwsgi.ini
# 项目的目录
directory = /home/xe/Desktop/webnote
# 开始的时等待多少秒
startsecs=0
# 停止的时等待多少秒
stopwaitsecs=0
# 自动开始
autostart=true
# 程序中断后自动重启
autorestart=true
# 配置日志文件
stdout_logfile=/home/xe/Desktop/webnote/supervisord.log
stderr_logfile=/home/xe/Desktop/webnote/supervisord.err
# 设置日志的级别
[supervisord]
loglevel=info
# 配置supervisor服务器
[inet_http_server]
port = :9001
# 用户名和密码
username = admin
password = 123
# 配置supervisorctl,使用supervisorctl的ip和端口
[supervisorctl]
serverurl = http://127.0.0.1:9001
# 配置supervisorctl的用户名和密码
username = admin
password = 123
[rpcinterface:supervisor]supervisor.rpcinterface_factory =supervisor.rpcinterface:make_main_rpcinterface
3,启动supervisor
注意: 要启动supervisor的话,要先停掉uwsgi(
uwsgi --stop uwsgi.pid
)
#启动supervisor
$supervisord -c supervisor.conf
启动成功后,我们就可以通过浏览器,管理服务,如下图所示:
image.png
- 如果想在控制台管理,可使用
supervisorctl -c supervisor.conf
#启动supervisor
$supervisorctl -c supervisor.conf
在控制台中管理supervisor
- 常见的命令有(以下所有命令均在supervisor控制台中输入,非命令行):
# 查看状态
status
# 启动
start 这里填你的项目名
# 重启
restart 这里填你的项目名
# 关闭项目
stop 这里填你的项目名
# 关闭所有
stop all
# 重新加载配置文件
reload
# 停止 supervisord
shutdown
# 退出
quit