nginx+uWSGI+django+virtualenv+supervisor釋出web伺服器 nginx+uWSGI+django+virtualenv+supervisor釋出web伺服器
1.單機啟動django專案,效能低,預設使用wsgiref模組,效能低的wsgi協議 python3 manager.py runserver 0.0.0.0:8000 > wsgiref模組中 2.高併發啟動django,django是沒有這個功能的,而uWSGI模組,遵循uwsgi協議,支援多程序處理django請求 uwsgi 通過他,啟動你的django,而不再是python3 manager.py runserver 0.0.0.0:8000 3.公司中一般用 nginx + uwsgi + django + virtualenv + supervisord(程序管理工具) 搭建筆記:1.確定依賴元件是否安裝 yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel nginx 正向代理,反向代理的概念 使用者阿段,去訪問mycrm.com:80 ,他想直接從80埠,找到hello檢視,也就是mycrm.com:80/hello 實現手段就是,阿段去訪問 mycrm.com:80 這個nginx服務,並且讓nginx,把hello這個請求,丟給後端的 uwsgi+django程式處理1.基礎環境準備好 yum groupinstall "Development tools" yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel 2.準備好python3環境 3.準備好virtualenv 4.安裝uWSGI 1.啟用虛擬環境 source /opt/all_venv/venv2/bin/activate 2.安裝uWSGI (venv2) [[email protected]~ 05:18:21]$pip3 install uwsgi 3.檢查uwsgi版本 (venv) [[email protected] 192.168.11.64 /opt]$uwsgi --version 2.0.17.1 #檢查uwsgi python版本 uwsgi --python-version 4.執行一個簡單的uwsgi伺服器 1.建立一個test.py檔案,寫入內容 def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 2.然後用uwsgi命令啟動 uwsgi --http :8000 --wsgi-file test.py 引數解釋 http :8000: 使用http協議,埠8000 wsgi-file test.py: 載入指定的檔案,test.py 5.用uwsgi執行你的django專案(測試使用) 1.準備好mysite,自己寫好MTV檢視函式 /hello 先確保你在專案資料夾下,例如/opt/mysite/底下 uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 引數解析 --http 啟動在8088埠,--module 指定專案資料夾路徑 --py-autoreload是熱載入程式 6.配置nginx反向代理uwsgi+django!!!!(此步重要!!!) 1.首先kill殺掉nginx程序 2.配置nginx.conf,通過此步才能生效!! 填入重要兩個引數,根據自己目錄結構配置,uwsgi_pass通過這個引數,nginx才能轉發請求給後端0.0.0.0:9000的應用 include /opt/nginx112/conf/uwsgi_params; uwsgi_pass 0.0.0.0:9000; --------------------------分割線-------------------------------------------------------- server { listen 80; server_name mycrm.com; location / { include /opt/nginx112/conf/uwsgi_params; uwsgi_pass 0.0.0.0:9000; root html; index index.html index.htm; #deny 10.0.0.1; } 配置nginx.conf之後,啟動nginx服務,等待配置啟動uwsgi+django 7.配置supervisor程序管理工具 1.通過python2的包管理工具easy_install安裝 yum install python-setuptools easy_install supervisor 2.通過命令生成supervisor的配支檔案 echo_supervisord_conf > /etc/supervisord.conf 3.寫入/etc/supervisord.conf配置資訊(引數根據自己環境填寫) [program:my_crm] command=/opt/all_venv/venv2/bin/uwsgi --uwsgi 0.0.0.0:9000 --chdir=/opt/s13crm --home=/opt/all_venv/venv2/ --module=s13crm.wsgi directory=/opt/s13crm startsecs=0 stopwaitsecs=0 autostart=true autorestart=true 8.啟動supervi服務,(同時啟動uwsgi+django服務) 最後啟動supervisor,完成uWSGI啟動django,nginx反向代理 supervisord -c /etc/supervisord.conf #啟動supervisor supervisorctl -c /etxc/supervisord.conf restart my #重啟my專案 supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all] 9.此時訪問網站mycrm.com ,檢視是否可以通過80埠,訪問到django應用,完成專案釋出。 由於nginx的高併發效能,配合uwsgi的多程序效能,可以達到一個線上的django應用釋出!!!
nginx+uWSGI+django+virtualenv+supervisor釋出web伺服器
大家都學過了django,用django寫了各種功能,寫了bbs專案,寫了路飛學城。
咱們都知道django是一個web框架,方便我們快速開發web程式,http請求的動態資料就是由web框架來提供處理的。
前面超哥也對nginx簡單的介紹了,本文將nginx、WSGI、uwsgi、uWSGI、django這幾個關係梳理一下。
wsgi 全稱web server gateway interface,wsgi不是伺服器,也不是python模組,只是一種協議,描述web server如何和web application通訊的規則。
執行在wsgi上的web框架有bottle,flask,django
uwsgi 和wsgi一樣是通訊協議,是uWSGI伺服器的單獨協議,用於定義傳輸資訊的型別
uWSGI 是一個web伺服器,實現了WSGI協議,uwsgi協議。a
nginx web伺服器,更加安全,更好的處理處理靜態資源,快取功能,負載均衡,因此nginx的強勁效能,配合uWSGI伺服器會更加安全,效能有保障。
django 高階的python web框架,用於快速開發,解決web開發的大部分麻煩,程式設計師可以更專注業務邏輯,無須重新造輪子
邏輯圖
web伺服器
傳統的c/s架構,請求的過程是 客戶端 > 伺服器 伺服器 > 客戶端 伺服器就是:1.接收請求 2.處理請求 3.返回響應
web框架層
HTTP的動態資料交給web框架,例如django遵循MTV模式處理請求。 HTTp協議使用url定位資源,urls.py將路由請求交給views檢視處理,然後返回一個結果,完成一次請求。 web框架使用者只需要處理業務的邏輯即可。
如果將一次通訊轉化為“對話”的過程
Nginx:hello wsgi,我剛收到一個請求,你準備下然後讓django來處理吧
WSGI:好的nginx,我馬上設定環境變數,然後把請求交給django
Django:謝謝WSGI,我處理完請求馬上給你響應結果
WSGI:好的,我在等著
Django:搞定啦,麻煩wsgi吧響應結果傳遞給nginx
WSGI:太棒了,nginx,響應結果請收好,已經按照要求傳遞給你了
nginx:好滴。我把響應交給使用者。合作愉快
Django Nginx+uwsgi 安裝配置
在前面的章節中我們使用 python manage.py runserver 來執行伺服器。這隻適用測試環境中使用。
正式釋出的服務,需要一個可以穩定而持續的伺服器。
基礎開發環境配置
yum groupinstall "Development tools" yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
提前安裝好python3環境
https://www.cnblogs.com/pyyu/p/7402145.html
virtualenv
請確保你的虛擬環境正常工作
https://www.cnblogs.com/pyyu/p/9015317.html
安裝django1.11
pip3 install django==1.11
#建立django專案mysite
django-admin startproject mysite
#建立app01
python3 manage.py startapp app01
mysite/settings.py
#settings.py設定 ALLOWED_HOSTS = ['*'] install app01
mysite/urls.py
from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello_django/', views.hello), ]
app01/views.py
from django.shortcuts import render,HttpResponse # Create your views here. def hello(request): print('request is :',request) return HttpResponse('django is ok ')
安裝uWSGI
進入虛擬環境venv,安裝uwsgi (venv) [[email protected] 192.168.11.64 /opt]$pip3 install uwsgi
檢查uwsgi版本
(venv) [[email protected] 192.168.11.64 /opt]$uwsgi --version
2.0.17.1
#檢查uwsgi python版本
uwsgi --python-version
執行簡單的uWSGI
#啟動一個python uwsgi --http :8000 --wsgi-file test.py
http :8000
: 使用http協議,埠8000wsgi-file test.py
: 載入指定的檔案,test.py
#test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3
uWsgi熱載入python程式
在啟動命令後面加上引數 uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1
#釋出命令
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#此時修改django程式碼,uWSGI會自動載入django程式,頁面生效
執行django程式
#mysite/wsgi.py 確保找到這個檔案
uwsgi --http :8000 --module mysite.wsgi
module mysite.wsgi
: 載入指定的wsgi模組
uwsgi配置檔案
uwsgi支援ini、xml等多種配置方式,本文以 ini 為例, 在/etc/目錄下新建uwsgi_nginx.ini,新增如下配置: # mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) chdir = /opt/mysite # Django's wsgi file module = mysite.wsgi # the virtualenv (full path) home = /opt/venv # process-related settings # master master = true # maximum number of worker processes processes = 1 # the socket (use the full path to be safe socket = 0.0.0.0:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true uwsgi.iniuwsgi.ini
指定配置檔案啟動命令
uwsgi --ini /etc/uwsgi_nginx.ini
配置nginx結合uWSGI
配置nginx.conf
worker_processes 1; error_log logs/error.log; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65;
#nginx反向代理uwsgi server { listen 80; server_name 192.168.11.64; location / { include /opt/nginx1-12/conf/uwsgi_params; uwsgi_pass 0.0.0.0:8000; root html; index index.html index.htm; }
#nginx處理靜態頁面資源
location /static{
alias /opt/nginx1-12/static;
}
#nginx處理媒體資源
location /media{
alias /opt/nginx1-12/media;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置完啟動nginx
supervisor
supervisor 是基於 python 的任務管理工具,用來自動執行各種後臺任務,當然你也能直接利用 nohup 命令使任務自動後臺執行,但如果要重啟任務,每次都自己手動 kill 掉任務程序,這樣很繁瑣,而且一旦程式錯誤導致程序退出的話,系統也無法自動過載任務。
這裡要配置基於virtualenv的supervisor
由於supervisor在python3下無法使用,因此只能用python2去下載!!!!!!
#注意此時已經退出虛擬環境了!!!!!
yum install python-setuptools
easy_install supervisor
通過命令生成supervisor的配支檔案
echo_supervisord_conf > /etc/supervisord.conf
然後再/etc/supervisord.conf末尾新增上如下程式碼!!!!!!
[program:my] #command=/opt/venv/bin/uwsgi --ini /etc/uwsgi_nginx.ini #這裡是結合virtualenv的命令 和supervisor的精髓!!!!
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#--home指的是虛擬環境目錄 --module找到 mysite/wsgi.py
directory=/opt/mysite startsecs=0 stopwaitsecs=0 autostart=true autorestart=true
最後啟動supervisor,完成uWSGI啟動django,nginx反向代理
supervisord -c /etc/supervisord.conf #啟動supervisor
supervisorctl -c /etxc/supervisord.conf restart my #重啟my專案supervisorctl -c
/etc/supervisord
.conf [start|stop|restart] [program-name|all]
重新載入supervisor
一、新增好配置檔案後 二、更新新的配置到supervisord supervisorctl update 三、重新啟動配置中的所有程式 supervisorctl reload 四、啟動某個程序(program_name=你配置中寫的程式名稱) supervisorctl start program_name 五、檢視正在守候的程序 supervisorctl 六、停止某一程序 (program_name=你配置中寫的程式名稱) pervisorctl stop program_name 七、重啟某一程序 (program_name=你配置中寫的程式名稱) supervisorctl restart program_name 八、停止全部程序 supervisorctl stop all 注意:顯示用stop停止掉的程序,用reload或者update都不會自動重啟。
django的靜態檔案與nginx配置
mysite/settings.py
STATIC_ROOT='/opt/nginx1-12/static' STATIC_URL = '/static/' STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static"), ]
上述的引數STATIC_ROOT用在哪?
通過python3 manage.py collectstatic 收集所有你使用的靜態檔案儲存到STATIC_ROOT!
STATIC_ROOT 資料夾 是用來將所有STATICFILES_DIRS中所有資料夾中的檔案,以及各app中static中的檔案都複製過來 # 把這些檔案放到一起是為了用nginx等部署的時候更方便