Linux 8 項目發佈

所需技術: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端口是被牆的,須要在阿里雲防火牆中添加規則:

 

相關文章
相關標籤/搜索