一、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的主要緣由吧。
一、在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
# 一、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 # 修改完後,還須要讓這個環境變量在配置信息中生效,執行命令
二、初始化一個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/
三、安裝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進程已經運行
[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" #錯誤日誌文件
[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
[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/