nginx+uwsgi+virtualenv+supervisor部署項目

一.導論

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區別在於併發支持上,有單線程,多進程,多線程,協程的區別,
其功能仍是近似,無非是請求路由,執行對應的函數,返回處理結果。

  1.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 設置讀取它。

二.nginx+uwsgi結合的好處

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開發的大部分麻煩,程序員能夠更專一業務邏輯,無須從新造輪子

 

 四.django運行環境 Nginx+uwsgi安裝配置

 以前咱們使用 python manage.py runserver 來運行服務器。這隻適用測試環境中使用。node

正式發佈的服務,須要一個能夠穩定而持續的服務器。python

  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.完成virtualenvwrapper工具的配置,解決虛擬環境問題

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若是裝不上就使用這條命令:
  
 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 

 

五.centos7下安裝配置mariadb數據庫,且建立數據庫數據,遷移導入路飛學城數據

  1.從windows上導出mysql的數據庫

有兩種方法
第一種:
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命令查看數據是否成功導入

  2.給mariadb的root用戶遠程登陸權限(若是數據庫init最後一步選擇了y,容許root遠程登陸則不須要這一步)

#linux本機登陸

mysql -uroot -p

# 容許root用戶遠程登陸,而且給予全部數據庫全部表的全部權限
grant all privileges on *.* to root@'%' identified by 'nihao123';
flush privileges;mysql

 

  3.遠程登陸,導入數據

    在linux的mysql,導入這個數據文件linux

(1) 進入mysql
    mysql -u root -p
(2) 切換數據庫
    use luffycity
(3) 導入數據
    source /opt/luffycity.sql
注意1,SELinux和linux的防火牆要給關閉,不然windows去連接linux的3306端口可能被拒絕
注意2: 第3步必定要確認OK以後才能繼續往下操做

六.測試使用linux的python解釋器去運行項目 切換到 項目中運行(注意要解決解釋器的模塊問題,才能正常運轉項目)

 (1) 先修改路飛學城項目的settings.py文件

  一個是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

 

七.安裝測試uwsgi,使用uwsgi運行路飛學城,支持多進程

  1.安裝uwsgi

(1) 進入luffy_city_env虛擬環境
    workon luffy_city_env
(2) 安裝uwsgi
    pip3 install uwsgi

  2.測試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:90005)瀏覽器界面返回Hello World

  3.uwsgi啓動路飛項目

uwsgi --http :9000 --module luffy.wsgi

  4.用uwsgi熱啓動項目

uwsgi --http :9000 --module lufei.wsgi --py-autoreload=1  #修改了項目會自動從新加載文件 這個命令須要在項目我文件夾纔可意思使用,由於wsgi.py文件

  5.uwsgi啓動要加載不少的參數,比較麻煩,因此咱們把參數放在一個文件中用文件啓動

(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來處理靜態文件

八.完成nginx的安裝配置,是nginx能夠幫咱們處理靜態文件和轉發請求給uwsgi

  1.收集靜態文件

     (1) 修改settings.py配置文件, 加入如下一行配置

STATIC_ROOT='/opt/luffy_pro/static'

     (2) 建立靜態文件存放目錄/opt/luffy_pro/static

mkdir -p /opt/luffy_city/static

      (3) 一條命令收集django項目下面的全部靜態文件

python3 manage.py collectstatic

# STATIC_ROOT 文件夾 是用來將全部STATICFILES_DIRS中全部文件夾中的文件,以及各app中static中的文件都複製過來
# 把這些文件放到一塊兒是爲了用nginx等部署的時候更方便

    

    收集成功的標記

  2. 配置nginx結合uwsgi進行轉發

    (1)在nginx.conf配置文件下添加如下配置文件

location / {
            include  /opt/nginx112/conf/uwsgi_params;
            uwsgi_pass 0.0.0.0:9000;
        }

  

    (2) 將uwsgi.ini配置文件裏面的http註釋掉,啓用socket

socket          = 0.0.0.0:9000   # 啓用此行
# http            = 0.0.0.0:9000  # 停用此行

    (3) 在nginx.conf中添加靜態文件地址

location /static{
                alias /opt/lufei_pro/static;
        }

  

    (4) 平滑重啓nginx

/opt/nginx1-12/sbin/nginx -s reload

    (5) 在物理機上添加hosts

192.168.12.56    www.qishi2.com  #這樣配置完了你也只能經過這兩個配合8000端口訪問,若是成功了說明後端配置成功了

九.驗證

1.  驗證域名是否正常訪問

2.  驗證靜態文件是否正常顯示

3.  驗證數據庫是否鏈接正常

4. 驗證redis數據庫是否鏈接正常

5.  驗證uwsgi是否正常啓動

 

十.安裝node,配置vue前端

  1.下載安裝node軟件包

wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz

  2.解壓(免安裝)

tar -zxvf node-v8.6.0-linux-x64.tar.gz

   3.添加環境變量(/etc/profile,配置完記得source /etc/profile)

PATH=/opt/node-v8.6.0-linux-x64/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

  4.將vue項目裏面的全部127.0.0.1和全部的localhost所有改成咱們的服務器地址192.168.12.56

注意:   此步很是重要, 講師機上面的vue項目裏面,這個IP沒有建立全局變量,致使127.0.0.1和localhost分佈在不少個文件中,因此須要一個一個替換

  5.進入到vue前端的項目目錄, 使用npm run build生成dist項目靜態文件

cd /opt/luffy_pro/luffy_pc

npm run build

  6.在luffy_pc目錄下就能夠看到dist文件夾

/opt/luffy_city/luffy_pro/dist

   7.在nginx修改配置文件

    新增一個主機

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;
                }
        }

  

    8.運行nginx,訪問www.qishi2.com

 

十一.supervisor守護進程工具

  使用uwsgi啓動django項目時,若是一旦掛掉了九九出大事情了,因此咱們就用supervisor來爲uwsgi開啓守護進程

  1. 安裝supervisor

·    因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!

    因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!

    因爲supervisor在python3下沒法使用,所以只能用python2去下載!!!!!!

ech# 注意此時已經退出虛擬環境了!!!!!
easy_install supervisor

# 若是沒有easy_install的話,就yum安裝一個setuptools工具就能夠用了
yum install python-setuptools

  2. 生成supervisord配置文件

echo_supervisord_conf > /etc/supervisord.conf

  3. 在/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配置文件參數解釋
參數詳解

 

  4.更新新的配置到supervisord    

supervisorctl update

  5. 啓動supervisor

supervisord -c /etc/supervisord.conf # 啓動supervisor
supervisorctl -c /etc/supervisord.conf # 啓動和進入supervisor交互模式

  6. 查看supervisor運行狀態

supervisorctl  # 使用此命令後將會進入supervisor交互式管理界面
status  # 查看進程運行狀態

  7. 管理supervisor裏面的進程

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啓動

相關文章
相關標籤/搜索