Django+Nginx+uWSGI生產環境部署


生產環境中的數據流

參考文檔:

wsgi詳解:https://blog.csdn.net/li_101357/article/details/52748323

wsgi協議介紹(萌新版):https://blog.csdn.net/j163you/article/details/80919360

廖雪峰web編程講解:https://www.liaoxuefeng.com/wiki/897692888725344/923057027806560

 

WSGI是什么?

  1. WSGI是一種規范,它定義了使用python編寫的web app(django)與web server(uWSGI)之間接口格式,實現web app與web server間的解耦。

  1. WSGI 沒有官方的實現, 因為WSGI更像一個協議. 只要遵照這些協議,WSGI應用(Application)都可以在任何服務器(Server)上運行

  1. WSGI實質:WSGI是一種描述web服務器(如nginx,uWSGI等服務器)如何與web應用程序(如用Django、Flask框架寫的程序)通信的規范、協議。

為什么需要web協議:

 1)不同的框架有不同的開發方式,但是無論如何,開發出的應用程序都要和服務器程序配合,才能為用戶提供服務。

 2) 這樣,服務器程序就需要為不同的框架提供不同的支持,只有支持它的服務器才能被開發出的應用使用,顯然這是不可行的。

 3)web協議本質:就是定義了Web服務器和Web應用程序或框架之間的一種簡單而通用的接口規范。

Web協議介紹

 Web協議出現順序: CGI -> FCGI -> WSGI -> uwsgi

 1. CGI: 最早的協議

 2. FCGI: 比CGI快

  1. WSGI: Python專用的協議

  2. uwsgi: 比FCGI和WSGI都快,是uWSGI項目自有的協議,主要特征是采用二進制來存儲數據, 議都是使用字符串,所以在存儲空間和解析速度上,都優於字符串型協議.

 

uwsgi是什么?

  1. 它是一個二進制協議,可以攜帶任何類型的數據。

  2. 一個uwsgi分組的頭4個字節描述了這個分組包含的數據類型。

  3. uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信;

 

uWSGI是什么?(web服務器 和nginx類似

  1. 什么是uWSGI: uWSGI是一個全功能的HTTP服務器,實現了WSGI協議、uwsgi協議、http協議等。

  1. uWSGI**作用:**它要做的就是把HTTP協議轉化成語言支持的網絡協議,比如把HTTP協議轉化成WSGI協議,讓Python可以直接使用。

  1. uWSGI特點:輕量級,易部署,性能比nginx差很多

 注:

  如果架構是Nginx+uWSGI+APP,uWSGI是一個中間件   如果架構是uWSGI+APP,uWSGI是一個服務器

 

WSGI / uwsgi / uWSGI 這三個概念的區分。

  • WSGI是一種通信協議。通常用戶django框架和uWSGI服務器之間通信。(如果說的更細致的話就是用來和Python WSGI model)

  • uwsgi是一種線路協議而不是通信協議,在此常用於在uWSGI服務器與其他網絡服務器的數據通信。

  • 而uWSGI是實現了uwsgi和WSGI等協議的Web服務器

 

nginx是什么?

  1. Nginx是一個Web服務器,其中的HTTP服務器功能和uWSGI功能很類似

  2. 但是Nginx還可以用作更多用途,比如最常用的反向代理、負載均衡、攔截攻擊等,而且性能極高

 

django是什么?

 1. Django是一個Web框架,框架的作用在於處理request和 reponse,其他的不是框架所關心的內容。

 2. 所以如何部署Django不是Django所需要關心的。

 

請求處理整體流程     

  • nginx接收到瀏覽器發送過來的http請求,將包進行解析,分析url

  • 靜態文件請求:就直接訪問用戶給nginx配置的靜態文件目錄,直接返回用戶請求的靜態文件

  • 動態接口請求:那么nginx就將請求轉發給uWSGI,最后到達django處理

各模塊作用

 1. nginx:是對外的服務器,外部瀏覽器通過url訪問nginx,nginx主要處理靜態請求

 2. uWSGI:是對內的服務器,主要用來處理動態請求

 3. uwsgi:是一種web協議,接收到請求之后將包進行處理,處理成wsgi可以接受的格式,並發給wsgi

 4. WSGI:是python專用的web協議,根據請求調用應用程序(django)的某個文件,某個文件的某個函數

 5. django:是真正干活的,查詢數據等資源,把處理的結果再次返回給WSGI, WSGI 將返回值進行打包,打包成uwsgi能夠接收的格式

 6. uwsgi接收wsgi發送的請求,並轉發給nginx,nginx最終將返回值返回給瀏覽器

 

Django + uWSGI方案

 1. 沒有nginx而只有uwsgi的服務器,則是Internet請求直接由uwsgi處理,並反饋到web項目中。

 2. nginx可以實現安全過濾,防DDOS等保護安全的操作,並且如果配置了多台服務器,nginx可以保證服務器的負載相對均衡。

 3. 而uwWSGI則是一個web服務器,實現了WSGI協議(Web Server Gateway Interface),http協議等,它可以接收和處理請求,發出響應等。所以只用uwsgi也是可以的。

 

nginx和uWSGI特點

 1)nginx的作用

  1.反向代理,可以攔截一些web攻擊,保護后端的web服務器

  2.負載均衡,根據輪詢算法,分配請求到多節點web服務器

  3.緩存靜態資源,加快訪問速度,釋放web服務器的內存占用,專項專用

2)uWSGI的適用

  1.單節點服務器的簡易部署

  2.輕量級,好部署

 

 

Django + uWSGI+ 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
  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 # 修改完后,還需要讓這個環境變量在配置信息中生效,執行命令
centos7安裝python3

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、安裝uWSGI 並使用uWSGI啟動這個服務

'''1. 安裝uwsgi'''
[root@linux-node1 /]# pip3 install uwsgi
[root@linux-node1 /]# ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi

'''2. 配置uwsgi.ini啟動文件'''
[root@linux-node1 /]# vim uwsgi.ini
[uwsgi]
socket = 0.0.0.0:3031
chdir = /code/mmcsite
wsgi-file = /code/mmcsite/wsgi.py
processes = 5
threads = 30
master = true
daemonize = /code/mmcsite/uwsgi.log
module=mmcsite.wsgi
pidfile = /code/mmcsite/uwsgi.pid
chmod-socket=666
enable-threads = true

'''3. 使用uwsgi啟動django:一定要在這個項目目錄中'''
[root@linux-node1 /]# uwsgi --http 192.168.56.11:80 --file mmcsite/wsgi.py --static-map=/static=static
訪問項目:http://192.168.56.11
uWSGI啟動項目

4、配置uWSGI文件

[root@linux-node2 demo2]# vim /code/mmcsite/uwsgi.ini  # uwsgi.ini文件
[uwsgi]
socket = 0.0.0.0:3031                  # 指定socket監聽的地址和端口
chdir = /code/mmcsite                  # 項目路徑 
wsgi-file = /code/mmcsite/wsgi.py      # django的wsgi文件路徑
processes = 5                          # 啟動五個進程
threads = 30                           # 每個進程啟動30個線程
master = true
daemonize = /code/mmcsite/uwsgi.log    # 日志存放路徑
module=mmcsite.wsgi                    # 使用mmcsite.wsgi模塊
pidfile = /code/mmcsite/uwsgi.pid      # uwsgi啟動進程id存放路徑
chmod-socket=666                       # socket權限
enable-threads = true                  # 允許用內嵌的語言啟動線程,這將允許你在app程序中產生一個子線程
uwsgi.ini

5、安裝配置nginx

安裝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安裝

配置nginx

[root@linux-node1 /]# vim /etc/nginx/conf.d/django.conf 
server {
    listen       8888;
    server_name  192.168.56.11;
    client_max_body_size 5M;
    gzip on;
    gzip_buffers 32 4K;#壓縮在內存中緩沖32塊 每塊4K
    gzip_comp_level 6 ;#壓縮級別 推薦6
    gzip_min_length 4000;#開始壓縮的最小長度4bit
        gzip_types text/plain application/json application/javascript application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png image/x-ms-bmp;
        location / {
              include uwsgi_params;
              uwsgi_pass 127.0.0.1:3031;
              uwsgi_ignore_client_abort on;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

}
django.conf

6、啟動項目

[root@linux-node1 demo2]# systemctl restart nginx   # 開啟nginx
[root@linux-node1 demo2]# uwsgi --ini uwsgi.ini     # 啟動uwsgi的django項目
                                # http://192.168.56.11:8888/ 訪問項目
[root@linux-node1 demo2]# uwsgi --stop uwsgi.pid    # 關閉uwsgi

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM