uwsgi+nginx部署django項目

1. 概念解析(wsgi協議,uwsgi協議,uWSGI)javascript

  參考:https://www.cnblogs.com/wspblog/p/8575101.html css

      1.1 現實世界的web請求:html

  1.2  wsgi協議,uwsgi協議和uWSGIjava

     a. WSGI(wsgi): 全稱 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是爲 Python 語言定義的 Web 服務器和 Web 應用程序或框架之間的一種簡單而通用的接口。從名字就能夠看出來,這東西是一個Gateway,也就是網關。網關的做用就是在協議之間進行轉換。python

    總結:WSGI(wsgi)只是一種規範,描述web server如何與web application通訊的規範mysql

    b. uWSGI: uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。jquery

    c. uwsgi: 與WSGI同樣是一種通訊協議,但與WSGI協議是兩種東西,uwsgi協議是uWSGI服務器的獨佔協議,用於定義傳輸信息的類型(type of                                    information),每個uwsgi packet前4byte爲傳輸信息類型的描述.
nginx

    下圖簡單描述在web請求過程當中三者的位置:  git

2. web請求流程github

  1,首先客戶端請求服務資源,

     2,nginx做爲直接對外的服務接口,接收到客戶端發送過來的http請求,會解包、分析,若是是靜態文件請求就根據nginx配置的靜態文件目錄,返回請求的資      源,若是是動態的請求,nginx就經過配置文件,將請求傳遞給uWSGI;

  3,uWSGI 將接收到的包進行處理,並轉發給wsgi, wsgi根據請求調用django工程的某個文件或函數,處理完後django將返回值交給wsgi,wsgi將返回值進行打包,轉發給uWSGI, uWSGI接收後轉發給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)。

    *注:不一樣的組件之間傳遞信息涉及到數據格式和協議的轉換

  整個流程以下圖所示:

  nginx的做用:
    1. 第一級的nginx並非必須的,uwsgi徹底能夠完成整個的和瀏覽器交互的流程;
    2. 在nginx上加上安全性或其餘的限制,能夠達到保護程序的做用;
    3. uWSGI自己是內網接口,開啓多個work和processes可能也不夠用,而nginx能夠代理多臺uWSGI完成uWSGI的負載均衡;
    4. django在debug=False下對靜態文件的處理能力不是很好,而用nginx來處理更加高效。

3. 部署環境及準備

    購買服務器(國外谷歌雲,亞馬遜aws;國內阿里雲,騰訊雲等),需安裝:python,django,uwsgi、nginx、libmysqld-dev、mysql-server;

  3.1. 安裝和測試uWSGI  

安裝
sudo pip install uwsgi

測試:
新建test.py,內容以下

#/usr/bin/python
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

運行 uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
瀏覽器訪問 http://127.0.0.1:8000   頁面出現Hello World,則安裝成功

(問題:若8000端口被佔用,換其餘端口; uwsgi找不到命令,創建軟鏈接 sudo ln -s /your-python-dir/bin/uwsgi /usr/bin/uwsgi)

  3.2  安裝和測試nginx

    安裝:sudo yum install nginx

    啓動:sudo nginx         (ps -aux| grep nginx 查看nginx進程)

    測試:瀏覽器訪問http://127.0.0.1:80 (命令行 curl http://127.0.0.1:80),返回nginx則運行正常

    其餘nigix命令:

      啓動:nginx  

      退出或重啓:nginx -s stop(quit, reload)

      命令幫助: nginx -h

            驗證配置文件 nginx -t

   3.3 創建django 項目和測試

    建立項目:django-admin.py startproject notebook  (找不到命令時 :/usr/local/python-3.5.2/bin/django-admin.py startproject notebook)

    建立app:python manage.py startapp planlist          (並在settings.py文件的INSTALLED_APPS中添加planlist.apps.PlanlistConfig)

    運行測試: python manage.py runserver 127.0.0.1:8000   (瀏覽器打開http://127.0.0.1:8000, 出現django頁面,項目建立成功) 

      3.4 uWSGI運行django項目測試

    關閉上述django項目後,運行命令:uwsgi --http :8000 --module notebook.wsgi   

      (notebook爲django項目名稱,建立django項目時notebook文件夾下自動建立wsgi.py文件)

    測試:在瀏覽器訪問http://127.0.0.1:8000,出現django頁面,表示web-client <-> uWSGI <-> Django 是連通的。(就剩下nginx了)

    (注意:1. --http和 :8000之間有空格,不然會報錯unrecognized ...

       2. 在項目根目錄下運行上述命令,即notebook項目文件夾下,不然報錯import error notebook.wsgi)

  3.5 nginx配置和測試

    找到nginx默認的配置文件路徑:/etc/nginx/nginx.conf( 經過命令能夠查看:sudo nginx -t),確保nginx.conf的同目錄下有uwsgi_params文件(/etc/nginx/uwsgi_params),沒有的話根據連接獲取。

    在django項目目錄下,建立單獨的nginx配置文件notebook.conf (notebook/notebook/notebook.conf),將nginx.conf的內容複製到notebook.conf,將其中的server部分所有替換成下面:

 
 

server {
        listen       80;
        server_name  localhost;
        charset       utf-8;
        access_log    /home/gCloud/djangoProject/notebook/notebook/nginx_access.log;
        error_log    /home/gCloud/djangoProject/notebook/notebook/nginx_error.log;
        client_max_body_size    75M;

        # Load configuration files for the default server block.

        location /static {
                alias /home/gCloud/djangoProject/notebook/collect_static;
        }

        location / {
                include /etc/nginx/uwsgi_params;
                uwsgi_pass 127.0.0.1:9090;
    }

}

     其中的 listen 80表明服務器開放80端口;

  access_log 和error_log是定義nginx訪問日誌和錯誤日誌的存放路徑。

  location [目錄名]表明項目路徑的引導;
    「location /static」中的」/static」是本身定義的項目引用靜態文件時,瀏覽器中顯示的靜態資源所在的根目錄名;這樣的話,用戶在瀏覽器中查看到的全部      image,css或js資源都是處在http://127.0.0.1/static下的。(django靜態文件的絕對路徑是根據本身的實際狀況來肯定的,通常在本身的django的app/static目錄下,或本身python manage.py collectstatic後的路徑下。)

  若是還有media文件之類的靜態目錄,仿照static的寫法,本身補充。

  「location /」是指訪問項目根目錄時,nginx要作的事。其中須要指定 uwsgi_params文件的絕對路徑,上面已經提到了;

  127.0.0.1:9090是指uWSGI綁定的監聽地址,這裏使用了9090端口。

  nginx配置參考及含義:

# ocean_monitor.conf

# the upstream component nginx needs to connect to
upstream django_ocean_monitor {
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    # for a web port socket (we'll use this first)
    server 127.0.0.1:8108;
}

# configuration of the server
server {
    # the port your site will be served on
    listen      8008;
    # the domain name it will serve for
    # substitute your machine's IP address or FQDN
    # Django 的 settings.py 文件中的 ALLOWED_HOSTS 要加上這裏設置的 server_name
    server_name localhost;
    charset     utf-8;

    gzip on;
    gzip_min_length 1000;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 3;
    gzip_vary on;
    # 禁用對 IE 6 使用 gzip 壓縮
    gzip_disable "MSIE [1-6]\.";
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml application/xml+rss application/json;

    ## Individual nginx logs
    access_log  /var/log/nginx/ocean_monitor_access.log;
    error_log   /var/log/nginx/ocean_monitor_error.log;

    # max upload size
    client_max_body_size 8M;   # adjust to taste

    # Django media
    location /media  {
        # your Django project's media files - amend as required
        alias /home/python/ocean_monitor/media;  
    }

    location /static {
        # your Django project's static files - amend as required
        alias /home/python/ocean_monitor/static; 
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django_ocean_monitor;
        # the uwsgi_params file you installed
        #  增長 nginx 配置, uwsgi_params 文件在 /etc/nginx/ 目錄下
        include     /etc/nginx/uwsgi_params; 
    }
}
nginx配置參考 

   3.6 django配置

      3.6.1靜態文件

      在settings.py文件中設置:

        STATIC_URL = '/static/'

        STATIC_ROOT = os.path.join(BASE_DIR,'collect_static')

      運行命令:python manage.py collectstatic    (全部靜態文件會儲存到collect_static文件夾中)

      關於STATIC_ROOT和STATIC_URL及STATICFILES_DIRS做用和區別,參見下面

本文主要給你們介紹關於Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS的相關內容,分享出來供你們參考學習,下面話很少說了,來一塊兒看看詳細的介紹吧。

詳細以下:

首先,咱們配置靜態文件,要在setting.py裏面加入以下幾行代碼:

settings.py    
# the settings above
# STATIC SETTINGS
STATIC_URL = '/static/'
# BASE_DIR 是項目的絕對地址
STATIC_ROOT = os.path.join(BASE_DIR, 'collect_static')
#如下不是必須的
STATICFILES_DIRS = (
 os.path.join(BASE_DIR, 'common_static'),
)

1.STATIC_ROOT

STATIC_ROOT 是在部署靜態文件時(pyhtonmanage.pycollectstatic)全部的靜態文靜聚合的目錄,STATIC_ROOT要寫成絕對地址,在這裏,好比個人項目mysite是/home/mysite/

那麼STATIC_ROOT 爲 /home/mysite/collect_static/

當部署項目時,在終端輸入:
?
1
    
python manage.py collectstatic

django會把全部的static文件都複製到STATIC_ROOT文件夾下

2.STATICFILES_DIRS

STATIC_ROOT 是在部署的時候才發揮做用, 而實際狀況下,靜態文件的通常安放位置有兩種:

1.一種就是在每一個app裏面新建一個static文件夾,將靜態文件放到裏面,在加載靜態文件時,好比要在模板中用到靜態文件,django會自動在每一個app裏面搜索static文件夾(因此,不要把文件夾的名字寫錯哦, 不然django就找不到你的文件夾了)

2.另外一種,就是在全部的app文件外面,創建一個公共的文件夾, 由於有些靜態文件不是某個app獨有的,那麼就能夠把它放到一個公共文件夾裏面,方便管理(注意,創建一個公共的靜態文件的文件夾只是一種易於管理的作法,可是不是必須的,app是能夠跨app應用靜態文件的,由於最後全部的靜態文件都會在STATIC_ROOT裏面存在)

那如今的問題是如何讓django知道你把一些靜態文件放到app之外的公共文件夾中呢,那就須要配置STATICFILES_DIRS了
    
STATICFILES_DIRS = (
 os.path.join(BASE_DIR, 'common_static'),
)

STATICFILES_DIRS告訴django,首先到STATICFILES_DIRS裏面尋找靜態文件,其次再到各個app的static文件夾裏面找(注意, django查找靜態文件是惰性查找,查找到第一個,就中止查找了)

3.STATIC_URL

那麼到此爲止,靜態文件的機制就能夠運做了,可是有一個問題,我能不能經過url直接訪問我在項目中的靜態文件呢,答案確定是啦,可是,注意,你是在瀏覽器是訪問,你不可能輸入你的靜態文件的本地絕對地址吧,好比個人一種圖片的本地地址

爲 /home/mysite/common_static/myapp/photo.png

那麼別人不可能在瀏覽器上直接輸入:

http://192.168.1.2:8000/home/mysite/common_static/myapp/photo.png

這樣子,瀏覽器會報錯, 沒有該頁面

那麼django是如何讓瀏覽器也能夠訪問服務器上的靜態文件呢,前面已經說了,直接訪問服務器本地的地址是不行的,那就須要一個映射,django利用STATIC_URL來讓瀏覽器能夠直接訪問靜態文件,好比:
?
1
    
STATIC_URL = '/static/'

那麼能夠在瀏覽器上輸入:

http://192.168.1.2:8000/static/common_static/myapp/photo.png

那麼就至關與訪問/home/mysite/common_static/myap/photo.png

因此在瀏覽器上,利用前綴 STATIC_URL的具體內容,來映射STATIC_ROOT,
HTTP://192.168.1.2:8000/static 至關於 本地地址的STATIC_ROOT

總結

以上就是這篇文章的所有內容了,但願本文的內容對你們的學習或者工做具備必定的參考學習價值,若是有疑問你們能夠留言交流,謝謝你們對腳本之家的支持。
STATIC_ROOT和STATIC_URL及STATICFILES_DIRS

     3.6.2 ALLOWED_HOSTS和DEBUG設置     

       修改settings.py文件中的ALLOWED_HOSTS和DEBUG (https://www.cnblogs.com/restran/p/4412708.html)

DEBUG = False #關閉debug模式

ALLOWED_HOSTS = [
    # 加上本機的IP地址
    '192.168.137.146',
    '127.0.0.1', 
    'localhost'
]

#或者設置
#ALLOWED_HOSTS = ['*']

  3.7 uWSGI配置   (官方文檔:https://uwsgi-docs.readthedocs.io/en/latest/Management.html#signals-for-controlling-uwsgi)

    在項目目錄下建立配置文件uwsgi.ini,內容以下:

[uwsgi] 
socket = 127.0.0.1:9090 
chdir=/home/gCloud/djangoProject/notebook 
module=notebook.wsgi 
master = true         
processes=2 
threads=2 
max-requests=2000 
chmod-socket=664 
vacuum=true 
daemonize =/home/gCloud/djangoProject/notebook/uwsgi.log
pidfile=%(chdir)/uwsgi.pid

    其中的socket字段值」127.0.0.1:9090」必需要和上面寫的notebook.conf配置文件中的uWSGI監聽地址徹底同樣;
    chdir指本身工程的絕對路徑;
    module指的是wsgi.py在本身工程中的相對路徑,」.」指代一層目錄;個人django工程的wsgi.py文件是在」/home/gCloud/djangoProject/notebook/notebook /wsgi.py」,因此寫notebook.wsgi;
    daemonize指定uWSGI日誌的存儲路徑

    pidfile設置後,經過下面--ini命令啓動uwsgi時,會在該目錄下自動建立uwsgi.pid文件,裏面存儲了uwsgi的pid號(進程號)

    uwsgi配置參考及含義:

# uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /home/python/ocean_monitor
# Django's wsgi file
wsgi-file       = /home/python/ocean_monitor/ocean_monitor/wsgi.py
# module       = index.wsgi:application
# the virtualenv (full path)
# home            = /path/to/virtualenv
daemonize   = /home/python/ocean_monitor/ocean_monitor.log
# process-related settings
# master
master          = true
pidfile     = /tmp/ocean_monitor_master.pid
# maximum number of worker processes
processes       = 3
# the socket (use the full path to be safe
# socket          = /home/python/ocean_monitor/ocean_monitor.sock
socket          = 127.0.0.1:8108
# ... with appropriate permissions - may be needed
chmod-socket    = 664
# clear environment on exit
vacuum          = true
uwsgi配置參考

  3.8 啓動uWSGI

    sudo uwsgi --ini /home/gCloud/djangoProject/notebook/uwsgi.ini

    其餘命令:

      中止uwsgi服務器:sudo uwsgi --stop /home/gCloud/djangoProject/notebook/uwsgi.pid

      重啓:sudo uwsgi --reload /home/gCloud/djangoProject/notebook/uwsgi.pid

      (若是出現錯誤 signal_pidfile()/kill(): No such process [core/uwsgi.c line 1627],是因爲uwsgi.pid中進程pid號不正確,經過命令 ps -aux | grep uwsgi 查看進程pid號,修改uwsgi.pid文件爲該pid號便可)

  3.9 啓動 nginx

    sudo nginx -c /home/gCloud/djangoProject/notebook/notebook/notebook.conf 

    (注意若nginx正在運行,先關閉:sudo nginx -s stop)

  最後打開瀏覽器輸入 http://127.0.0.1,就能訪問django項目的網頁了,每次修改django項目文件的代碼須要重啓uwsgi和nginx才生效。

   3.10 相關的文件路徑梳理

    django項目路徑: /home/gCloud/djangoProject/notebook  (項目名爲notebook)

    工程靜態文件路徑:  /home/gCloud/djangoProject/notebook/collect_static

    wsgi.py的路徑:  /home/gCloud/djangoProject/notebook/notebook/wsgi.py

    uwsgi.ini的路徑: /home/gCloud/djangoProject/notebook/uwsgi.ini

    uwsgi日誌路徑: /home/gCloud/djangoProject/notebook/uwsgi.log

    uwsgi.pid路徑:/home/gCloud/djangoProject/notebook/uwsgi.pid

    nginx配置文件notebook.conf的路徑: /home/gCloud/djangoProject/notebook/notebook/notebook.conf

    uwsgi_params的路徑: /etc/nginx/uwsgi_params

    nginx訪問日誌路徑:/home/gCloud/djangoProject/notebook/notebook/nginx_access.log

    nginx錯誤日誌路徑: /home/gCloud/djangoProject/notebook/notebook/nginx_error.log

    項目路徑完整顯示以下:

[gCloud@instance-1 notebook]$ ls -R
.:
collect_static  db.sqlite3  manage.py  notebook  planlist  templates  uwsgi.ini  uwsgi.log  uwsgi.pid

./collect_static:
admin

./collect_static/admin:
css  fonts  img  js

./collect_static/admin/css:
base.css  changelists.css  dashboard.css  fonts.css  forms.css  login.css  rtl.css  widgets.css

./collect_static/admin/fonts:
LICENSE.txt  README.txt  Roboto-Bold-webfont.woff  Roboto-Light-webfont.woff  Roboto-Regular-webfont.woff

./collect_static/admin/img:
calendar-icons.svg  icon-calendar.svg    icon-no.svg           inline-delete.svg  selector-icons.svg
gis                 icon-changelink.svg  icon-unknown-alt.svg  LICENSE            sorting-icons.svg
icon-addlink.svg    icon-clock.svg       icon-unknown.svg      README.txt         tooltag-add.svg
icon-alert.svg      icon-deletelink.svg  icon-yes.svg          search.svg         tooltag-arrowright.svg

./collect_static/admin/img/gis:
move_vertex_off.svg  move_vertex_on.svg

./collect_static/admin/js:
actions.js      cancel.js        core.js         popup_response.js    SelectBox.js      vendor
actions.min.js  change_form.js   inlines.js      prepopulate_init.js  SelectFilter2.js
admin           collapse.js      inlines.min.js  prepopulate.js       timeparse.js
calendar.js     collapse.min.js  jquery.init.js  prepopulate.min.js   urlify.js

./collect_static/admin/js/admin:
DateTimeShortcuts.js  RelatedObjectLookups.js

./collect_static/admin/js/vendor:
jquery  xregexp

./collect_static/admin/js/vendor/jquery:
jquery.js  jquery.min.js  LICENSE-JQUERY.txt

./collect_static/admin/js/vendor/xregexp:
LICENSE-XREGEXP.txt  xregexp.js  xregexp.min.js

./notebook:
__init__.py  nginx_access.log  notebook.conf  settings.py  wsgi.py
mime.types   nginx_error.log   __pycache__    urls.py

./notebook/__pycache__:
__init__.cpython-35.pyc  settings.cpython-35.pyc  urls.cpython-35.pyc  wsgi.cpython-35.pyc

./planlist:
admin.py  apps.py  __init__.py  migrations  models.py  __pycache__  tests.py  views.py

./planlist/migrations:
__init__.py  __pycache__

./planlist/migrations/__pycache__:
__init__.cpython-35.pyc

./planlist/__pycache__:
admin.cpython-35.pyc  apps.cpython-35.pyc  __init__.cpython-35.pyc  models.cpython-35.pyc  views.cpython-35.pyc

./templates:
index.html
notebook
4. 管理進程

https://code.ziqiangxuetang.com/django/django-deploy-base.html

https://code.ziqiangxuetang.com/django/django-nginx-deploy.html

5.阿里雲部署

  1.遠程鏈接設置:https://www.jianshu.com/p/962ff16a951c

  2.部署:按上述配置好django,uwsgi,nginx,本地經過127.0.0.1能訪問網頁,表示配置成功。

  3.入站和出站規則設置(安全組):https://blog.csdn.net/A11085013/article/details/79486731

  設置完成後經過實例公網ip地址就能訪問網頁(公網ip地址在django的allowed_host,nginx的端口80加入了入站規則)

參考:https://blog.csdn.net/c465869935/article/details/53242126
  https://www.cnblogs.com/restran/p/4412708.html
  https://www.cnblogs.com/simplezy/p/6705340.html
相關文章
相關標籤/搜索