部署Django(nginx+uwsgi+supervisior)

虽然在开发时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 makemigrationspython 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                 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容