Nginxリバースプロキシの背後にCherryPyWebアプリケーションをデプロイする方法
序章
CherryPyは、あらゆるサイズのWebアプリケーションと APIを作成するための優れたフレームワークです。「Pythonを使い始める」Hello、world!から世界の1つになることができるものまで最も忙しいWebサイトの1つ!
別の言語を使用している場合、CherryPyを使用して最初に開発を開始したとき、新しいアプリケーションをオンラインにするプロセスは少し不慣れに見えるかもしれません。
このDigitalOceanの記事では、pipを使用して依存関係を管理するとともに、完全に堅牢なCherryPyベースのWebアプリケーションをデプロイする2つの優れた方法について説明します。
用語集
1. CherryPyとWebアプリケーションの展開の概要
- Webアプリケーションの展開
- WSGI
- リバースプロキシとしてのNginxの使用
- Python(WSGI)Webアプリケーションサーバー
- CherryPyのアプリケーション(HTTP)サーバーの概要
- uWSGI
2. 「app」オブジェクトを公開したシンプルなCherryPyアプリケーションの準備
- アプリケーション構造の作成
- nanoを使用して「app/ init.py」を編集します
- nanoを使用して「wsgi.py」を編集します
3. CherryPyデプロイメント用のシステムの準備
- システムの更新
- Python、pip、virtualenvのセットアップ
- python-dev
- ピップ
- virtualenv
- CherryPyのダウンロードとインストール
- uWSGIのダウンロードとインストール
4. pipを使用してアプリケーションの依存関係を処理する方法
- アプリケーションの依存関係のリストを作成する
- アプリケーションの依存関係のリストからのダウンロード
5. 展開の開始:Nginxのダウンロード、インストール、セットアップ
- Nginxのインストール
- Nginxの構成
6. PythonWSGIWebアプリケーションサーバーのセットアップ
- CherryPy独自のWebサーバーを使用したアプリケーションの提供[*]
- CherryPyアプリケーションサーバーの実行と管理
- uWSGIを使用したアプリケーションの提供[*]
- サーバーの実行
CherryPyとWebアプリケーションの展開の概要
CherryPyは全体として、必要かどうかに関係なく、すぐに使用できるコンポーネントが多すぎない、最小限のPythonWebアプリケーション開発フレームワークです。 フレームワークは、必要になる可能性のあるすべてのコア必需品を処理します(例: セッション、キャッシング、ファイルのアップロードなど)、残りの部分(および使用方法と使用方法の選択)はあなたによって決定されます。 出荷されたHTTP/ 1.1準拠のWSGIスレッドプールWebサーバーを使用してオンラインにするのが簡単なため、他のPythonフレームワークとは一線を画しています。
Webアプリケーションの展開
すべてのPythonWSGIWebアプリケーションに関して、デプロイメントは、アプリケーションオブジェクトへの参照を含むWSGIモジュールの準備で構成されます。このモジュールは、要求を渡すためのWebサーバーによる入り口として使用されます。
注:ただし、CherryPy独自のサーバーを使用する場合は、プロセスが簡単になり、特に心配する必要はありません。
この記事では、アプリケーションをデプロイする2つの異なる方法を紹介します。
-
CherryPyのデフォルトのWebサーバーを使用しており、ほとんどのアプリケーションに最適です。
-
詳細な構成機能を必要とするアプリケーションには、別の代替アプリケーションサーバー(uWSGI)を使用します。
WSGI
一言で言えば、WSGIは、Webサーバーとアプリケーション自体の間のインターフェイスです。 これは、さまざまなサーバーとアプリケーション(フレームワーク)間の標準化された方法が相互に連携し、必要に応じて互換性を確保できるようにするために存在します(つまり、 開発環境から本番環境への切り替え)、これは今日の必須のニーズです。
注: WSGIおよびPythonWebサーバーの詳細については、記事PythonベースのWebサーバーの比較をご覧ください。 Webアプリケーション。
リバースプロキシとしてのNginxの使用
Nginxは、非常に高性能なWebサーバー/(リバース)プロキシです。 軽量で、操作が比較的簡単で、拡張も簡単なため(アドオン/プラグインを使用)、人気を博しています。 そのアーキテクチャのおかげで、多くのリクエスト(実質的に無制限)を処理できます。これは、アプリケーションやWebサイトの負荷によっては、他の古い代替手段を使用して対処するのが非常に難しい場合があります。
覚えておいてください:接続を「処理する」とは、技術的には接続を削除せず、何かでサービスを提供できることを意味します。 Nginxがエラーメッセージではないクライアント応答にサービスを提供するには、アプリケーションとデータベースが正常に機能している必要があります。
Python(WSGI)Webアプリケーションサーバー
Python Webアプリケーションサーバーは、[通常]スタンドアロンのCベースのソリューション、または完全に(または部分的に)Pythonベースのソリューション(つまり、 純粋なPython)のもの。
これらは、前述のように、Webアプリケーションを contains して呼び出し可能なアプリケーションを含むPythonモジュールを受け入れて動作し、ネットワーク上でサービスを提供します。
それらのいくつかは直接使用できる高性能サーバーですが、上記の理由からNginxを前面で使用することをお勧めします(例: より高いパフォーマンス)。 同様に、通常Webアプリケーションフレームワークに付属している開発サーバーは、機能が不足しているため、本番環境での使用はお勧めしません。もちろん、いくつかの例外があります!
人気のあるPythonWSGIWebサーバーは次のとおりです。
-
CherryPy
-
Gunicorn
-
uWSGI
-
ウェイトレス
CherryPyのアプリケーション(HTTP)サーバーの概要
CherryPyの純粋なPythonWebサーバーは、名前の由来となったフレームワークを備えたコンパクトなソリューションです。 [CherryPy]プロジェクトによって「高速で本番環境に対応したスレッドプールされた汎用HTTPサーバー」として定義されているこのコンポーネントは、任意の PythonWSGIWebアプリケーションを提供するために使用できるモジュール化されたコンポーネントです。
CherryPy Webサーバーのハイライト:
-
非常にコンパクトで使いやすい純粋なPythonソリューション
-
設定が簡単、使いやすい
-
スレッドプールされ、高速
-
スケーリングを可能にします
-
SSLをサポート
uWSGI
以下は、上記のDigitalOceanPythonサーバー比較の記事からの抜粋です。
非常に紛らわしい命名規則にもかかわらず、uWSGI自体は、ホスティングサービスを構築するための完全なソフトウェアスタックを提供することを目的とした、多くのコンポーネントを備えた広大なプロジェクトです。 これらのコンポーネントの1つであるuWSGIサーバーは、PythonWSGIアプリケーションを実行します。 SCGIとほぼ同一の独自のuwsgiワイヤプロトコルを含むさまざまなプロトコルを使用できます。 アプリケーションサーバーの前でスタンドアロンHTTPサーバーを使用するという理解できる要求を満たすために、NGINXおよびCherokee Webサーバーは、プロセスを直接制御するuWSGIの[独自の]最高のパフォーマンスのuwsgiプロトコルをサポートするようにモジュール化されています。
uWSGIのハイライト
-
uWSGIにはWSGIアダプターが付属しており、WSGIで実行されるPythonアプリケーションを完全にサポートします。
-
libpythonとリンクしています。 起動時にアプリケーションコードをロードし、Pythonインタープリターのように機能します。 着信リクエストを解析し、Python呼び出し可能オブジェクトを呼び出します。
-
人気のあるNGINXWebサーバー(Cherokee *およびlighttpdとともに)を直接サポートします。
-
Cで書かれています。
-
そのさまざまなコンポーネントは、アプリケーションの実行よりもはるかに多くのことを実行できます。これは、拡張に便利な場合があります。
-
現在(2013年後半現在)、積極的に開発されており、リリースサイクルが高速です。
-
アプリケーションを実行するためのさまざまなエンジンがあります(非同期および同期)。
-
これは、実行するメモリフットプリントが低くなることを意味します。
「app」オブジェクトを公開したシンプルなCherryPyアプリケーションの準備
サンプルとして使用する新しいCherryPyアプリケーションを作成することから、デプロイメントの例を始めましょう。
注:ここでのアプリケーションの例では、仮想環境を使用してアプリケーションファイルとその依存関係を管理しています。 pipとvirtualenvについては、チュートリアル一般的なPythonツール:virtualenvの使用、Pipを使用したインストール、パッケージの管理をご覧ください。
アプリケーション構造の作成
非常にミニマルであるが実際のアプリケーションに似ているはずの簡単な例を使用して作業したいと思います。
この目的のために、次のようなものを作成できます。
myy_app
|-- wsgi.py
|__ /app
|-- __init__.py
まず、アプリケーションフォルダとアプリケーションモジュールを作成しましょう。
mkdir ~/my_app
mkdir ~/my_app/app
その後、展開に必要なアプリケーションファイルとwsgi.py
ファイルを作成します。
touch ~/my_app/wsgi.py
touch ~/my_app/app/__init__.py
nanoを使用して「app/ init.py」を編集します
模範的なアプリケーションモジュールを含むapp
パッケージを作成しました。 これで、__init__.py
を編集して定義できます。
nano ~/my_app/app/__init__.py
以下のスクリプトをコピーして貼り付けます。
import cherrypy
class Root(object):
@cherrypy.expose
def index(self):
return "Hello, world!"
CTRL + Xを押し、Yで確定して保存して終了します。
nanoを使用して「wsgi.py」を編集します
wsgi.py
ファイルは、アプリケーションへのエントリポイントを公開するために使用されます。 この例では、このファイル内でアプリケーションモジュール(アプリ)をインポートし、CherryPyのWSGI Webサーバーを使用して直接実行するか、それを含むuWSGIに渡して実行します。
nano ~/my_app/wsgi.py
以下の内容をコピーして貼り付けます。
import cherrypy
from app import Root
app = cherrypy.tree.mount(Root(), '/')
if __name__=='__main__':
cherrypy.config.update({
'server.socket_host': '127.0.0.1',
'server.socket_port': 8080,
})
# Run the application using CherryPy's HTTP Web Server
cherrypy.quickstart(Root())
CTRL + Xを押し、Yで確定して保存して終了します。
CherryPyデプロイメント用のシステムの準備
システムの更新
安定した展開サーバーを使用するには、最新の状態に保ち、適切に保守することが重要です。
デフォルトアプリケーションの最新バージョンを確実に入手するには、システムを更新する必要があります。
Debianベースのシステムの場合(つまり Ubuntu、Debian)、以下を実行します:
aptitude update
aptitude -y upgrade
RHELベースのシステムの場合(つまり CentOS)、以下を実行します:
yum -y update
Python、pip、virtualenvのセットアップ
CentOS / RHELユーザーへの注意:
CentOS / RHEL は、デフォルトで、非常に無駄のないサーバーとして提供されます。 そのツールセットは、ニーズに合わせて古くなっている可能性がありますが、アプリケーションを実行するためではなく、サーバーのシステムツールに電力を供給するためにありません。 YUM)。
CentOSシステムを準備するには、Pythonをセットアップする必要があります(つまり、 ソースからコンパイル)およびpip * / virtualenvは、そのインタープリターを使用してインストールする必要があります。
CentOS6.4および5.8でPython2.7.6および3.3.3をセットアップする方法、pipおよびvirtualenvについては、を参照してください。 ]CentOSでPython2.7.6および3.3.3をセットアップする方法。
UbuntuおよびDebianでは、使用できるPythonインタープリターの最新バージョンがデフォルトで提供されます。 インストールする追加パッケージの数は限られています。
-
python-dev (開発ツール)、
-
pip (パッケージを管理するため)、
-
virtualenv (分離された仮想を作成するため
注:特定のアプリケーションのインストールを続行する前に、特にソースからビルドする場合は、次のコマンドを使用して、必須の開発ツールbuild-essentialをインストールする必要があります。
aptitude install -y build-essential
python-dev
python-devは、Pythonモジュールを構築するための拡張開発ツールを含むオペレーティングシステムレベルのパッケージです。
次のコマンドを実行して、aptitudeを使用してpython-devをインストールします。
aptitude install -y python-dev
# You might need python2.7-dev
# aptitude install -y python2.7-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
CherryPyのダウンロードとインストール
CherryPyフレームワークは、pipパッケージマネージャーを使用してインストールできます。
以下を実行して、pipを使用してcherrypyをインストールします。
# Install CherryPy Framework and HTTP Web-Server
pip install cherrypy
uWSGIのダウンロードとインストール
これは、アプリケーションに関連するすべての要素を可能な限り仮想環境内にまとめて含めるための推奨される方法です。 そのため、uWSGIをダウンロードしてインストールします。
環境内で作業していない場合、uWSGIはグローバルにインストールされます(つまり、 システム全体で利用可能)。 これはお勧めしません–常にvirtualenvの使用を選択してください。
pipを使用してuWSGIをインストールするには、以下を実行します。
pip install uwsgi
pipを使用してアプリケーションの依存関係を処理する方法
ローカルマシンで開発プロセスを開始した可能性が高いため、アプリケーションをデプロイするときは、すべての依存関係が(*仮想環境内に)インストールされていることを確認する必要があります。
アプリケーションの依存関係のリストを作成する
本番環境への依存関係を取得する最も簡単な方法は、pipを使用することです。 1つのコマンドで、インストールしたすべてのパッケージ(または依存関係)を生成できます(アクティブ化環境内、そうでない場合は、システム上でグローバル)。 1つのコマンドで、すべてをダウンロードしてインストールできます。
注:このセクションには、ローカル開発マシンで、またはアプリケーションの依存関係のリストを生成する場所から実行される情報が含まれています。 このファイルは、アプリケーションディレクトリ内に配置し、サーバーにアップロードする必要があります。
「pip」を使用して、インストールされているパッケージのリストを作成します。
pip freeze > requirements.txt
このコマンドは、インストールされているすべてのパッケージのリストを含むrequirements.txt
というファイルを作成します。 virtualenv内で実行する場合、リストは環境のみ内にインストールされたパッケージで構成されます。 それ以外の場合は、グローバルにインストールされているすべてのパッケージが一覧表示されます。
アプリケーションの依存関係のリストからのダウンロード
pipを使用してリストからパッケージをインストールする:
注:このセクションには、本番環境で実行される情報が含まれています(つまり、 展開)マシン/環境。
pip install -r requirements.txt
このコマンドは、リストされているすべてのパッケージをダウンロードしてインストールします。 アクティブ化された環境で作業している場合、ファイルはそこにダウンロードされます。 それ以外の場合は、グローバルにインストールされます。これは、前のセクションで説明した理由から、推奨される方法ではありません
展開の開始:Nginxのダウンロード、インストール、セットアップ
サーバーの選択に関係なく、前のセクションで説明した理由により、CherryPyアプリケーションはNginxの背後でオンラインになります。 それでは、最初にNginxをダウンロードして構成し、アプリケーションサーバーの動作を続けましょう。
基本的なサーバーアーキテクチャの例:
Client Request ----> Nginx (Reverse-Proxy)
|
/|\
| | `-> App. Server I. 127.0.0.1:8080 # Our example
| `--> App. Server II. 127.0.0.1:8082
`----> App. Server III. 127.0.0.1:8083
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
PythonWSGIWebアプリケーションサーバーのセットアップ
サンプルアプリケーションを作成し、依存関係の管理を完了したら、展開の最終段階であるサーバーのセットアップを開始する準備が整いました。
前述のように、この記事では、Nginxの背後にあるCherryPyおよびuWSGIWebアプリケーションサーバーの使用に焦点を当てます。
CherryPy独自のWebサーバーを使用したアプリケーションの提供[*]
CherryPyの純粋なPythonWebサーバーは、フレームワークに付属するコンパクトなソリューションです。 これは、プロジェクトによって「高速で本番環境に対応した、スレッドプールされた汎用HTTPサーバー」として定義されています。
フレームワークを使用して開発したため、wsgi.py
内のプログラムは、実行時にサービスを開始する準備ができています。
Nginxの構成に一致するCherryPyの設定:
# ..
cherrypy.config.update({
'server.socket_host': '127.0.0.1',
'server.socket_port': 8080,
})
# ..
CherryPyアプリケーションサーバーの実行と管理
アプリケーションの提供を開始するには、Pythonインストールを使用してserver.py
を実行する必要があります。
以下を実行して、構成されたとおりにサーバーを起動します。
python ~/my_app/wsgi.py
これにより、サーバーがフォアグラウンドで実行されます。 停止したい場合は、 CTRL +Cを押してください。
サーバーをバックグラウンドで実行するには、以下を使用します。
python ~/my_app/wsgi.py &
アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。
uWSGIを使用したアプリケーションの提供[*]
CherryPy独自のHTTPサーバーは、非常に高性能で強力ですが、すべてのセットアップまたはデプロイメントに対応しているわけではありません。 必要な構成設定に一致するように多くのオプションを調整する機能が必要な場合は、uWSGIがソリューションになる可能性があります。
サーバーの実行
uWSGIには多くのオプションと構成があり、その柔軟性のおかげでそれらを使用するための多くの可能な方法があります。 最初から複雑にすることなく、できるだけ簡単に作業を開始し、さらに高度な方法で作業を続けていきます。
注:以下のコマンドを実行する前に、my_app
フォルダーにあることを確認してください。そうしないと、uwsgiはwsgi.py
を見つけられず、アプリケーションオブジェクトアプリをインポートできません。
簡単な使用例:
uwsgi [option] [option 2] .. -w [wsgi file with app. callable]
uWSGIを実行してwsgi.pyからアプリケーションの提供を開始するには、次のコマンドを実行します。
uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi:app
これにより、サーバーがフォアグラウンドで実行されます。 停止したい場合は、 CTRL +Cを押してください。
サーバーをバックグラウンドで実行するには、次を実行します。
uwsgi --socket 127.0.0.1:8080 --protocol=http -w wsgi:app &
アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。 詳細については、以下のセクションを参照してください。
以上です! アプリケーションサーバーをNginxに接続した後、お気に入りのブラウザーを使用してドロップレットのIPアドレスにアクセスすることでサーバーにアクセスできます。
http://[your droplet's IP adde.]/
# Hello, world!
参考文献
Python Webアプリケーションのデプロイメントについて詳しく知りたい場合は、一般的な理解を深めるために、このテーマに関する次の記事を確認することをお勧めします。