zoukankan      html  css  js  c++  java
  • 11: Django + gunicorn + Nginx 的生产环境部署

    1.1 gunicorn介绍

       1、Gunicorn

          1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, eventlet这些都支持

          2. 在多worker最大化里用CPU的同时, 还可以使用协程来提供并发支撑, 对于网络IO密集的服务比较有利.

          说明:

            1)同时Gunicorn也很容易就改造成一个TCP的服务, 比如doge重写worker类。
            2)在针对长连接的服务时, 最好开启reuse_port, 避免worker进程负载不均。

       2、uWSGI 与 Gunicorn

          1. 不同于Gunicorn, uWSGI是使用C写的, 它的socket fd创建, worker进程的启动都是使用C语言系统接口来实现的

          2. 在worker进程处理循环中, 解析了http请求后, 使用python的C接口生成environ对象

          3. 再把这个对象作为参数塞到暴露出来的WSGI application函数中调用.

          4. 而这一切都是在C程序中进行, 只是在处理请求的时候交给python虚拟机调用application.

          5. 完全使用C语言实现的好处是性能会好一些.

      3、uWSGI与Gunicorn性能比较

        1)说明

            压力测试工具为ab test,前置了nginx把静态文件剥离了,
            两者都是用了2process+2thread,压力为100-1000。

        2)测试结果

            参考博客:https://jinzhao.me/archives/470

            1. 总共耗时上差的微乎其微,这点差别不能说明什么;
            2. 两者都完成了所有请求,这里说一下,之所以选1000就是因为2000两种方式都会崩溃;
            3. 平均时间uwsgi胜出,这里差别不明显,但是也说明总体性能上uwsgi做的彻底;
            4. 连接时间上,两者明显在1000下都吃力了,但是uwsgi表现更好,除了c我觉得使用uwsgi自己的协议也有关系;
            5. 最后也是最重要的,在高并发下,明显uwsgi的表现更好一点,
            6. 很有意思的是在80%以下的正常流量范围内反倒gunicorn更好,而且效果显著
            7. 100ms还是比较可观的,我想这才是大家都用gunicorn的主要原因吧。

    1.2  Django + Gunicorn + Nginx 的生产环境部署

      1、在centos 7中安装python3环境

    # 1、yum更新yum源
    yum update
    # 2、安装Python 3.7所需的依赖否则安装后没有pip3包
    yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
    # 3、在官网下载所需版本,这里用的是3.7.0版本
    wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
    1、安装依赖&下载python3.7
    # 1、yum更新yum源
    yum update
    # 2、安装Python 3.7所需的依赖否则安装后没有pip3包
    yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
    # 3、在官网下载所需版本,这里用的是3.7.0版本
    wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
      2、安装Python
    
    # 1、解压
    tar -xvf Python-3.7.0.tgz
    
    #2、配置编译
    cd Python-3.7.0
    ./configure --prefix=/usr/local/python3  # 配置编译的的路径(这里--prefix是指定编译安装的文件夹)
    ./configure --enable-optimizations  # 执行该代码后,会编译安装到 /usr/local/bin/ 下,且不用添加软连接或环境变量
    make && make install
    ln -s /usr/local/python3/bin/python3 /usr/bin/python3  # 添加软连接
    ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
    
    #3、将/usr/local/python3/bin加入PATH
    [root@linux-node1 testProj]# vim /etc/profile
    #然后在文件末尾添加
    export PATH=$PATH:/usr/local/python3/bin
    
    [root@linux-node1 testProj]# source /etc/profile # 修改完后,还需要让这个环境变量在配置信息中生效,执行命令
    2、安装Python

      2、初始化一个django项目

    [root@linux-node1 /]# pip3 install django==2.0.4
    [root@linux-node1 /]# mkdir /code/
    [root@linux-node1 /]# cd /code/
    [root@linux-node1 testProj]# django-admin startproject mmcsite
    [root@linux-node1 testProj]# cd /code/mmcsite
    [root@linux-node1 testProj]# python3 manage.py runserver 0.0.0.0:8000
    # 页面中访问:http://192.168.56.11:8000/
    初始化一个django项目

      3、安装Gunicorn并使用uWSGI启动这个服务

    [root@linux-node1 mmcsite]#  pip3 install gunicorn                          # 安装Gunicorn
    [root@linux-node1 mmcsite]# gunicorn mmcsite.wsgi -b 0.0.0.0:8000 -w 3      # 命令行下测试
    -c    # 指定一个配置文件(py文件)
    -b    # 与指定的socket进行绑定
    -D    # 以守护进程形式来运行Gunicorn进程,其实就是将这个服务放到后台去运行
    -w    # 工作的进程数量
    -k    # 工作进程类型,sync(默认), eventlet, gevent, or tornado, gthread, gaiohttp.
    # 参考:http://docs.gunicorn.org/en/latest/settings.html
    [root@linux-node1 mmcsite]#  ps -ef|grep gunicorn                          # 查看Gunicorn进程已经运行
    安装Gunicorn
    [root@linux-node1 mmcsite]#  vim /code/mmcsite/gunicorn_config.py  # Gunicorn配置文档
    # gunicorn_config.py
    import logging
    import logging.handlers
    from logging.handlers import WatchedFileHandler
    import os
    import multiprocessing
    bind = '0.0.0.0:8000'           #绑定ip和端口号
    backlog = 512                   #监听队列
    chdir = '/code/mmcsite'         #gunicorn要切换到的目的工作目录
    timeout = 30                    #超时
    worker_class = 'gevent'         #使用gevent模式,还可以使用sync 模式,默认的是sync模式
    
    workers = multiprocessing.cpu_count() * 2 + 1     #进程数
    threads = 2                                       #指定每个进程开启的线程数
    loglevel = 'info'                                 #日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
    access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' 
    accesslog = "/code/mmcsite/gunicorn_access.log"      #访问日志文件
    errorlog = "/code/mmcsite/gunicorn_error.log"        #错误日志文件
    /mmc/site/gunicorn_config.py Gunicorn配置文件
    [root@linux-node1 mmcsite]#  gunicorn mmcsite.wsgi -c gunicorn_config.py -D   # 在后台使用Gunicorn运行项目
    [root@linux-node1 mmcsite]#  ps -ef|grep gunicorn                             # 查看Gunicorn进程已经运行
    http://192.168.56.11:8000/

      4、安装配置nginx

    '''1. 配置nginx YUM源'''
    [root@linux-node1 /] vim /etc/yum.repos.d/nginx.repo
    ```
    [nginx]
    name=nginx repo
    # 下面这行centos根据你自己的操作系统修改比如:OS/rehel
    # 6是你Linux系统的版本,可以通过URL查看路径是否正确
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1
    ```
    '''2. 安装nginx'''
    [root@linux-node1 /] yum -y install nginx
    安装nginx
    [root@linux-node1 mmcsite]# vim /etc/nginx/conf.d/dj_gunicorn.conf     # 配置nginx代理Gunicorn
    server {
            listen 8005; 
            root /www/demo;
            server_name 127.0.0.1;
            location / {
                proxy_set_header x-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_pass http://localhost:8000/; # gunicorn绑定的端口号
            }
            # 配置static的静态文件:
            location ~ ^/static/.*$ {
                root /www/demo;
            }
    }
    [root@linux-node1 mmcsite]#  gunicorn mmcsite.wsgi -c gunicorn_config.py -D   # 在后台使用Gunicorn运行项目
    [root@linux-node1 mmcsite]#  ps -ef|grep gunicorn                             # 查看Gunicorn进程已经运行
    http://192.168.56.11:8005/
     
  • 相关阅读:
    numpy数组各种乘法
    python测试函数的使用时间
    dataframe 列名重新排序
    《图解设计模式》读书笔记5-1 composite模式
    《图解设计模式》读书笔记4-2 STRATEGY模式
    《图解设计模式》读书笔记4-1 Bridge模式
    《图解设计模式》读书笔记3-3 Builder模式
    《图解设计模式》读书笔记3-2 Prototype模式
    《图解设计模式》读书笔记3-1 Singleton模式
    《图解设计模式》读书笔记2-2 Factory Method模式
  • 原文地址:https://www.cnblogs.com/xiaonq/p/12374206.html
Copyright © 2011-2022 走看看