序章


Python Webアプリケーションの開発を最初に開始するとき、特に別の言語を使用している場合やデスクトップ(GUI)アプリケーションのバックグラウンドを持っている場合は、新しい作成物をオンラインにするプロセスで少し迷う可能性があります。

このDigitalOceanの記事では、 Pyramid の使用を開始し、さまざまなWebサーバーを使用してPython Webアプリケーションをデプロイする前の記事に続いて、Pyramid WSGI Webアプリケーションのパッケージ化、依存関係のリストの作成、およびデプロイについて説明します。それ(すなわち オンラインで公開)。

注:この記事の例は、使用例も示していますが、入門記事で使用されている命名規則に従います。 Pyramidを使用したWebアプリケーション開発の開始について質問がある場合、または単に以前に使用された名前に慣れたい場合は、こちらの記事を確認してください。

用語集


1.1。 ピラミッドの概要


  1. Webアプリケーションの展開
  2. WSGI
  3. リバースプロキシとしてのNginxの使用について

2.2。 ピラミッドベースのWSGIWebアプリケーションの展開


  1. システムの更新
  2. Python、pip、virtualenvのセットアップ
  3. 「app」オブジェクトを公開した単純なアプリケーションの準備
  4. .ini設定を使用した足場アプリケーションオブジェクトの公開
  5. pipを使用したアプリケーションの依存関係の処理
  6. アプリケーションの依存関係のリストを作成する
  7. アプリケーションの依存関係のリストからのダウンロード

3.3。 PythonWSGIWebアプリケーションサーバーのセットアップ


  1. CherryPyWebサーバーを使用したピラミッドアプリケーションの提供
  2. アプリケーションサーバーの実行と管理

4.4。 Nginxのセットアップ


  1. Nginxのインストール
  2. Nginxの構成

ピラミッドの概要


いくつかの重い対応物と比較して、Pyramidは軽量のPythonWebアプリケーションフレームワークの1つです。 ただし、Flaskやその他の「マイクロ」のものとは異なり、Pyramidにはまだ多くの機能が備わっています。

非常によく維持されている優れたプロジェクトであるPyramidは非常に人気があり、それに基づいてWebアプリケーションをデプロイするためのいくつかの異なる方法(Webサーバーとメソッド)があります。

Webアプリケーションの展開


すべてのPythonWSGIWebアプリケーションに関して、デプロイメントは、 application オブジェクトへの参照を含むWSGIモジュールの準備で構成されます。このオブジェクトは、Webサーバーが要求を渡すための入り口として使用されます。

WSGI


WSGIは、一言で言えば、Webサーバーとアプリケーション自体の間のインターフェイスです。 これは、さまざまなサーバーとアプリケーション(フレームワーク)間の標準化された方法が相互に連携し、必要に応じて互換性を確保できるようにするために存在します(例: 開発環境から本番環境への切り替え)、これは今日の必須のニーズです。

注: WSGIおよびPythonWebサーバーについて詳しく知りたい場合は、記事PythonベースのWebアプリケーション用のWebサーバーの比較を確認してください。

リバースプロキシとしてのNginxの使用について


Nginxは、非常に高性能なWebサーバー/(リバース)プロキシです。 軽量で、操作が比較的簡単で、拡張が簡単なため(アドオン/プラグインを使用)、人気を博しています。 そのアーキテクチャのおかげで、多くのリクエスト(実質的に無制限)を処理できます。これは、アプリケーションやWebサイトの負荷によっては、他の古い代替手段を使用して対処するのが非常に難しい場合があります。

覚えておいてください:接続を「処理する」とは、技術的には、接続を削除せず、何かでサービスを提供できることを意味します。 Nginxにエラーメッセージではないクライアントの応答を提供させるには、アプリケーションとデータベースが正常に機能している必要があります。

PythonWSGIWebアプリケーションサーバー


Python Webアプリケーションサーバーは、[通常]スタンドアロンのCベースのソリューション、または完全に(または部分的に)Pythonベースの(つまり、 純粋なPython)のもの。

これらは、前述のように、Webアプリケーションを contains して呼び出し可能なアプリケーションを含むPythonモジュールを受け入れて動作し、ネットワーク上でサービスを提供します。

それらのいくつかは直接使用できる高性能サーバーですが、上記の理由からNginxを前面で使用することをお勧めします(例: より高いパフォーマンス)。 同様に、通常Webアプリケーションフレームワークに付属している開発サーバーは、機能が不足しているため、本番環境での使用はお勧めしません。もちろん、いくつかの例外があります

人気のあるPythonWSGIWebサーバーは次のとおりです。

  • CherryPy

  • Gunicorn

  • uWSGI

  • ウェイトレス

ピラミッドベースのWSGIWebアプリケーションの展開


PythonのWSGIミドルウェア仕様のおかげで、プロトコル上で実行するように設定されているすべてのアプリケーションについて、Webアプリケーションサーバーに関して多くの選択肢があります。

要約:システムの更新


安定した展開サーバーを使用するには、最新の状態に保ち、適切に保守することが重要です。

デフォルトアプリケーションの最新バージョンを確実に入手するには、システムを更新する必要があります。

Debianベースのシステムの場合(つまり Ubuntu、Debian)、以下を実行します:

aptitude    update
aptitude -y upgrade

RHELベースのシステムの場合(つまり CentOS)、以下を実行します:

yum -y update

ヒント: CentOSを使用すると、 upgrade オペレーティングシステムをアップグレードすることを意味します。 updateただし、アプリケーションは更新されます。 Debian / Ubuntuでは、 update アプリケーションソースのリストを更新し、 upgrade それらを新しいバージョンにアップグレードします。

要約:Python、pip、virtualenvの設定


CentOS / RHELユーザーへの注意:

CentOS / RHEL は、デフォルトで、非常に無駄のないサーバーとして提供されます。 そのツールセットは、ニーズに合わせて古くなっている可能性がありますが、アプリケーションを実行するためではなく、サーバーのシステムツールに電力を供給するためにありません。 YUM)。

CentOSシステムを準備するには、Pythonをセットアップする必要があります(つまり、 ソースからコンパイル)およびpip / virtualenvは、そのインタープリターを使用してインストールする必要があります。

CentOS6.4および5.8でPython2.7.6および3.3.3をセットアップする方法、pipおよびvirtualenvについては、Python2.7.6および3.3をセットアップする方法を参照してください。 CentOSでは3。

UbuntuおよびDebianでは、使用できるPythonインタープリターの最新バージョンがデフォルトで提供されます。 インストールする追加パッケージの数は限られています。

  • python-dev –開発ツール

  • pip –パッケージを管理します

  • virtualenv –分離された仮想環境を作成します

python-dev:


python-devは、Pythonモジュールを構築するための拡張開発ツールを含むオペレーティングシステムレベルのパッケージです。

次のコマンドを実行して、aptitudeを使用してpython-devをインストールします。

aptitude install python-dev

ピップ:


pipは、必要なアプリケーションパッケージのインストールを支援するパッケージマネージャーです。

次のコマンドを実行してpipをインストールします。

curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py | python -
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python -
export PATH="/usr/local/bin:$PATH"

sudo権限が必要になる場合があります。

virtualenv:


Pythonアプリケーションを、そのすべての依存関係とともに独自の環境に含めるのが最善です。 環境は、(簡単に言えば)すべてが存在する孤立した場所(ディレクトリ)として最もよく説明できます。 この目的のために、virtualenvと呼ばれるツールが使用されます。

以下を実行して、pipを使用してvirtualenvをインストールします。

sudo pip install virtualenv

「app」オブジェクトを公開した単純なアプリケーションの準備


注:このセクションでは、前のチュートリアルからサンプルのシングルページアプリケーションをオンラインで入手することに焦点を当てています。

現在、シングルページアプリケーションがあります(つまり、 application.py)「Helloworld!」を提供するために構築されています Pyramidの開発サーバーを使用してポート8080で。

現在の作業ディレクトリは〜/ pyramid_sites /hello_worldにあります。

現在のPyramidアプリケーションの例(application.py)は次のようになります:

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('<h1>Hello world!</h1>')

if __name__ == '__main__':
    config = Configurator()
    config.add_view(hello_world)
    app = config.make_wsgi_app()
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

この例をWSGI呼び出し可能オブジェクトを含むモジュールに変えるために、次の変更を加えることができます。

from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response

def hello_world(request):
    return Response('<h1>Hello world!</h1>')

# Move the application object here.
# Create a configurator to make *wsgi app(lication)*
config = Configurator()
config.add_view(hello_world)

# The "app" object to be exposed
app = config.make_wsgi_app()

# If run directly, still construct a [development]
# server process and start serving on port #8080. 
if __name__ == '__main__':
    server = make_server('0.0.0.0', 8080, app)
    server.serve_forever()

修正後、CTRL + Xを押し、Yで確定して保存して終了します。

今後は、このファイルを、任意のPythonWSGIWebサーバーに呼び出し可能なアプリケーションを含むモジュールとして渡すことができます。

.ini設定を使用した足場アプリケーションオブジェクトの公開


または、Pyramidのスキャフォールディングを使用してより複雑なアプリケーションを作成した場合は、 wsgi.py Pyramidの「.ini」ファイルを使用してデプロイメント(または開発)構成をロードするアプリケーションを含めるため。

注:このファイルは、ルートアプリケーションフォルダー内に、一緒に存在する必要があります requirements.txt または.iniファイル。 アプリケーションをオブジェクトとして含めることで機能します。

注:このファイルには技術的に任意の名前(「 application.py を含む」)を選択できます。 でも、 wsgi.py おそらく-そして従来は-別のものよりも受け入れられます。

を作成するには wsgi.py nanoテキストエディタを使用してファイルを作成するには、次を実行します。

nano wsgi.py

以下の内容をコピーして貼り付けます。

from pyramid.config import Configurator
from pyramid.response import Response
from pyramid.paster import get_app

def hello(request):
    return Response('Hello!')

config = Configurator()
config.add_route('hello', '/')
config.add_view(home, route_name='hello')

app = config.make_wsgi_app()

# Or from an .ini file:
# app = get_app('config.ini', 'application_name')

pipを使用したアプリケーションの依存関係の処理


ローカルマシンで開発プロセスを開始した可能性が高いため、アプリケーションをデプロイするときは、すべての依存関係が(仮想環境内に)インストールされていることを確認する必要があります。

アプリケーションの依存関係のリストを作成する


実稼働環境への依存関係を取得する最も簡単な方法は、pipを使用することです。 1つのコマンドで、インストールしたすべてのパッケージ(または依存関係)を生成できます(アクティブ化された環境内、そうでない場合は、システム上でグローバルに)。また、1つのコマンドで、すべてのパッケージをダウンロードして、インストールされています。

注:このセクションには、ローカル開発マシンで、またはアプリケーションの依存関係のリストを生成する場所から実行される情報が含まれています。 このファイルは、アプリケーションディレクトリ内に配置し、サーバーにアップロードする必要があります。

「pip」を使用して、インストールされているパッケージのリストを作成します。

pip freeze > requirements.txt

このコマンドは、インストールされているすべてのパッケージのリストを含む「requirements.txt」というファイルを作成します。 virtualenv内で実行する場合、リストは環境のみ内にインストールされたパッケージで構成されます。 それ以外の場合は、グローバルにインストールされているすべてのパッケージが一覧表示されます。

アプリケーションの依存関係のリストからのダウンロード


pipを使用してリストからパッケージをインストールする:

注:このセクションには、本番環境で実行される情報が含まれています(つまり、 展開)マシン/環境。

pip install -r requirements.txt

このコマンドは、リストされているすべてのパッケージをダウンロードしてインストールします。 アクティブ化された環境で作業している場合、ファイルはそこにダウンロードされます。 それ以外の場合は、グローバルにインストールされます。これは、前のセクションで説明した理由から、推奨される方法ではありません

PythonWSGIWebアプリケーションサーバーのセットアップ


Pyramidアプリケーションをセットアップしてそのアプリオブジェクトを公開した後、選択したWebアプリケーションサーバーをダウンロードしてインストールすることで、実際の展開プロセスを開始できます。

この記事では、 CherryPy の機能とシンプルさの組み合わせにより、その使用に焦点を当てます。

注:ここに記載されている手順は簡単です。 詳細については、pipとvirtualenv 一般的なPythonツール:virtualenvとpipに関するハウツー記事をご覧ください。 CentOSベースのサーバーを使用している場合は、CentOSでPython2.7.6および3.3.3をセットアップする方法の記事も参照してください。

CherryPyWebサーバーを使用したピラミッドアプリケーションの提供


CherryPyの純粋なPythonWebサーバーは、名前の由来となったフレームワークを備えたコンパクトなソリューションです。 プロジェクトによって「高速で本番環境に対応したスレッドプールされた汎用HTTPサーバー」として定義されているこのサーバーは、任意のPythonWSGIWebアプリケーションにサービスを提供するために使用できるモジュール化されたコンポーネントです。

最初のPyramidチュートリアルに続いて、仮想環境(〜/ pyramid_sites / env)内で作業を続け、そこにCherryPyをインストールできます。 別の場所に別の場所を作成した場合は、そこでも作成できます。

# Install CherryPy Framework and HTTP Web-Server
pip install cherrypy

アプリケーションパッケージをインストールしたら、Pyramidアプリケーションを提供するために、Phythonインタープリターを実行するための「server.py」ファイルを作成する必要があります。 アプリケーションパッケージを含み、CherryPyのWebサーバーを使用して提供するのはこのファイルです。

server.pyファイルを作成するには、次のコマンドを実行します。

nano server.py

以下の内容をコピーして貼り付け、CherryPyのHTTPサーバーを使用してサンプルサーバーアプリケーションを作成します。

# Import your application as:
# from wsgi import application
# Example:

# If you are using the wsgi.py (standard Pyramid)
# from wsgi import app

# If using application.py (single page example):
from application import app

# Import CherryPy
import cherrypy

if __name__ == '__main__':

    # Mount the application (or *app*)
    cherrypy.tree.graft(app, "/") 
                
    # Unsubscribe the default server
    cherrypy.server.unsubscribe()

    # Instantiate a new server object
    server = cherrypy._cpserver.Server()
    
    # Configure the server object
    server.socket_host = "0.0.0.0"
    server.socket_port = 8080
    server.thread_pool = 30
    
    # For SSL Support
    # server.ssl_module            = 'pyopenssl'
    # server.ssl_certificate       = 'ssl/certificate.crt'
    # server.ssl_private_key       = 'ssl/private.key'
    # server.ssl_certificate_chain = 'ssl/bundle.crt'
    
    # Subscribe this server
    server.subscribe()
    
    # Example for a 2nd server (same steps as above):
    # Remember to use a different port
    
    # server2             = cherrypy._cpserver.Server()
    
    # server2.socket_host = "0.0.0.0"
    # server2.socket_port = 8080
    # server2.thread_pool = 30
    # server2.subscribe()
    
    # Start the server engine (Option 1 *and* 2)
    
    cherrypy.engine.start()
    cherrypy.engine.block()

CTRL + Xを押し、Yで確定して、保存して再度終了します。

アプリケーションサーバーの実行と管理


アプリケーションの提供を開始するには、実行する必要があります server.py Pythonインストールを使用します。

以下を実行して、構成されたとおりにサーバーを起動します。

python server.py

これにより、サーバーがフォアグラウンドで実行されます。 停止したい場合は、CTRL+Cを押してください。

サーバーをバックグラウンドで実行するには、以下を使用します。

python server.py &

アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。

Nginxのセットアップ


Nginxのインストール


CentOS / RHELユーザーへの注意:

以下の手順は、CentOSシステムでは機能しません。 CentOSについては、こちらの説明をご覧ください。

次のコマンドを実行して、aptitudeを使用してNginxをインストールします。

sudo aptitude install nginx

Nginxを実行するには、次を使用します。

sudo service nginx start

Nginxを停止するには、次を使用します。

sudo service nginx stop

Nginxを再起動するには、次を使用します。

# After each time you reconfigure Nginx, a restart
# or reload is needed for the new settings to come
# into effect.  
sudo service nginx restart

注: UbuntuでのNginxの詳細については、記事 Ubuntu12.04にNginxをインストールする方法を参照してください。

Nginxの構成


注:以下は、Nginxをリバースプロキシとして使用するための短いチュートリアルです。 Nginxの詳細については、VPSでNginxWebサーバーを構成する方法を確認してください。

アプリケーションを実行するWebサーバーを選択してセットアップした後、Nginxで同じことを続行し、[WSGIアプリを実行する]バックエンドサーバーと通信する準備をすることができます。

これを実現するには、Nginxの構成ファイルを変更する必要があります。 nginx.conf

次のコマンドを実行してnginx.confを開き、nanoテキストエディターを使用して編集します。

sudo nano /etc/nginx/nginx.conf

ファイルを次の設定例に置き換えて、Nginxをリバースプロキシとして機能させ、アプリケーションと通信することができます。

以下の設定例をコピーして貼り付けます。

worker_processes 1;

events {

    worker_connections 1024;

}

http {

    sendfile on;
    
    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;

    # Configuration containing list of application servers
    upstream app_servers {
    
        server 127.0.0.1:8080;
        # server 127.0.0.1:8081;
        # ..
        # .
    
    }

    # Configuration for Nginx
    server {
    
        # Running port
        listen 80;

        # Settings to serve static files 
        location ^~ /static/  {
        
            # Example:
            # root /full/path/to/application/static/file/dir;
            root /app/static/;
        
        }
        
        # Serve a static file (ex. favico)
        # outside /static directory
        location = /favico.ico  {
        
            root /app/favico.ico;
        
        }

        # Proxy connections to the application servers
        # app_servers
        location / {
        
            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        
        }
    }
}

構成の変更が完了したら、CTRL + Xを押し、Yで確定して保存して終了します。 変更を有効にするには、Nginxを再起動する必要があります。

次を実行してNginxを再起動します。

sudo service nginx stop
sudo service nginx start

以上です! アプリケーションサーバーをNginxに接続した後、お気に入りのブラウザーを使用してドロップレットのIPアドレスにアクセスすることでサーバーにアクセスできます。

http://[your droplet's IP adde.]/

# Hello world!

参考文献


Python Webアプリケーションのデプロイメントについて詳しく知りたい場合は、一般的な理解を深めるために、このテーマに関する次の記事を確認することをお勧めします。