nginx+uWSGI + django部署项目
項目部署
nginx+uWSGI + django
1. WSGI
WSGI是Web服務器網關接口。它是一個規范,描述了Web服務器(返回靜態資源的就是web服務器,Nginx)如何與Web應用程序(django、Flask)通信,以及Web應用程序如何鏈接在一起以處理一個請求,(接收請求,處理請求,響應請求)
基于wsgi運行的框架有bottle,DJango,Flask,用于解析動態HTTP請求
在部署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.repo5、清空之前的yum緩存
yum clean all1. 上傳代碼
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 -y2.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 # 安裝Django2、保證本地開發模塊和線上模塊一致
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 uwsgi3.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.com3.5 使用淘寶Nginx
3.5.1 下載淘寶nginx
鏈接地址:Cnblogs.com/clschao/articles/10526431.html
wget http://tengine.taobao.org/download/tengine-2.3.2.tar.gz3.5.2 解壓縮
tar -zxvf tengine-2.3.2.tar.gz3.5.3 安裝
進入tengine-2.3.2(源碼目錄),開始編譯三部曲
# 一、指定安裝路徑 ./configure --prefix=/project/tbnginx/ # 二、開始編譯 make # 三、安裝 make install3.6 配置環境變量
進入安裝目錄,找到路徑,添加至PATH
cd tbnginx/ cd sbin/ # 進入可執行腳本 pwd # /project/tbnginx/sbin vim /etc/profile # 編輯profile,將/project/tbnginx/sbin添加PATH,冒號隔開 source /etc/profile # 執行profile3.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: master3.8 配置nginx
進入nginx安裝目錄,編輯nginx配置文件
vim ./conf/nginx.confnginx 配置文件:
# 花括號閉合控制代碼塊語法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 reload4. 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部署项目的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二分法查找+树
- 下一篇: OpenCV与图像处理学习十——区域生长