1. 程式人生 > >了解django部署(Django + Uwsgi + Nginx)

了解django部署(Django + Uwsgi + Nginx)

tar.gz reload roo middle 信息 系統管理員 解壓縮 ESS width

首先了解下基本概念:

  1 WSGI

  WSGI:全稱是Web Server Gateway Interface,是python應用程序或者框架和web服務器之間的一種接口,被廣泛接受。WSGI不是服務器,python模塊,框架,api或者任何軟件,它更像是一種規範。描述web server如何和web application通信的規範。要實現WSGI協議,必須同時實現web server和web application,當前運行在WSGI協議上的web框架有django和flask。

  WSGI主要包括server和application兩部分,server負責從客戶端接收請求,將request轉發給application,將application返回的response返回給客戶端。application負責接收server轉發的request,處理請求,並將處理結構返回給server。application中可以包括多個棧式的中間件(middlewares),這些中間件需要同時實現server與application,因此可以在WSGI服務器與WSGI應用之間起調節作用:對服務器來說,中間件扮演應用程序,對應用程序來說,中間件扮演服務器。

  2 uwsgi

  uwsgi:與WSGI同樣是一種通信協議,是uWSGI服務器的獨占協議,用於定義傳輸信息的類型,規定了怎麽把請求轉發給應用程序和返回。每一個uwsgi packet的前4byte為傳輸信息的描述,與WSGI協議是兩種協議。

  3 uWSGI

  uWSGI:是一個web服務器,實現了WSGI協議,uwsgi,http協議等。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進交互。

  4 Nginx

  Nginx:Nginx是一款高性能的web和反向代理服務器。

  正向代理:瀏覽器主動請求代理服務器,代理服務器轉發請求到對應的目標服務器。

  反向代理:部署在web服務器上,代理所有外部網絡對內部網絡的訪問,瀏覽器訪問服務器,必須經過這個代理,是被動的。

  正向代理的主動方是客戶端,反向代理的主動方是服務器。

了解了基本概念就可以開始部署:

  1 服務器環境配置

  • 在本地的虛擬環境中,項目根目錄下,執行命令收集所有包
  pip freeze > plist.txt
  • 通過ftp軟件將開發好的項目上傳到此服務器的某個目錄
  • 安裝並創建虛擬環境,如果已有則跳過此步
  sudo apt-get install python-virtualenv
  sudo easy_install virtualenvwrapper
  mkvirtualenv [虛擬環境名稱]
  • 在虛擬環境上工作,安裝所有需要的包
  workon [虛擬環境名稱]
  pip install -r plist.txt
  • 更改settings.py文件
  DEBUG = False
  ALLOW_HOSTS=[‘*‘,]表示可以訪問服務器的ip
  • 啟動服務器,運行正常,但是靜態文件無法加載

  2 uWSGI

  • uWSGI實現了WSGI的所有接口,是一個快速、自我修復、開發人員和系統管理員友好的服務器
  • uWSGI代碼完全用C編寫
  • 安裝uWSGI
  pip install uwsgi
  • 配置uWSGI,在項目中新建文件uwsgi.ini,編寫如下配置
  [uwsgi]
  socket=外網ip:端口(使用nginx連接時,使用socket)
  http=外網ip:端口(直接做web服務器,使用http)
  chdir=項目根目錄
  wsgi-file=項目中wsgi.py文件的目錄,相對於項目根目錄
  processes=4
  threads=2
  master=True
  pidfile=uwsgi.pid
  daemonize=uswgi.log
  • 啟動:uwsgi --ini uwsgi.ini
  • 停止:uwsgi --stop uwsgi.pid
  • 重啟:uwsgi --reload uwsgi.pid
  • 使用http協議查看網站運行情況,運行正常,但是靜態文件無法加載

  3 Nginx 

  • 使用nginx的作用實現構架:客戶端請求nginx,再由nginx請求uwsgi,運行django框架下的python代碼
    • 負載均衡:多臺服務器輪流處理請求
    • 反射代理:隱藏真實服務器
  • nginx+uwsgi也可以用於其它框架的python web代碼,不限於django
  • 到官網下載nginx壓縮文件或通過命令安裝
  sudo apt-get nginx
  • 這裏以下載壓縮文件為例演示
  解壓縮:
  tar zxvf nginx-1.6.3.tar.gz

  進入nginx-1.6.3目錄依次執行如下命令進行安裝:
  ./configure
  make
  sudo make install
  • 默認安裝到/usr/local/nginx目錄,進入此目錄執行命令
  • 查看版本:sudo sbin/nginx -v
  • 啟動:sudo sbin/nginx
  • 停止:sudo sbin/nginx -s stop
  • 重啟:sudo sbin/nginx -s reload
  • 通過瀏覽器查看nginx運行結果
  • 指向uwsgi項目:編輯conf/nginx.conf文件
  sudo conf/nginx.conf

  在server下添加新的location項,指向uwsgi的ip與端口
  location / {
      include uwsgi_params;將所有的參數轉到uwsgi下
      uwsgi_pass uwsgi的ip與端口;
  }
  • 修改uwsgi.ini文件,啟動socket,禁用http
  • 重啟nginx、uwsgi
  • 在瀏覽器中查看項目,發現靜態文件加載不正常,接下來解決靜態文件的問題

  4 靜態文件

  • 靜態文件一直都找不到,現在終於可以解決了
  • 所有的靜態文件都會由nginx處理,不會將請求轉到uwsgi
  • 配置nginx的靜態項,打開conf/nginx.conf文件,找到server,添加新location
  location /static {
      alias /var/www/test5/static/;
  }
  • 在服務器上創建目錄結構“/var/www/test5/”
  • 修改目錄權限
  sudo chmod 777 /var/www/test5
  • 創建static目錄,註意順序是先分配權限,再創建目錄
  mkdir static
  • 最終目錄結構如下圖:
  • 技術分享圖片
  • 修改settings.py文件
  STATIC_ROOT=‘/var/www/test5/static/‘
  STATIC_URL=‘/static/‘
  • 收集所有靜態文件到static_root指定目錄:python manage.py collectstatic
  • 重啟nginx、uwsgi

總結:

  一張圖也許可以更好的看清他們之間的關系

技術分享圖片

  USER和Nginx之間的通過http通信,Nginx和uWSGI之間通過uwsgi通信,uWSGI和框架和應用之間通過WSGi協議通信。

tornado和django的部署是不同的,下次有時間整理。

了解django部署(Django + Uwsgi + Nginx)