WSGI是Web服務器網關接口。它是一個規範,描述了Web服務器如何與Web應用程序通訊,以及Web應用程序如何連接在一塊兒以處理一個請求,(接收請求,處理請求,響應請求)
基於wsgi運行的框架有Bottle,Django,Flask,用於解析動態HTTP請求
支持WSGI的服務器
wsgiref
python自帶的web服務器
Gunicorn
用於linux的 python wsgi Http服務器,經常使用於各類django,flask結合部署服務器。
mode_wsgi
實現了Apache與wsgi應用程序的結合
uWSGI
C語言開發,快速,自我修復,開發人員友好的WSGI服務器,用於Python Web應用程序的專業部署和開發。
在部署python程序web應用程序時,能夠根據性能的需求,選擇合適的wsgi server,不一樣的wsgi server區別在於併發支持上,有單線程,多進程,多線程,協程的區別,
其功能仍是近似,無非是請求路由,執行對應的函數,返回處理結果。
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 設置讀取它。
1. 首先nginx 是對外的服務接口,外部瀏覽器經過url訪問nginx, 2. nginx接收到瀏覽器發送過來的http請求,將包進行解析,分析url,若是是靜態文件請求就直接訪問用戶給nginx配置的靜態文件目錄,直接返回用戶請求的靜態文件,
若是不是靜態文件,而是一個動態的請求,那麼nginx就將請求轉發給uwsgi, uwsgi接收到請求以後將包進行處理,處理成wsgi能夠接受的格式,併發給wsgi,
wsgi 根據請求調用應用程序的某個文件的某個函數,最後處理完將返回值再次交給uwsgi,uwsgi將返回值進行打包,打包成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以及其後面的東西。
uwsgi.py文件html
# uwsgi在運行django項目的時候,必須找到django的wsgi.py文件內容中的參數,否則會報no application...的錯 # 也就是得有這個實例化的對象才行: application = get_wsgi_application() #解決辦法就是 uwsgi,必定要找到wsgi.py這個文件
wsgi前端
wsgi 全稱web server gateway interface,wsgi不是服務器,也不是python模塊,只是一種協議,描述web server如何和web application通訊的規則。
運行在wsgi上的web框架有bottle,flask,django
uwsgivue
uwsgi 和wsgi同樣是通訊協議,是uWSGI服務器的單獨協議,用於定義傳輸信息的類型
uWSGI
uWSGI 是一個web服務器,實現了WSGI協議,uwsgi協議。a
nginx
nginx web服務器,更加安全,更好的處理處理靜態資源,緩存功能,負載均衡,所以nginx的強勁性能,配合uWSGI服務器會更加安全,性能有保障。
django
django 高級的python web框架,用於快速開發,解決web開發的大部分麻煩,程序員能夠更專一業務邏輯,無須從新造輪子
以前咱們使用 python manage.py runserver 來運行服務器。這隻適用測試環境中使用。node
正式發佈的服務,須要一個能夠穩定而持續的服務器。python
yum groupinstall "Development tools" yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
1. 安裝虛擬環境virtualenv 2. 安裝virtualenvwrapper工具 3. 確認virtualenvwrapper.sh腳本正常使用 4. 確認用戶環境變量配置文件,有virtualenvwrapper.sh的四行配置 WORKON_HOME=~/Envs VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3 source /opt/python36/bin/virtualenvwrapper.sh
5.從新加載環境變量配置文件
source /etc/profile 6. 建立路飛學城專用虛擬環境luffy_city_env 7. 上傳requirements.txt 8. 安裝路飛學城項目所須要的全部模塊(在虛擬環境安裝)
pip3 -i http://.pypi.douban.com/sample -r requirement
其中xadmin若是裝不上就使用這條命令:
有兩種方法 第一種: mysqldump -u root -p --all-databases > luffy_city.sql 第二種: 直接從navicat導出數據庫的數據 (1) 先從navicat導出數據庫數據,導出爲luffycity.sql (2) 將luffycity.sql上傳到服務器的/opt目錄下 (3) 在服務器上進入mysql,而後建立數據庫luffycity (4) 切換到數據庫luffycity(use luffycity) (5) 使用命令source /opt/luffycity.sql導入luffycity.sql數據 (6) 使用show tables命令查看數據是否成功導入
#linux本機登陸
# 容許root用戶遠程登陸,而且給予全部數據庫全部表的全部權限
grant all privileges on *.* to root@'%' identified by 'nihao123';
flush privileges;mysql
在linux的mysql,導入這個數據文件linux
(1) 進入mysql mysql -u root -p (2) 切換數據庫 use luffycity (3) 導入數據 source /opt/luffycity.sql
一個是host=['*'],一個是數據庫的用戶密碼,數據庫名nginx
ALLOW_HOSTS=["*"] 數據庫鏈接配置 注意: mariadb就是mysql,這裏的ENGINE不用修改 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', "HOST": "127.0.0.1", "PORT": 3306, "USER": "root", "PASSWORD": "root", "NAME": "luffycity", } }
(2)進入項目文件夾運行項目git
python3 manage.py runserver 0.0.0.0:8000 #這邊必定要指定0.0.0.0:8000
(1) 進入luffy_city_env虛擬環境 workon luffy_city_env (2) 安裝uwsgi pip3 install uwsgi
(1) 建立一個testqishi2.py #這個文件路徑隨便建,只是你要知道他的路徑 (2) 寫入如下幾行代碼 def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 (3) 經過uwsgi命令將測試文件跑起來 uwsgi --http :9000 --wsgi-file testqishi2.py (4) 測試經過IP+端口訪問 http://192.168.226.128:9000 (5)瀏覽器界面返回Hello World
uwsgi --http :9000 --module luffy.wsgi
uwsgi --http :9000 --module lufei.wsgi --py-autoreload=1 #修改了項目會自動從新加載文件 這個命令須要在項目我文件夾纔可意思使用,由於wsgi.py文件
(1) 建立一個配置文件uwsgi.ini(注意,這個配置文件無論放在哪裏均可以,可是啓動的時候,須要找到這個配置文件) (2) 寫入如下配置 [uwsgi]
chdir = /opt/lufei_pro/lufei
module = lufei.wsgi
home = /root/Envs/luffy_city_env
master = true
processes = 1
socket = 0.0.0.0:9000
#http = 0.0.0.0:9000
vacuum = true程序員
(3) 經過指定uwsgi.ini配置文件把django跑起來 uwsgi uwsgi.ini
#參數詳解:
[uwsgi] # Django-related settings # the base directory (full path) # 寫上項目的絕對路徑 chdir = /opt/book_manage # Django's wsgi file # 填寫找到django的wsgi文件,填寫相對路徑,以chdir參數爲相對路徑 module = book_manage.wsgi # the virtualenv (full path) # 填寫虛擬環境的絕對路徑 home = /root/Envs/book_manage_env/ # process-related settings # master #啓動uwsgi主進程 master = true # maximum number of worker processes processes = 1 # the socket (use the full path to be safe #若是你使用了nginx,作反向代理,必須填寫socket連接,而不是http參數 socket = 0.0.0.0:8000 #若是你不用nginx,直接使用uwsgi,運行一個http服務端,就用這個http參數 http = 0.0.0.0:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
注意: socket和http參數二選一,必定要注意!!!!!!!!!!!!!!!!!!
注意: socket和http參數二選一,必定要注意!!!!!!!!!!!!!!!!!!
注意: socket和http參數二選一,必定要注意!!!!!!!!!!!!!!!!!!
可是因爲uwsgi 不支持處理靜態文件,因此,咱們須要配置nginx與uwsgi結合,經過nginx來處理靜態文件
STATIC_ROOT='/opt/luffy_pro/static'
mkdir -p /opt/luffy_city/static
python3 manage.py collectstatic
# STATIC_ROOT 文件夾 是用來將全部STATICFILES_DIRS中全部文件夾中的文件,以及各app中static中的文件都複製過來 # 把這些文件放到一塊兒是爲了用nginx等部署的時候更方便
收集成功的標記
location / { include /opt/nginx112/conf/uwsgi_params; uwsgi_pass 0.0.0.0:9000; }
socket = 0.0.0.0:9000 # 啓用此行 # http = 0.0.0.0:9000 # 停用此行
location /static{ alias /opt/lufei_pro/static; }
/opt/nginx1-12/sbin/nginx -s reload
192.168.12.56 www.qishi2.com #這樣配置完了你也只能經過這兩個配合8000端口訪問,若是成功了說明後端配置成功了
1. 驗證域名是否正常訪問 2. 驗證靜態文件是否正常顯示 3. 驗證數據庫是否鏈接正常 4. 驗證redis數據庫是否鏈接正常 5. 驗證uwsgi是否正常啓動
wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz
tar -zxvf node-v8.6.0-linux-x64.tar.gz
PATH=/opt/node-v8.6.0-linux-x64/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
注意: 此步很是重要, 講師機上面的vue項目裏面,這個IP沒有建立全局變量,致使127.0.0.1和localhost分佈在不少個文件中,因此須要一個一個替換
cd /opt/luffy_pro/luffy_pc
npm run build
/opt/luffy_city/luffy_pro/dist
新增一個主機
server{ listen 80; server_name 192.168.226.128; #url匹配, 也就是在192.168.110.12時,此時進入location,返回vue的dist下的路飛學城首頁index.html location /{ root /opt/lufei_pro/lufei_02/dist; index index.html index.htm; } }
因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!
因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!
因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!
ech# 注意此時已經退出虛擬環境了!!!!! easy_install supervisor # 若是沒有easy_install的話,就yum安裝一個setuptools工具就能夠用了 yum install python-setuptools
echo_supervisord_conf > /etc/supervisord.conf
[program:luffy_city] command=/root/Envs/luffy_city_env/bin/uwsgi /opt/luffy_city/luffy/uwsgi.ini #這裏是結合virtualenv的命令 和supervisor的精髓!!!!
參數詳解:
supervisord.conf配置文件參數解釋 [program:xx]是被管理的進程配置參數,xx是進程的名稱 [program:xx] command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序啓動命令 autostart=true ; 在supervisord啓動的時候也自動啓動 startsecs=10 ; 啓動10秒後沒有異常退出,就表示進程正常啓動了,默認爲1秒 autorestart=true ; 程序退出後自動重啓,可選值:[unexpected,true,false],默認爲unexpected,表示進程意外殺死後才重啓 startretries=3 ; 啓動失敗自動重試次數,默認是3 user=tomcat ; 用哪一個用戶啓動進程,默認是root priority=999 ; 進程啓動優先級,默認999,值小的優先啓動 redirect_stderr=true ; 把stderr重定向到stdout,默認false stdout_logfile_maxbytes=20MB ; stdout 日誌文件大小,默認50MB stdout_logfile_backups = 20 ; stdout 日誌文件備份數,默認是10 ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件) stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out stopasgroup=false ;默認爲false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程 killasgroup=false ;默認爲false,向進程組發送kill信號,包括子進程 supervisord.conf配置文件參數解釋
supervisorctl update
supervisord -c /etc/supervisord.conf # 啓動supervisor supervisorctl -c /etc/supervisord.conf # 啓動和進入supervisor交互模式
supervisorctl # 使用此命令後將會進入supervisor交互式管理界面 status # 查看進程運行狀態
stop luffy_city # 關閉luffy_city進程 stop all # 關閉全部進程 start luffy_city # 開啓luffy_city進程 start all # 開啓全部進程 status # 查看全部進程運行狀態
restart 進程名稱 #重啓某一進程
supervisorctl reload #從新啓動全部進程
supervisorctl status # 能夠不用進入交互模式查看
這邊要注意的是:由於uwsgi啓動了django項目,而訪問這個項目時經過nginx轉發到uwsgi,因此uwsgi啓動django項目要早於naginx啓動