快速部署Python應用:Nginx+uWSGI配置詳解

來源:互聯網
上載者:User

標籤:

快速部署Python應用:Nginx+uWSGI配置詳解

相比於PHP,Python應用的部署很麻煩,比較常用的方法有fcgi與wsgi,然而這兩種都很讓人頭痛。文章介紹了Nginx+uwsgi的簡便方法,來快速的部署Python應用。

AD:

在PHP裡,最方便的就是deployment了,只要把php檔案丟到支援PHP的路徑裡面,然後訪問那個路徑就能使用了;無論給主機添加多少PHP應用,只要把目錄改好就沒你的事了,完全不用關心php-cgi運行得如何,deployment極為方便。

反觀Python,部屬起來真是頭痛,常見的部署方法有:

◆fcgi:用spawn-fcgi或者架構內建的工具對各個project分別產生監聽進程,然後和http服務互動。

◆wsgi:利用http服務的mod_wsgi模組來跑各個project。

無論哪種都很麻煩,apache的mod_wsgi配置起來很麻煩,記憶體佔用還大,如果要加上nginx作為靜態頁面的伺服器那就更麻煩了;我的應 用基本上到後來都是是各個project各自為戰,且不說管理上的混亂,這樣對負載也是不利的,閒置project和繁忙的project同樣需要佔用 記憶體。

如果Python中能有個什麼東西像php-cgi一樣監聽同一連接埠,進行統一管理和Server Load Balancer,那真是能省下大量的部署功夫。偶然看到了 uWSGI,才發現居然一直不知道有那麼方便地統一部署工具。uWSGI,既不用wsgi協議也不用fcgi協議,而是自創了一個uwsgi的協議,據說 該協議大約是fcgi協議的10倍那麼快,有個比較見:

uWSGI的主要特點如下:

◆超快的效能。

◆低記憶體佔用(實測為apache2的mod_wsgi的一半左右)。

◆多app管理。

◆詳盡的日誌功能(可以用來分析app效能和瓶頸)。

◆高度可定製(記憶體大小限制,服務一定次數後重啟等)。

正式開工

uwsgi的文檔雖然很多也很詳細,這裡是uwsgi的官方文檔:http://projects.unbit.it/uwsgi/wiki/Doc。

1.安裝uwsgi

ubuntu有uwsgi的ppa:

  1. add-apt-repository ppa:stevecrozz/ppa  
  2. apt-get update  
  3. apt-get install uwsgi 

2. 用uwsgi代替mod_wsgi

Nginx的整體配置說來話長,這裡不再多說,假設已經明白Nginx的基本配置,那麼uwsgi就類似這麼配置:

  1. location / {  
  2.   include uwsgi_params  
  3.   uwsgi_pass 127.0.0.1:9090  

這就是把所有url傳給9090連接埠的uwsgi協議程式來互動。再到project目錄建立myapp.py,使得application調用架構的wsgi介面,比如web.py就是:

  1. ......  
  2. app = web.application(urls, globals())  
  3. appapplication = app.wsgifunc() 

再比如django就是:

  1. .......  
  2. from django.core.handlers.wsgi import WSGIHandler  
  3. application = WSGIHandler() 

然後運行uwsgi監聽9090,其中-w後跟模組名,也就是剛才配置的myapp

  1. uwsgi -s :9090 -w myapp 

運行網站發現已經部署完成了。

3.uwsgi的參數

以上是單個project的最簡單化部署,uwsgi還是有很多令人稱讚的功能的,例如:

並發4個線程:

  1. uwsgi -s :9090 -w myapp -p 4 

主控制線程+4個線程:

  1. uwsgi -s :9090 -w myapp -M -p 4 

執行超過30秒的client直接放棄:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 

限制記憶體空間128M:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 

服務超過10000個req自動respawn:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 

後台運行等:

  1. uwsgi -s :9090 -w myapp -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log 

4.為uwsgi配置多個網站

為了讓多個網站共用一個uwsgi服務,必須把uwsgi運行成虛擬網站:去掉“-w myapp”加上”–vhost”:

  1. uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost 

然後必須配置virtualenv,virtualenv是Python的一個很有用的虛擬環境工具,這樣安裝:

  1. apt-get install Python-setuptools  
  2. easy_install virtualenv 

然後設定一個/多個app基準環境:

  1. virtualenv /var/www/myenv 

應用環境,在此環境下安裝的軟體僅在此環境下有效:

  1. source /var/www/myenv/bin/activate  
  2. pip install django  
  3. pip install mako  
  4. ... 

最後配置nginx,注意每個網站必須單獨佔用一個server,同一server不同location定向到不同的應用不知為何總是失敗,估計也算是一個bug。

  1. server {  
  2.         listen       80;  
  3.         server_name  app1.mydomain.com;  
  4.         location / {  
  5.                 include uwsgi_params;  
  6.                 uwsgi_pass 127.0.0.1:9090;  
  7.                 uwsgi_param UWSGI_PYHOME /var/www/myenv;  
  8.                 uwsgi_param UWSGI_SCRIPT myapp1;  
  9.                 uwsgi_param UWSGI_CHDIR /var/www/myappdir1;  
  10.         }  
  11.     }  
  12.     server {  
  13.         listen       80;  
  14.         server_name  app2.mydomain.com;  
  15.         location / {  
  16.                 include uwsgi_params;  
  17.                 uwsgi_pass 127.0.0.1:9090;  
  18.                 uwsgi_param UWSGI_PYHOME /var/www/myenv;  
  19.                 uwsgi_param UWSGI_SCRIPT myapp2;  
  20.                 uwsgi_param UWSGI_CHDIR /var/www/myappdir2;  
  21.         }  
  22.     } 

這樣,重啟nginx服務,兩個網站就可以共用一個uwsgi服務了。

5.實戰應用

最初的設定完畢以後,再添加的應用,只需要在Nginx裡面進行少量修改,無需重啟uwsgi,就能立刻部署完畢。uwsgi內建了基於django的監控uwsgi運行狀態的工具,就拿它來部署好了:

  1. server {  
  2.     listen 80;  
  3.     root   /var/www/django1.23;  
  4.     index  index.html index.htm;  
  5.     server_name uwsgiadmin.django.obmem.info;  
  6.     access_log  /var/log/nginx/django.access.log;  
  7.     location /media/ {  
  8.         root /var/www/django1.23/adminmedia;  
  9.         rewrite ^/media/(.*)$ /$1 break;  
  10.     }  
  11.     location / {  
  12.         include uwsgi_params;  
  13.         uwsgi_pass 127.0.0.1:9090;  
  14.         uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;  
  15.         uwsgi_param UWSGI_CHDIR /var/www/django1.23/uwsgiadmin;  
  16.         uwsgi_param UWSGI_SCRIPT uwsgiadmin_wsgi;  
  17.     }  

於是uwsgi的監控資訊可以在http://uwsgiadmin.django.obmem.info看到(使用者名稱密碼都是admin)。再比如LBForum論壇程式的部署:根據安裝說明安裝完畢,再按部署說明修改完設定檔,然後只需修改nginx設定檔:

  1. server {  
  2.     listen 80;  
  3.     root   /var/www/django1.23;  
  4.     index  index.html index.htm;  
  5.     server_name lbforum.django.obmem.info;  
  6.     access_log  /var/log/nginx/django.access.log;  
  7.     location / {  
  8.         include uwsgi_params;  
  9.         uwsgi_pass 127.0.0.1:9090;  
  10.         uwsgi_param UWSGI_PYHOME /var/www/django1.23/vtenv;  
  11.         uwsgi_param UWSGI_CHDIR /var/www/django1.23/LBForum/sites/default;  
  12.         uwsgi_param UWSGI_SCRIPT lbforum_wsgi;  
  13.     }  

於是http://lbforum.django.obmem.info就是論壇程式了。

後記

雖然寫出來寥寥幾行,配置的時候我可吃盡了uwsgi的苦頭,有些想當然的用法完全不能成立,–no-site參數一加上去其他都好使LBForum怎麼都部署不了,一開始多網站公用uwsgi怎麼都成功不了等等。

Python世界很有趣,一直會發現有趣的東西,但是Python世界也很折騰人,大部分東西都是dev版本,文檔缺失,各種相容問題。

原文地址:http://obmem.info/?p=703

uwsgi官網:http://projects.unbit.it/uwsgi/

快速部署Python應用:Nginx+uWSGI配置詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.