日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx+uWSGI + django部署项目

發布時間:2024/7/23 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx+uWSGI + django部署项目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目部署

nginx+uWSGI + django

1. WSGI

WSGI是Web服務器網關接口。它是一個規范,描述了Web服務器(返回靜態資源的就是web服務器,Nginx)如何與Web應用程序(django、Flask)通信,以及Web應用程序如何鏈接在一起以處理一個請求,(接收請求,處理請求,響應請求)
基于wsgi運行的框架有bottle,DJango,Flask,用于解析動態HTTP請求

支持WSGI的服務器wsgirefpython自帶的web服務器,django默認調用的模塊Gunicorn用于linux的 python wsgi Http服務器,常用于各種django,flask結合部署服務器。mode_wsgi實現了Apache與wsgi應用程序的結合uWSGIC語言開發,快速,自我修復,開發人員友好的WSGI服務器,用于Python Web應用程序的專業部署和開發。

在部署python程序web應用程序時,可以根據性能的需求,選擇合適的wsgi server,不同的wsgi server區別在于并發支持上,有單線程,多進程,多線程,協程的區別,其功能還是近似,無非是請求路由,執行對應的函數,返回處理結果。

Django部署Django的主要部署平臺是 WSGI,這是用于Web服務器和應用程序的Python標準。Django的 startproject管理命令設置一個簡單的默認WSGI配置,可以根據需要為您的項目進行調整,并指示任何符合WSGI的應用程序服務器使用。application 使用WSGI部署的關鍵概念是應用程序服務器用于與代碼通信的 application 可調用。它通常在服務器可訪問的Python模塊中作為名為 application 的對象提供。startproject 命令創建包含這樣的 application 可調用的文件 <project_name>/wsgi.py. ,它被Django的開發服務器和生產WSGI部署使用。 WSGI服務器從其配置中獲取 application 可調用的路徑。 Django的內置服務器,即 runserver 命令,從 WSGI_APPLICATION 設置讀取它。

2. 為什么要用nginx,uwsgi

1、首先nginx 是對外的服務接口,外部瀏覽器通過url訪問nginx,支持大并發

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

  • 如果是靜態文件請求就直接訪問用戶給nginx配置的靜態文件目錄,直接返回用戶請求的靜態文件,
  • 如果不是靜態文件,而是一個動態的請求,那么nginx就將請求轉發給uwsgi,uwsgi 接收到請求之后將包進行處理,處理成wsgi可以接受的格式,并發給wsgi,wsgi 根據請求調用應用程序的某個文件,某個文件的某個函數,最后處理完將返回值再次交給wsgi,wsgi將返回值進行打包,打包成uwsgi能夠接收的格式,uwsgi接收wsgi 發送的請求,并轉發給nginx,nginx最終將返回值返回給瀏覽器。

3、要知道第一級的nginx并不是必須的,uwsgi完全可以完成整個的和瀏覽器交互的流程,但是要考慮到某些情況:

1、安全問題,程序不能直接被瀏覽器訪問到,而是通過nginx,nginx只開放某個接口,uwsgi本身是內網接口,這樣運維人員在nginx上加上安全性的限制,可以達到保護程序的作用。2、負載均衡問題,一個uwsgi很可能不夠用,即使開了多個work也是不行,畢竟一臺機器的cpu和內存都是有限的,有了nginx做代理,一個nginx可以代理多臺uwsgi完成uwsgi的負載均衡。3、靜態文件問題,用django或是uwsgi這種東西來負責靜態文件的處理是很浪費的行為,而且他們本身對文件的處理也不如nginx好,所以整個靜態文件的處理都直接由nginx完成,靜態文件的訪問完全不去經過uwsgi以及其后面的東西。

2.1 web服務器

傳統的c/s架構,請求的過程是 客戶端 > 服務器 服務器 > 客戶端 服務器就是:1.接收請求 2.處理請求 3.返回響應

2.2 web框架層

HTTP的動態數據交給web框架,例如django遵循MTV模式處理請求。 HTTp協議使用url定位資源,urls.py將路由請求交給views視圖處理,然后返回一個結果,完成一次請求。 web框架使用者只需要處理業務的邏輯即可。

3. nginx、WSGI、uwsgi、uWSGI、django關系梳理

wsgi 全稱web server gateway interface,wsgi不是服務器,也不是python模塊,只是一種協議,描述web server如何和web application通信的規則。運行在wsgi上的web框架有bottle,flask,djangouwsgi 和wsgi一樣是通信協議,是uWSGI服務器的單獨協議,用于定義傳輸信息的類型uWSGI 是一個web服務器,實現了WSGI協議,uwsgi協議。nginx - web服務器,更加安全,更好的處理處理靜態資源,緩存功能,負載均衡,因此nginx的強勁性能,配合uWSGI服務器會更加安全,性能有保障。 - 暴露在公網、支持大并發、可以封禁IP地址、反向代理django 高級的python web框架,用于快速開發,解決web開發的大部分麻煩,程序員可以更專注業務邏輯,無須重新造輪子

案例:

配置阿里云yum源,方便下載各種轉件:

1、進入Linux配置yum源路徑

cd /etc/yum.repos.d/

2、刪除原有repo結尾的倉庫文件

rm -rf *

3、進入ali云鏡像站

https://developer.aliyun.com/mirror/

4、獲取兩個yum倉庫 ‘wget’ 表示在線下載

# 獲取centos倉庫 'CentOS-Base.repo' wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 再獲取另一個軟件比較多的epel倉庫 'epel.repo' wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

5、清空之前的yum緩存

yum clean all

1. 上傳代碼

Windows + Linux互傳文件

  • 通過拖拽形式上傳,

    yum install lrzsz -y # 安裝lrzsz提供的文件傳輸軟件 - rz 是上傳文件的命令 - sz 是下載文件的命令

Linux + Linux 之間互傳文件

  • 通過 scp 命令互傳

    scp 本地文件 root@遠程服務器IP:/上傳地址

將本地代碼壓縮打包上傳至服務器并解壓

2. 安裝python環境

# 解決編譯python所需的基礎開發環境yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

2.1 源代碼編譯安裝

  • 獲取python源碼

    wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tar.xz
  • 解壓縮python源碼文件 Python-3.7.5.tar.xz

    xz -d Python-3.7.5.tar.xz tar -xf Python-3.7.5.tar
  • 編譯三部曲

    # 進入源碼目錄,指定python安裝路徑 cd Python-3.7.5 ./configure --prefix=/project/python375/ # 編譯 make # 安裝 make install
  • 編譯安裝完成后,配置Linux的PATH環境變量,且永久生效 /etc/profile(系統全局配置文件,每次開機都會加載這個文件)

    # python+Tab鍵 查看是否有python3# 獲取環境變量 $是Linux取變量值得一個符號 echo $PATHPATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin' # 進入python375/bin/ pwd 獲取路徑 cd /project/python375/bin/ pwd # /project/python375/bin# 將獲取的路徑添加至PATH,冒號隔開(PATH加載順序是從前往后) PATH='/project/python375/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'# 編輯/etc/profile 在最后一行添加新的PATH變量 vim /etc/profile # 讀取/etc/profile 讓設置生效 source /etc/profile

2.2 配置python的虛擬環境 virtualenvwrapper

在使用python開發的過程中,工程較多時,難免會產生 不同工程依賴不同版本庫的問題;

或者是在開發過程中不想讓物理環境里充斥著各種各樣的庫,引發以后依賴災難

此時,就需要 對不同工程使用不同的虛擬環境 來保持開發環境的整潔

virtualenv 可以在系統中建立多個不同 并且相互不干擾的虛擬環境

安裝這個工具

pip3 install virtualenvwrapper

配置虛擬環的環境參數:

打開 /etc/profile 添加如下 4個參數

export WORKON_HOME=~/Envs #設置virtualenv的統一管理目錄 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' #添加virtualenvwrapper的參數,生成干凈隔絕的環境 export VIRTUALENVWRAPPER_PYTHON=/project/python375/bin/python3 #指定python解釋器 source /project/python375/bin/virtualenvwrapper.sh #執行virtualenvwrapper安裝腳本

【提示】:virtualenv版本大于20,不需要添加 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' #添加virtualenvwrapper的參數,生成干凈隔絕的環境 此條參數,此版本默認已添加

手動安裝虛擬環境工具

source /etc/profile

此時使用虛擬環境的命令,比較方便:

mkvirtualenv crm_venv1 # 創建虛擬環境 workon crm_venv1 # 激活/切換虛擬環境 deactivate # 退出虛擬環境

2.3 在虛擬環境下啟動crm項目

1、解決crm所需的模塊(庫)

pip3 install Django==2.1.8 # 安裝Django

2、保證本地開發模塊和線上模塊一致

pip3 freeze > requirement.txt # 導出當前python解釋器所有模塊信息至requirement.txt文件 pip3 install -r requirement.txt # pip 會一行一行讀取requirement文件一行一行安裝

3、啟動

python manage.py runserver 0.0.0.0:8000 # 只做調試代碼使用

3. Nginx部署crm

用 supervisor 進程管理工具,指定 uwsgi 啟動 crm

3.1 安裝uwsgi

pip3 install uwsgi

3.2 啟動crm

使用uwsgi.ini 配置文件,啟動crm

touch uwsgi.inin # 進入項目目錄創建改文件

寫入如下文件:

[uwsgi] # Django-related settings # the base directory (full path) # 填寫項目的第一層路徑(相對第二層目錄的上層目錄,即wsgi文件的上層目錄) chdir = /project/crm # Django's wsgi file # 填寫第二層項目,填寫Django的wsgi.py文件路徑 module = CRM_v1.wsgi # the virtualenv (full path) # cd virtualenv 進入虛擬環境的家目錄,pwd獲取虛擬環境的絕對路徑 # 填寫虛擬環境的絕對路徑 home = /root/Envs/crm_venv1 # process-related settings # master master = true # maximum number of worker processes # 進程數(填寫CPU核數,top查看) processes = 1 # the socket (use the full path to be safe # 指定uwsgi的啟動協議,是unix-socket協議,必須通過Nginx反向代理才能訪問到 socket = 0.0.0.0:8000# 還可以指定http協議,啟動uwsgi # http = 0.0.0.0:8000# uwsgi內部解析的數據包大小,默認4k,如果準備接收大請求,可以增長到64k buffer-size = 65535# ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true

指定uwsgi.ini配置文件,啟動項目

uwsgi --ini uwsgi.ini # --ini代表指定配置文件啟動

3.3 nginx收集靜態文件

uwsgi默認不解析Django的靜態文件,需要收集起來給nginx

修改Django的靜態文件 settings.py

vim supercm/settings.py# 添加如下參數 STATIC_ROOT='/project/crm_static' # 代表收集django所有靜態文件,以及admin后臺的靜態文件(css、js、img等)

執行命令開始收集

python3 manage.py collectstatic # 收集靜態文件至STATIC_ROOT路徑。

3.4 配置nginx反向代理及處理

查看服務器是否有Nginx

which nginx

查看淘寶使用的web服務器

curl -I taobao.com

3.5 使用淘寶Nginx

3.5.1 下載淘寶nginx

鏈接地址:Cnblogs.com/clschao/articles/10526431.html

wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz
3.5.2 解壓縮
tar -zxvf tengine-2.3.2.tar.gz
3.5.3 安裝

進入tengine-2.3.2(源碼目錄),開始編譯三部曲

# 一、指定安裝路徑 ./configure --prefix=/project/tbnginx/ # 二、開始編譯 make # 三、安裝 make install

3.6 配置環境變量

進入安裝目錄,找到路徑,添加至PATH

cd tbnginx/ cd sbin/ # 進入可執行腳本 pwd # /project/tbnginx/sbin vim /etc/profile # 編輯profile,將/project/tbnginx/sbin添加PATH,冒號隔開 source /etc/profile # 執行profile

3.7 啟動nginx

nginx # 啟動ps -ef | grep nginx # 查看Nginx進程,-ef 表示列出所有進程,管道符篩選nginxroot 30373 1 0 10:01 ? 00:00:00 nginx: master process nginx # 用來調度nobody 30374 30373 0 10:01 ? 00:00:00 nginx: worker process # 用來解析root 30389 10838 0 10:01 pts/0 00:00:00 grep --color=auto nginxnetstat -tunlp | grep nginx # 查看端口tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 30373/nginx: master

3.8 配置nginx

進入nginx安裝目錄,編輯nginx配置文件

vim ./conf/nginx.conf

nginx 配置文件:

# 花括號閉合控制代碼塊語法16 17 http {18 include mime.types;19 default_type application/octet-stream;...# nginx的虛擬主機功能,用于定義靜態文件服務器,或者反向代理功能36 server {37 listen 80;38 server_name localhost;39...44 # 注意:這個location的作用就是定義靜態文件服務器或者反向代理45 location / {# 注釋掉root,去掉靜態文件的功能46 # root html; # 指定nginx默認 頁面路徑47 # index index.html index.htm;# nginx 請求轉發的參數include uwsgi_params; # 導入另一文件中參數使之生效uwsgi_pass 0.0.0.0:8000; # 基于uwsgi協議的轉發# proxy_pass # 反向代理,請求來了啥也不管直接轉發給另一個人,基于的http協議轉發48 }49 136 }

3.9 重啟nginx

# 平滑重啟,只重讀nginx的配置文件nginx -s reload

4. supervisor進程管理工具,啟動uwsgi

安裝supervisor:

yum install supervisor -y

生成配置文件:

echo_supervisord_conf > /etc/supervisord.conf # 在/etc 下生成supervisord文件 worken + 'Tab'鍵 which uwsgi # 獲取絕對路徑

編輯 /etc/supervisord.conf 配置文件,啟動crm的任務

# supervisord.conf配置文件參數解釋 # [program:xx]是被管理的進程配置參數,xx是進程的名稱[program:crm] command=/root/Envs/crm_venv1/bin/uwsgi --ini /project/crm/uwsgi.ini ; # uwsgi絕對路徑+程序啟動命令 autostart=true ; # 在supervisord啟動的時候也自動啟動 startsecs=10 ; # 啟動10秒后沒有異常退出,就表示進程正常啟動了,默認為1秒 autorestart=true ; # 程序退出后自動重啟,可選值:[unexpected,true,false],默認為 stopasgroup=true ;# 默認為false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程 killasgroup=true ;# 默認為false,向進程組發送kill信號,包括子進程

5. 啟動supervisor,并且自動啟動了uwsgi

supervisord -c /etc/supervisord.conf # d表示服務端

6. 管理supervisor的進程

supervisorctl -c /etc/supervisord.conf # ctl表示客戶端

7. 處理uwsgi的靜態文件

修改nginx.conf, 添加一個新的location路徑匹配靜態資源

location /static {alias /project/crm_static; }

重啟nginx

# 平滑重啟,只重讀nginx的配置文件nginx -s reload

總結

以上是生活随笔為你收集整理的nginx+uWSGI + django部署项目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。