• Python Django的生产部署方式


      本地化部署的Django有很大的局限性,无法用于生产环境,比如无法抗住多并发,无法长时间的运行,容易造成网页无响应的问题。所以如何将Django部署到真正的生产环境中,让其能够真正的像正常的网页一样工作,是接下来需要讨论的问题。

      Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。现在主流的网页也是采用nginx的方式,比如百度,淘宝,京东,新浪等互联网巨头。而跟nginx进行交互的是uWSGI,uWSGI是一个Web服务器,支持WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。所以将Django部署到Nginx+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管理
    4. 详尽的日志功能(便于分析分析app性能和瓶颈)
    5. 高度可定制(内存大小限制,服务一定次数后重启等)

    uWSGI的安装使用:

      

    # 稳定版
    pip install uwsgi
    # 最新开发板
    pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

    测试是否安装成功:

    # test.py
    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World"]

    在命令行中输入

    uwsgi --http :8000 --wsgi-file test.py

    启动测试程序,--http为通信协议,8000为端口好 test.py为待测试文件

      

    使用uWSGI启动Django,记住路径一定要在项目根目录下,module的名字也必须跟项目名字一样。

    uwsgi --http :8000 --module mysite.wsgi

    使用vim新建uwsgi.ini配置文件,内容为:

    http = :9000
    #socket端口
    socket = 127.0.0.1:8001
    # 项目根目录
    chdir = basedir# Django's wsgi file文件目录即django中wsgi.py的位置
    wsgi-file =# 最大进程数
    processes = 4
    #最大线程数
    threads = 2
     
    #监控进程
    stats = 127.0.0.1:9191
    # 清除环境变量
    vacuum          = true

    最后可以通过使用 uwsgi uwsgi.ini 指令执行uwsgi

    可以看到其实uwsgi已经能够实现网页响应的功能,但是不如Nginx稳定和主流,那么我们接下来看看Nginx的使用方法。

    Nginx的安装:

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

    在项目根目录下创建一个以nginx结尾的配置文件: vim project_name-nginx.conf ,然后输入相关内容:

    # project_name_nginx.conf
     
    # 将所有过来的请求转发到指定地址
    upstream django {
        server 127.0.0.1:8001; #创建网页访问端口
    }
     
    # 配置主机
    server {
        # 监听端口
        listen      8000;
        # the domain name it will serve for
        server_name .example.com; 
        charset     utf-8;
     
        # 最大上传文件大小
        client_max_body_size 75M;   # 一般够用
     
        
        location /media  {
            alias /path/to/your/mysite/media;  #  Django  media 文件路径 
        }
     
        location /static {
            alias /path/to/your/mysite/static; #  Django 的static 文件路径
        }
     
        # 将所有的非media请求发送到Djangp中
        location / {
            uwsgi_pass  django;
            include     /path/to/your/mysite/uwsgi_params; # uwsgi_params 文件应在项目根目录中创建
        }
    }

    完成后使用 sudo ln -s ~/项目根目录/mysite_nginx.conf /etc/nginx/sites-enabled/ 建立一个软连接,让nginx能够识别该配置

    在djangp setting中末尾加一句程序: STATIC_ROOT = os.path.join(BASE_DIR, "static/") 然后再使用 python manage.py collectstatic 命令将所有的静态文件收集起来。复制到上述static对应的文件路径中

    最后同时启动uwsgi(uwsgi uwsgi.ini)和nginx(/etc/init.d/nginx restart)就可以使python的Django顺利运行再Nginx上了,可实现高并发的请求功能,稳定性比Django高很多。

  • 相关阅读:
    jmeter之Dummy Sampler
    【转载】Jmeter之Bean shell使用(二)
    jmeter的关联-正则表达式的应用
    启动Jmeter录制代理进行录制,报 jmeter.protocol.http.proxy.ProxyControl
    Jmeter的三个线程组
    python3进行3des的加密解密
    python连接kafka-2.0
    python读取kafka,输出到Vertica数据库
    pip下载保存Python包,pip离线安装
    阿里云kafka使用记录(python版本)
  • 原文地址:https://www.cnblogs.com/BigJ/p/7638501.html
Copyright © 2020-2023  润新知