Quick Deployment Pythonアプリケーション:Nginx+uWSDi構成の詳細

8481 ワード

原文:
http://developer.51cto.com/art/201010/229615.htm
 
PHPに比べてPythonアプリケーションの導入が面倒で、fcgiとwsgiが一般的ですが、どちらも頭が痛いです.本文では,Pythonアプリケーションを迅速に導入するためのNginx+uwsgiの簡便な方法を紹介した.
AD:
PHPでは、最も便利なのはdeploymentで、phpファイルをPHPをサポートするパスに捨てて、そのパスにアクセスすれば使用できます.ホストにどれだけPHPアプリを追加しても、ディレクトリを変更すればあなたのことはありません.php-cgiの動作に全く関心を持つ必要はありません.deploymentは極めて便利です.
逆にPythonを見ると、部属は本当に頭が痛くて、よくある配置方法はあります.
◆fcgi:spawn-fcgiまたはフレームワークに付属のツールで各projectに対してそれぞれリスニングプロセスを生成し、httpサービスとインタラクティブにします.
◆wsgi:httpサービスを利用したmod_wsgiモジュールは各プロジェクトを走ります.
どちらも面倒くさい、apacheのmod_wsgiは構成が面倒で、メモリの占有量が大きいので、nginxを静的ページとするサーバを加えるともっと面倒になります.私のアプリケーションは基本的にその後まで各プロジェクトがそれぞれ戦い、管理上の混乱は言うまでもなく、負荷にも不利であり、空きプロジェクトや忙しいプロジェクトもメモリを消費する必要があります.
Pythonでphp-cgiのように同じポートを傍受し、統一管理と負荷バランスを取れたものがあれば、多くの導入手間を省くことができます.たまたまuWSDiを見て、あんなに簡単に配置ツールが統一されているとは知らなかった.uWSDiは、wsgiプロトコルでもfcgiプロトコルでもなく、uwsgiのプロトコルを独自に作成しました.このプロトコルはfcgiプロトコルの約10倍ほど速いと言われています.
uWSGI
uWSDIの主な特徴は以下の通りである.
◆超高速な性能.
◆低メモリ占有(実測ではapache 2の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.mod_の代わりにuwsgiを使うwsgi
Nginxの全体的な構成は長いが、ここでは多くは言わない.Nginxの基本的な構成が理解されていると仮定すると、uwsgiはこのような構成に似ている.

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

これは、すべてのurlを9090ポートに渡すuwsgiプロトコルプログラムがインタラクティブです.プロジェクトディレクトリにmyappを作成します.pyは、アプリケーションがフレームワークの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を実行し、モジュール名、すなわちさっき構成したmyappに続く

 
   
  1. uwsgi -s :9090 -w myapp

Webサイトを実行すると、デプロイが完了していることがわかります.
3.uwsgiのパラメータ
以上は単一プロジェクトの最も簡単な導入であり、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

メモリ領域128 Mの制限:

 
   
  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に複数のサイトを構成する
複数のサイトが1つの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

次に、1つ以上のappデータム環境を設定します.

 
   
  1. virtualenv /var/www/myenv

この環境でインストールされているソフトウェアは、この環境でのみ有効です.

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

最後にnginxを構成し、各サイトが1つのserverを単独で占有しなければならないことに注意します.同じserverで異なるlocationが異なるアプリケーションに指向するのはなぜか失敗し、推定もバグです.

 
   
  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サービスを再起動すると、2つのサイトが1つの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.     } 
  18. }

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.     } 
  14. }

それでhttp://lbforum.django.obmem.infoフォーラムプログラムです.
後記
わずか数行しか書かれていませんが、構成時にはuwsgiの苦労をなめ尽くしました.当然のことながら使い方が全く成り立たないと思います.-no-siteパラメータを加えると、LBForumはどうしても配置できません.最初はマルチサイト共通uwsgiはどうしても成功しませんでした.
Pythonの世界はとても面白くて、ずっと面白いものを発見して、しかしPythonの世界もとても人を振り回して、大部分のものはdevバージョンで、ドキュメントが欠けて、各種の互換性の問題です.
原文住所:http://obmem.info/?p=703
uwsgi公式サイト:http://projects.unbit.it/uwsgi/