11: Django + gunicorn + Nginx 的生產環境部署

1.1 gunicorn介紹

   一、Gunicornhtml

      1. Gunicorn是使用Python實現的WSGI服務器, 直接提供了http服務, 而且在woker上提供了多種選擇, gevent, eventlet這些都支持node

      2. 在多worker最大化裏用CPU的同時, 還可使用協程來提供併發支撐, 對於網絡IO密集的服務比較有利.python

      說明:linux

        1)同時Gunicorn也很容易就改形成一個TCP的服務, 好比doge重寫worker類。
        2)在針對長鏈接的服務時, 最好開啓reuse_port, 避免worker進程負載不均。nginx

   二、uWSGI 與 Gunicornsql

      1. 不一樣於Gunicorn, uWSGI是使用C寫的, 它的socket fd建立, worker進程的啓動都是使用C語言系統接口來實現的django

      2. 在worker進程處理循環中, 解析了http請求後, 使用python的C接口生成environ對象vim

      3. 再把這個對象做爲參數塞到暴露出來的WSGI application函數中調用.centos

      4. 而這一切都是在C程序中進行, 只是在處理請求的時候交給python虛擬機調用application.服務器

      5. 徹底使用C語言實現的好處是性能會好一些.

  三、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 的生產環境部署

  一、在centos 7中安裝python3環境

# 一、yum更新yum源
yum update # 二、安裝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.7.0版本
wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
一、安裝依賴&下載python3.7
# 一、yum更新yum源
yum update # 二、安裝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.7.0版本
wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz   2、安裝Python # 一、解壓
tar -xvf Python-3.7.0.tgz #二、配置編譯
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 #三、將/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 # 修改完後,還須要讓這個環境變量在配置信息中生效,執行命令
二、安裝Python

  二、初始化一個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項目

  三、安裝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/

  四、安裝配置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/
相關文章
相關標籤/搜索