Django項目部署(nginx+uWSGI+django+virtualenv+supervisor發佈web服務器 )

1、簡介

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 設置讀取它。
uwsgi 
    django默認啓動 python  manager.py  runserver  它調用wsgiref單機web服務器模塊,性能不好
    在線上啓動django項目,選擇的是 uWSGI + django  ,使用多進程高性能的web服務器運行,支持併發性更好
    
nginx
        1.由於nginx處理併發的良好性
        2.nginx對靜態文件處理的良好性
        3.nginx負載均衡的一個做用

supervisor
            1、不在經過命令行的方式,啓動項目
            2、進行進程管理(python、mysql、redis、nginx)
            3、經過supervisr統一化管理linux進程
            4、檢測到你服務掛了,自動重啓

重點標記:
 django建立時,會產生wsgi.py文件
 mysite/mysite/wsgi.py
  #wsgi.py產生的application應用
  application = get_wsgi_application()
 可能出現的坑:
  1. no  application  xxxxxx   這個問題就是說,你指定的wsgi.py文件不正確

 爲何要用nginx,uwsgi?html

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以及其後面的東西。

nginx、WSGI、uwsgi、uWSGI、django關係?python

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

2、Django Nginx+uwsgi 安裝配置

在前面的章節中咱們使用 python manage.py runserver 來運行服務器。這隻適用測試環境中使用。mysql

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

一、基礎開發環境配置nginx

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

二、提早安裝好python3環境程序員

三、virtualenv,請確保你的虛擬環境正常工做web

四、安裝django1.11面試

pip3 install django==1.11
#建立django項目mysite
django-admin startproject mysite
#建立app01
python3 manage.py startapp app01
#settings.py設置
ALLOWED_HOSTS = ['*']
install app01
mysite/settings.py
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello_django/', views.hello),
]
mysite/urls.py
from django.shortcuts import render,HttpResponse

# Create your views here.
def hello(request):
    print('request is :',request)
    return HttpResponse('django is ok ')
View Code

五、安裝uWSGIredis

進入虛擬環境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

運行簡單的uWSGIsql

#啓動一個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熱加載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配置文件:

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
#項目工做目錄,絕對路徑,找到第一層
chdir           = /opt/mysite
# Django's wsgi file
#指定wsgi.py文件路徑
module          = mysite.wsgi
# the virtualenv (full path)
#指定虛擬解釋器的工做目錄
home            = /root/Envs/nginx_uswgi
# process-related settings
# master
#uswgi的主進程
master          = true
# maximum number of worker processes
#啓動uswgi的進程數
processes       = 5

#不適用nginx反向代理的時候,uwsgi經過http啓動一個web服務
http=0.0.0.0:8888

#使用nginx反向代理,不能使用http協議,此時用socket一個鏈接啓動uwsgi


# 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 --ini  /etc/uwsgi_nginx.ini

 3、nginx

詳細:https://www.cnblogs.com/pyyu/p/9468680.html

一、nginx是什麼?

nginx是一個開源的,支持高性能,高併發的www服務和代理服務軟件。它是一個俄羅斯人lgor sysoev開發的,做者將源代碼開源出來供全球使用。
nginx比它大哥apache性能改進許多,nginx佔用的系統資源更少,支持更高的併發鏈接,有更高的訪問效率。
nginx不可是一個優秀的web服務軟件,還能夠做爲反向代理,負載均衡,以及緩存服務使用。
安裝更爲簡單,方便,靈活。
nginx能夠說是很是nb了

面試回答nginx技巧:

支持高併發,能支持幾萬併發鏈接
資源消耗少,在3萬併發鏈接下開啓10個nginx線程消耗的內存不到200M
能夠作http反向代理和負載均衡
支持異步網絡i/o事件模型epoll

二、爲何要使用nginx?

nginx 
    1.由於nginx處理併發的良好性、
    2.nginx對靜態文件處理的良好性
        備註:由於uwsgi啓動django項目,不會讀取一個靜態文件的配置參數
    3.nginx負載均衡的一個做用

三、安裝配置nginx

一個遠程傳輸工具:yum install lrzsz -y
  經常使用命令:
    sz #send 傳輸文件
    rz #接收文件
1.yum install epel-*  -y
    yum install nginx -y  
       

    #須要提早備好epel源
    #檢測nginx是否安裝成功 
        rpm -qi nginx
    
    
    2.啓動nginx web服務器
    /usr/sbin/nginx  啓動nginx web服務

    3.配置nginx.conf配置反向代理uwsgi,以及靜態資源處理
    若是找不到nginx.conf ,經過命令查找
        find / -name nginx.conf
    
    若是找不到uwsgi_params路徑,能夠經過如下命名查找
        find / -name uwsgi_params
        /etc/nginx/uwsgi_params
    
        vim /etc/nginx/nginx.conf
    
            location / {
                 include /etc/nginx/uwsgi_params;
                 uwsgi_pass 0.0.0.0:8000;
        }
        #靜態資源入口
            location /static {
                  alias /opt/static/;
                }
            }
            
        而後在項目的uwsgi.ini文件中註釋http,打開socket
            #不適用nginx反向代理的時候,uwsgi經過http啓動一個web服務
            #http=0.0.0.0:8888

            #使用nginx反向代理,不能使用http協議,此時用socket一個鏈接啓動uwsgi
            # the socket (use the full path to be safe
            socket          = 0.0.0.0:8000

        修改項目下的settings.py文件
            DEBUG = False


    
            
    4.修改完,重啓nginx
    /usr/bin/nginx -s  reload 
    

配置項目的靜態文件資源,經過nginx加載
    1.修改django的setings.py文件

    mysite/settings.py 
    加入如下信息
        #指定靜態文件存放路徑
        STATIC_ROOT='/opt/static'
        #指定靜態資源,請求入口
        STATIC_URL = '/static/'
        STATICFILES_DIRS=[
            os.path.join(BASE_DIR,"static"),
        ]

    2.經過命令收集靜態文件資源
        python3 manage.py collectstatic 收集全部你使用的靜態文件保存到STATIC_ROOT!
        
    3.此時static_root下有了全部項目的靜態資源
    
    4.  vim /etc/nginx/nginx.conf
        location /static {
            alias /opt/static/;
        }

4、supervisor

supervisor 是基於 python 的任務管理工具,用來自動運行各類後臺任務,固然你也能直接利用 nohup 命令使任務自動後臺運行,但若是要重啓任務,每次都本身手動 kill 掉任務進程,這樣很繁瑣,並且一旦程序錯誤致使進程退出的話,系統也沒法自動重載任務。

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

#注意此時已經退出虛擬環境了!!!!!
yum install python-setuptools
easy_install supervisor

經過命令生成supervisor的配支文件

echo_supervisord_conf > /etc/supervisord.conf

而後再/etc/supervisord.conf末尾添加上以下代碼!!!!!!

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信號,包括子進程
在配置文件中,添加任務,管理django項目
    vim /etc/supervisord.conf #寫入信息
    
    [program:s21_django]
    #管理uwsgi的命令, 輕使用絕對路徑
    command=/root/Envs/nginx_uwsgi/bin/uwsgi  --ini /home/mysite/uwsgi.ini
    #檢測項目是否掛掉,自動重啓
    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的命令

1、添加好配置文件後

2、更新新的配置到supervisord    

supervisorctl update
3、從新啓動配置中的全部程序

supervisorctl reload
4、啓動某個進程(program_name=你配置中寫的程序名稱)

supervisorctl start program_name
5、查看正在守候的進程

supervisorctl
6、中止某一進程 (program_name=你配置中寫的程序名稱)

pervisorctl stop program_name
7、重啓某一進程 (program_name=你配置中寫的程序名稱)

supervisorctl restart program_name
8、中止所有進程

supervisorctl stop all
注意:顯示用stop中止掉的進程,用reload或者update都不會自動重啓

 5、運行一個Django項目

一、使用virtualenv

1)把Django項目放在服務器的指定目錄中;

2)修改settings.py文件

ALLOWED_HOSTS = ['*']

 

修改數據庫驅動

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

pip3 install pymysql 

__init__.py 文件中添加數據庫驅動

import pymysql 
    pymysql.install()

 

3)建立虛擬環境

mkvirtualenv s21crm
cdvirtualenv

4)確認pip3和python3是否爲虛擬環境下的

(s21crm) [root@localhost s21crm]# which pip3
/root/Envs/s21crm/bin/pip3
(s21crm) [root@localhost s21crm]# which python3
/root/Envs/s21crm/bin/python3

5)查看環境

(s21crm) [root@localhost s21crm]# pip3 list
Package    Version
---------- -------
pip        18.1  
setuptools 40.6.3
wheel      0.32.3

6)若是沒有安裝Django環境,須要確認項目使用的Django版本,安裝對應版本

pip3 install django==1.11.11

7)進入項目一級目錄,運行server(記住關閉防火牆)

python3 manage.py runserver 0.0.0.0:7000

 二、使用virtualenvwrapper

1)安裝virtualenvwrapper

2)安裝uwsgi

pip3 install uwsgi

3)啓動項目

uwsgi --http :8001 --module s21crm.wsgi

4)安裝nginx

which nginx #找到nginx所在路徑
/usr/sbin/nginx #啓動nginx

5)配置nginx.conf

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
#項目工做目錄,絕對路徑,找到第一層
chdir           = /opt/s21crm
# Django's wsgi file
#指定wsgi.py文件路徑
module          = s21crm.wsgi
# the virtualenv (full path)
#指定虛擬解釋器的工做目錄
home            = /root/Envs/s21crm
# process-related settings
# master
#uswgi的主進程
master          = true
# maximum number of worker processes
#啓動uswgi的進程數
processes       = 5

#不適用nginx反向代理的時候,uwsgi經過http啓動一個web服務
#http=0.0.0.0:8888

#使用nginx反向代理,不能使用http協議,此時用socket一個鏈接啓動uwsgi


# the socket (use the full path to be safe
isocket          = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

6)修改settings.py文件

    加入如下信息
        #指定靜態文件存放路徑
        STATIC_ROOT='/opt/static'
        #指定靜態資源,請求入口
        STATIC_URL = '/static/'
        STATICFILES_DIRS=[
            os.path.join(BASE_DIR,"static"),
        ]

7)經過命令收集靜態文件資源

python3 manage.py collectstatic #收集全部你使用的靜態文件保存到STATIC_ROOT!

8)進入項目一級目錄,啓動服務

uwsgi --ini uwsgi.ini
相關文章
相關標籤/搜索