所需技術:nginx + virtualenvwrapper + supervisor + uWSGI + django + vue + mysql / mariadb + 阿里雲服務器html
導論:前端
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部署 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 設置讀取它。
請求接受流程:vue
1 首先nginx 是對外的服務接口,外部瀏覽器經過url訪問nginx, 2nginx 接收到瀏覽器發送過來的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以及其後面的東西。
區分:node
nginx是對外的服務器,對外只開闢一個接口,能夠實現負載均衡、快速加載靜態文件
uWSGI也是服務器,負責把從nginx轉發來的數據轉換成符合wsgi規範的格式交給django
wsgi是一種協議,規定了服務器和網絡框架之間的通訊規則
uwsgi是基於wsgi的一種協議
django是web開發框架,實現業務邏輯,處理數據
uwsgi的安裝使用:python
進入虛擬環境venv,安裝uwsgi (venv) [root@slave 192.168.11.64 /opt]$pip3 install uwsgi 檢查uwsgi版本 (venv) [root@slave 192.168.11.64 /opt]$uwsgi --version 2.0.17.1 #檢查uwsgi python版本 uwsgi --python-version
運行簡單的uwsgi:mysql
#啓動一個python uwsgi --http :8000 --wsgi-file test.py http :8000: 使用http協議,端口8000 wsgi-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熱加載django項目linux
在啓動命令後面加上參數 uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 # uwsgi不處理static靜態文件的配置 #發佈命令 command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi #此時修改django代碼,uWSGI會自動加載django程序,頁面生效
注意:uwsgi不加載靜態文件!!!nginx
sipervisor的安裝使用web
supervisor 是基於 python 的任務管理工具,用來自動運行各類後臺任務,固然你也能直接利用 nohup 命令使任務自動後臺運行,但若是要重啓任務,每次都本身手動 kill 掉任務進程,這樣很繁瑣,並且一旦程序錯誤致使進程退出的話,系統也沒法自動重載任務。sql
因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!
#注意此時已經退出虛擬環境了!!!!! yum install python-setuptools easy_install supervisor
經過命令生成supervisor的配置文件:
echo_supervisord_conf > /etc/supervisord.conf
而後再/etc/supervisord.conf末尾添加上以下代碼
[program:s14nbcrm] #啓動uwsgi的命令就是這個 command=/root/Envs/nbcrm/bin/uwsgi --ini /opt/NB_crm/uwsgi.ini #自動啓動uwsgi,掛了以後自動加載 autorestart=true
啓動supervisor
supervisord -c /etc/supervisord.conf #啓動supervisor
supervisorctl -c /etxc/supervisord.conf restart my #重啓my項目
supervisorctl 直接回車,進入交互式管理狀態
也能夠經過命令交互式的管理uwsgi
#服務端啓動後,經過命令管理軟件
supervisorctl start s14nbcrm
supervisorctl stop s14nbcrm
supervisorctl status s14nbcrm
項目發佈示例:
所需技術:nginx + virtualenvwrapper + supervisor + uWSGI + django + vue + mysql / mariadb + 阿里雲服務器
第一步、部署vue前端項目
一、首先在本地對vue項目進行操做
請注意,在vue中發送的全部請求地址都要修改爲nginx接收的ip和port
route的模式是history
npm install # 自動打包全部依賴包 npm run build # 生成一個dist文件夾,裏面是打包好的vue,包涵一個static文件夾和一個index.html
二、將dist文件夾上傳到Linux下的/opt/my_projects
三、在linux中下載node環境
下載node二進制包,此包已經包含node,不須要再編譯 wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz 解壓縮 [root@web02 opt]# tar -zxvf node-v8.6.0-linux-x64.tar.gz [root@web02 opt]# cd node-v8.6.0-linux-x64/ [root@web02 node-v8.6.0-linux-x64]# ./bin/node -v v8.6.0 [root@web02 node-v8.6.0-linux-x64]# ./bin/npm -v 5.3.0
將node命令,添加至linux環境變量,修改/etc/profile,寫入
PATH=$PATH:/opt/node-v8.6.0-linux-x64/bin
讀取配置文件
source /etc/profile
測試:
npm -v # v8.6.0
node -v # 5.3.0
四、配置nginx
server { #用戶訪問域名或者ip,默認是nginx的80端口 listen 80; server_name 60.205.225.178; #url匹配 / 也就是請求地址是192.168.119.12時,進入此location,返回vue的dist下index.html路飛學城首頁 location / { root /opt/my_projects/dist; index index.html index.htm;
#這一條參數確保vue頁面刷新時候,不會出現404頁面
try_files $uri $uri/ /index.html;
} }
第二步、開啓數據庫
一、查看mysql編碼格式
進入mysql後輸入命令:show variable like 'character%' 能夠看到編碼方式
>show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
二、修改爲中文編碼
1.退出mysql 2.vim /etc/my.cnf 3.將下面三句分別寫到三個地方 [client] default-character-set=utf8 [mysqld] default-character-set=utf8 [mysql] default-character-set=utf8
三、刪除以前建立的非中文編碼數據庫
四、啓動數據庫並建立django項目須要的庫
system start mariadb mysql -uroot -p create database my_record_project
第三步、構建虛擬環境
一、建立虛擬環境
mkvirtualenv Record_Project
workon Record_Project
二、安裝python三、pip3
1.下載源碼包 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz 2.解壓源碼包 xz -d Python-3.6.7.tar.xz tar -xf Python-3.6.7.tar.xz 3.下載python3依賴包 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 4.調用腳本文件 ./configure --prefix=/opt/python36 5.編譯安裝 make && make install 6.升級pip pip3 install --upgrade pip
三、安裝django程序須要的第三方庫
1.建立文本包含全部須要的第三方庫 touch requirement.txt Django==x.x.x djangorestframework==x.x.x ...... 2.遞歸安裝 pip3 install -r requirement.txt
第四步、在虛擬環境中安裝配置uwsgi
一、安裝
進入虛擬環境venv,安裝uwsgi (venv) [root@slave 192.168.11.64 /opt]$pip3 install uwsgi 檢查uwsgi版本 (venv) [root@slave 192.168.11.64 /opt]$uwsgi --version 2.0.17.1 #檢查uwsgi python版本 uwsgi --python-version
二、配置uwsgi
1.手動建立/opt/my_projects/uwsgi.ini文件 touch uwsgi.ini 2.寫入以下配置 [uwsgi] #項目的絕對路徑,定位到項目的第一層 chdir = /opt/record #指明項目的wsgi文件路徑 module = record.wsgi #指明你的虛擬解釋器的第一層路徑 home = /root/envs/Record_Project #指明經過uwsgi,啓動多少個進程 processes = 1 #若是你已經配置了nginx(啓動了nginx服務,配置了uwsgi_pass),請用這個socket鏈接
#這個端口是用來接收vue發送給nginx,nginx轉發給uwsgi的請求,而後uwsgi在轉發給django socket = 0.0.0.0:9000 #若是你沒用nginx,想經過uwsgi直接啓動web服務,指明http協議 # http = 0.0.0.0:9999 #在退出uwsgi環境後,清空環境變量 vacuum = true
3.經過配置文件啓動(注意uwsgi不會處理靜態文件,若是有,也是瀏覽器的緩存!!!!) uwsgi --ini /etc/uwsgi.ini
第五步、部署django
一、拷貝django程序到/opt/my_projects
二、配置django
ALLOWED_HOSTS = ['*'] # 容許全部主機訪問 DEBUG = False # 不在網頁出現報錯信息 STATIC_ROOT = '/opt/nginx1-12/conf/static' # 用來收集靜態資源
三、建立static和media
cd /opt/nginx1-12/conf mkdir static mkdir media
四、收集靜態資源
cd /opt/my_projects/record
python manage.py collectstatic
五、清空django以前建立的數據庫文件並從新建立表
python manage.py flush
再刪除app的migrations文件夾下的文件
python manage.py makemigrations
python manage.py migrate
第六步、配置nginx
一、配置nginx配置文件
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name 60.205.227.178; location / { root /opt/my_projects/dist; index index.html; #這一條參數確保vue頁面刷新時候,不會出現404頁面 try_files $uri $uri/ /index.html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 8000; server_name 60.205.227.178; location / { uwsgi_pass 0.0.0.0:9000; # 轉發給uwsgi include /opt/nginx1-12/conf/uwsgi_params; } location /static { alias /opt/nginx1-12/conf/static; }
location /media {
alias /opt/nginx1-12/conf/media;
} } }
二、啓動nginx
cd /opt/nginx1-12/sbin ./nginx
三、啓動uwsgi
cd /opt/my_projects
uwsgi --ini uwsgi.ini
大功告成啦!!!!可是注意,我使用的是阿里雲服務器,服務器默認只開了80端口,因此8000端口是被牆的,須要在阿里雲防火牆中添加規則: