日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

uwsgi+nginx部署django项目(有图原理的详细展示的)

發布時間:2024/9/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uwsgi+nginx部署django项目(有图原理的详细展示的) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

??????1.1 現實世界的web請求:

  1.2? wsgi協議,uwsgi協議和uWSGI

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

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

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

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

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

2. web請求流程

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

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

  3,uWSGI 將接收到的包進行處理,并轉發給wsgi, wsgi根據請求調用django工程的某個文件或函數,處理完后django將返回值交給wsgi,wsgi將返回值進  ???? 行打包,轉發給uWSGI, uWSGI接收后轉發給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了)

  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 onlisten 8008;# the domain name it will serve for# substitute your machine‘s IP address or FQDN# Django 的 settings.py 文件中的 ALLOWED_HOSTS 要加上這里設置的 server_nameserver_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 logsaccess_log /var/log/nginx/ocean_monitor_access.log;error_log /var/log/nginx/ocean_monitor_error.log;# max upload sizeclient_max_body_size 8M; # adjust to taste# Django medialocation /media {# your Django project‘s media files - amend as requiredalias /home/python/ocean_monitor/media; }location /static {# your Django project‘s static files - amend as requiredalias /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_ROOTSTATIC_ROOT 是在部署靜態文件時(pyhtonmanage.pycollectstatic)所有的靜態文靜聚合的目錄,STATIC_ROOT要寫成絕對地址,在這里,比如我的項目mysite是/home/mysite/那么STATIC_ROOT 為 /home/mysite/collect_static/當部署項目時,在終端輸入: ? 1python manage.py collectstaticdjango會把所有的static文件都復制到STATIC_ROOT文件夾下2.STATICFILES_DIRSSTATIC_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來讓瀏覽器可以直接訪問靜態文件,比如: ? 1STATIC_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”必須要和上面寫的density.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

參考:https://blog.csdn.net/c465869935/article/details/53242126

  https://www.cnblogs.com/restran/p/4412708.html

  https://www.cnblogs.com/simplezy/p/6705340.html

來源:http://www.mamicode.com/info-detail-2611327.html

總結

以上是生活随笔為你收集整理的uwsgi+nginx部署django项目(有图原理的详细展示的)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。