Linfinity

Never say never.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Django + Uwsgi + Nginx 实现生产环境部署

Posted on 2018-11-24 13:29  Linfinity  阅读(102)  评论(0)    收藏  举报

一、为什么要在生产上部署Django?

由于django自带web server性能不够好,所以在生产上通常用uwsgi server来代替django自带web server。

 

二、uwsgi+Django部署

 

uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  1. WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
  2. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  3. 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
  4. uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uWSGI的主要特点如下

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
  4. 详尽的日志功能(可以用来分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

uwsgi的使用

1.安装uwsgi

pip install uwsgi

2.用uwsgi 启动django

uwsgi --http 127.0.0.1:8000 --file proj/wsgi.py --static-map=/static=static

3.通过配置文件启动uwsgi

可在proj同级目录创建script目录:  (一般不建议将配置文件放在django项目里)

创建    /script/uwsgi.ini   

  1 [uwsgi]
  2 #项目目录
  3 chdir=/home/python/Desktop/test_bushu/myDjango/
  4 #启动uwsgi的用户名和用户组
  5 uid=root
  6 gid=root
  7 #指定项目的application
  8 module=myDjango.wsgi:application
  9 #指定sock的文件路径
 10 socket=/home/python/Desktop/test_bushu/script/uwsgi.sock
 11 #启用主进程
 12 master=true
 13 #进程个数
 14 workers=5
 15 #记录进程使用了那些内存
 16 pidfile=/home/python/Desktop/test_bushu/script/uwsgi.pid
 17 #自动移除unix socket和pid文件当服务停止时^[OA
 18 vacuum=true
 19 #序列化接收的内容,如果可以的话
 20 thunder-lock=true
 21 #启用线程
 22 enable-threads=true
 23 #设置中断时间
 24 harakiri=30
 25 #设置缓冲
 26 post-buffering=4096
 27 #设置日志目录
 28 daemonize=/home/python/Desktop/test_bushu/script/uwsgi.log
 29 #指定ip端口
 30 http=192.168.190.148:8880
 31 #指定静态文件
 32 static-map=/static=/home/python/Desktop/test_bushu/myDjango/static
uwsgi.ini

 

启动

uwsgi --ini uwsgi.ini

 停止

uwsgi --stop uwsgi.pid

 重载配置

uwsgi --reload uwsgi.ini

  

 

三、uwsgi+nginx+django部署

 

由于uwsgi处理静态请求的能力较差,所以通常使用nginx server处理静态请求,uwsgi处理动态请求,实现动静分离。

静态请求:css,js,图片...

动态请求:提交表单,访问mysql,动态渲染html页面...

 

1.nginx安装使用

sudo apt-get install nginx
sudo /etc/init.d/nginx start    # start nginx

2.为你的项目生成Nginx配置文件

在路径/etc/nginx/conf.d/ 下创建你的项目配置文件  projectname.conf
server {
    #要监听的端口
    listen      8000;
   #要访问的路径的前面的url名称,可写域名
    server_name 127.0.0.1;
    #nginx编码方式
    charset     utf-8;
    #nginx日志配置
    access_log /var/log/nginx/access.log main;
    #启用压缩,压缩页面大小提高传输速度
    gzip on;
    #gzip支持压缩的类型
    gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/png application/octet-stream;   
    #错误页面
    error_page 404    /404.html;
    error_page 500 502 503 504   /50x.html;

    #指定项目路径uwsgi
       location / {
        #指定uwsgi的sock文件,将所有的动态请求交给他
        uwsgi_pass  unix:/home/python/Desktop/script/uwsgi.sock;
        #导入一个nginx模块,它是用来和uwsgi进行通讯的
        include     /path/to/your/mysite/uwsgi_params;   
        #设置连接uwsgi超时时间
        uwsgi_connect_timeout 30;
       
    }

    #指定静态文件路径
    location /static/ {
        alias /path/to/your/mysite/static;
    }
 
 
}        

!!!注意:nginx配置是重启生效的,如果你修改了不知是否正确,可以这样测试

 

/etc/init.d/nginx configtest

 

如果是生产环境下nginx正在运行,就不要直接stop start或restart,直接reload对线上影响最低。