Nginxの背後にあるCherryPyWebサーバーを使用してPythonWSGIアプリケーションをデプロイする方法
序章
このチュートリアルのタイトルを読んだ後、次のいずれかの質問をしていることに気付く可能性があります。
-
WSGIアプリケーションに「実際の」スタンドアロン(おそらくCベース)サーバーではなく、CherryPyの純粋なPython Webサーバーを使用する必要があるのはなぜですか?
-
CherryPy…それはフレームワークではありませんか? それは私のボトル、フラスコなどの展開と何の関係があるのでしょうか。 ベースのアプリケーション?
両方の良い答えと理由がたくさんあります。 このDigitalOceanの記事では、それらを見つけます。 まず、CherryPyとは何か、そしてそれをWebアプリケーションに利用することの利点について説明します。 CherryPyのWebサーバーを使用してPythonアプリケーションをデプロイできる「理由」、そして最も重要な「方法」について引き続き説明します。
用語集
1. CherryPyを理解してNginxを使用する
- CherryPyWSGIWebサーバーの概要
- CherryPyのWSGIWebサーバーを使用してデプロイする理由
- CherryPyの前でリバースプロキシとしてNginxを使用する
2. 生産のための液滴の準備
- デフォルトのオペレーティングシステムを更新する
- Python、pip、virtualenvのセットアップ
- 仮想(Python)環境の作成
- CherryPyのダウンロードとインストール
- Nginxのダウンロードとインストール
3. CherryPyWebサーバーでPythonWebアプリケーションを提供する
4. Nginxの構成
5. その他のヒントと提案
CherryPyを理解してNginxを使用する
CherryPyは全体として、最小限のPythonWebフレームワークです。 ここでのミニマリストとは、好きかどうかに関係なく、すぐに使用できるコンポーネントが多すぎないことを意味します。 ミニマリズムとは、基本的に、開発者に選択肢を与えずに物事を押し付けることを控えることです。 CherryPy(およびそのことに関する他のそのようなフレームワーク)は通常、期待されるコアの必需品を処理します(例: セッション、キャッシング、ファイルのアップロードなど)、残りの部分(および使用方法と使用方法の選択)はあなたによって決定されます。
CherryPyを他のPythonフレームワーク(いくつかの「本格的な」フレームワークを含む)と区別するのは、CherryPyをすぐに使用できるようにするという開発者の野心です(つまり、 開発)を使用して、自己完結型のアプリケーションバンドル(パッケージ)としてデプロイする準備ができています。 このタスクを実行するには、Webアプリケーションの場合、堅牢なWebサーバーが必要です。 これはまさにCherryPyが優れている点であり、独自の HTTP/1.1準拠のWSGIスレッドプールWebサーバーを備えています。 それは生産準備ができていて、ただ素晴らしいです。
CherryPyWSGIWebサーバーの概要
CherryPyの純粋なPythonWebサーバーは、名前の由来となったフレームワークを備えたコンパクトなソリューションです。 [CherryPy]プロジェクトによって、高速で本番環境に対応したスレッドプールされた汎用HTTPサーバーとして定義されています。 これはモジュール化されたコンポーネントであり、PythonWSGIWebアプリケーションを提供するために使用できます。
CherryPy Webサーバーのハイライト:
- 非常にコンパクトで使いやすい純粋なPythonソリューション
- 設定が簡単、使いやすい
- スレッドプールされ、高速
- スケーリングを可能にします
- SSLをサポート
CherryPyのWSGIWebサーバーを使用してデプロイする理由
冒頭で述べたように、あなたはおそらく、あなたが聞いたことがある、あるいは試したことがあるかもしれない別の誇大宣伝された有名なソリューションの代わりにこのソリューションを使用する理由について疑問に思っているでしょう。 問題の真実は、WSGIの優れた仕様のおかげで、Webサーバーの作成がかなり簡単になったことです。 何年にもわたって、これはそれらの多くを生み出し、いくつかはある程度の人気に達し、ほとんどは開発者のマシンの中に隠されたままでした。
選択肢の数は膨大であり、それらはすべて(ほとんど)内部で同じことを大部分実行します。
アプリケーションのデプロイにCherryPyWebサーバーを正確に使用する必要があるのはなぜですか?
答えはかなり単純です。一緒に仕事をするのは楽しいことです。 CherryPyのサーバーを使用してWSGIWebアプリケーションを提供するための使いやすさは並外れています。 1、2分以内に立ち上がって実行するので、頭痛の種を大幅に減らすことができます。 ある程度カスタマイズ可能であり、単一のファイルを介して可能な限り最も簡単な方法でマルチプロセスインスタンスとマルチスレッドインスタンスの両方を実行する機能を提供します(例: server.py )。
注意:マルチプロセスセットアップの場合、複数の「サーバー」オブジェクトインスタンスを構成する必要があります。
アプリケーションがオンラインになってから数分以内に1秒あたり数万のリクエストが発生し、負荷を分散するためにより多くのサーバーを使用できないことが確実でない限り、面倒な作業よりも時間をかけてアプリケーションの開発を続ける方がよいでしょう。ライブラリ、CPUの最適化、クラッシュの処理など。
CherryPy Webサーバーは、 Nginx を前面リバースプロキシとして(簡単に)使用することで、Bottle、CherryPy、 Django、Flask、Pyramid、またはその他のフレームワーク。
覚えておいてください:上記のアーキテクチャ(以下で説明)を使用すると、水平方向(サーバー数を増やす)、さらには垂直方向(サーバーあたりの容量を増やす)に簡単に拡張できます。 「ボトルネック」はバックエンド(データベース)である可能性があります。 だからこそ、極端な負荷がかかる前に、物事を最適化して死ぬことを試みる価値はありません。 それでも、適切なキャッシングメカニズムが導入されていれば、おそらくほとんどの問題を解決できます。
CherryPyの前でリバースプロキシとしてNginxを使用する
Nginxは、非常に高性能なWebサーバー/(リバース)-プロキシです。 軽量で、操作が比較的簡単で、拡張も簡単なため(アドオン/プラグインを使用)、人気を博しています。 そのアーキテクチャのおかげで、多くのリクエスト(事実上無制限)を処理できます。これは、アプリケーションやWebサイトの負荷によっては、他のリクエストを使用して対処するのが非常に難しい場合があります。 、古い選択肢。
覚えておいてください:接続を「処理する」とは、技術的には、接続を削除せず、何かでサービスを提供できることを意味します。 Nginxがエラーメッセージではないクライアント応答にサービスを提供するには、アプリケーションとデータベースが正常に機能している必要があります。
アプリケーションサーバーの前でリバースプロキシとしてNginxを使用する必要があるのはなぜですか?
アプリケーションサーバー(この場合はCherryPy WSGI Webサーバー)はアプリケーションとその静的ファイルを提供できますが(例: javascript、css、imagesなど)、Nginxなどの前に設定されたリバースプロキシを利用することは非常に良い考えです。 これにより、クライアント要求(およびオーバーヘッド)やその他のさまざまなタスクが処理されるため、[アプリケーションサーバーからの]多くの負荷が軽減され、全体的なパフォーマンスが大幅に向上します。
アプリケーションが成長するにつれて、アプリケーションを最適化し、必要に応じてサーバー間で分散して、より多くの接続を同時に処理できるようにし、一般的により堅牢なアーキテクチャを実現する必要があります。 アプリケーションサーバーの前にリバースプロキシを配置すると、最初からこれを行うのにも役立ちます。
その拡張性(例: フェイルオーバーやその他のメカニズムを備えたネイティブキャッシングも、(より単純な)アプリケーションサーバーとは異なり、Webアプリケーションにメリットをもたらす素晴らしい偉業です。
基本的なサーバーアーキテクチャの例:
Client Request ----> Nginx (Reverse-Proxy)
|
/|\
| | `-> App. Server I. 127.0.0.1:8081
| `--> App. Server II. 127.0.0.1:8082
`----> App. Server III. 127.0.0.1:8083
注:アプリケーションがで着信接続をリッスンするように設定されている場合 127.0.0.1
、ローカルでのみアクセスできます。 使用する場合 0.0.0.0
ただし、外部からの接続も受け入れます。
生産のための液滴の準備
このセクションでは、生産用の液滴を準備します(つまり アプリケーションをデプロイするため)。
まず始めます:
- デフォルトのオペレーティングシステムを更新する
- 一般的なPythonツールのダウンロードとインストール(つまり pip、virtualenv)
- アプリケーションを含む仮想環境を作成します(CherryPyなどの依存関係がその中に存在します)。
注:ここに記載されている手順は簡潔にしています。 詳細については、pipおよびvirtualenvに関するハウツー記事をご覧ください:一般的なPythonツール:virtualenvの使用、Pipでのインストール、パッケージの管理。
デフォルトのオペレーティングシステムを更新する
注:最新バージョンのオペレーティングシステムを使用して、新しいドロップレットに対して次のセットアップと準備を実行します。 理論的には、サーバーでそれらを試すのに問題はないはずです。 ただし、すでに積極的に使用している場合は、試す前に新しいシステムに切り替えることを強くお勧めします。
デフォルトアプリケーションの最新バージョンを確実に入手するには、システムを更新する必要があります。
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 は、そのインタープリターを使用してインストールする必要があります。
Pipとvirtualenvを使用してCentOS6.4および5.8でPython2.7.6および3.3.3をセットアップする方法については、CentOSでPython2.7.6および3.3.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
自己完結型の仮想(Python)環境の作成
必要なすべてのツールを自由に使用できるようになったら、アプリケーションをデプロイする環境を作成できます。
覚えておいてください:プロジェクトの開発(ローカル)マシンにvirtualenvがない場合は、virtualenvを作成し、アプリケーション(およびその依存関係)を内部に移動することを検討する必要があります。
仮想環境とアプリケーションモジュールの両方を含むフォルダーの作成から始めましょう。
ここでは、ニーズに合わせて任意の名前を使用できます。
mkdir my_app
このフォルダに入り、内部に新しい仮想環境を作成し続けることができます。
仮想環境に任意の名前を選択することもできます。
cd my_app
virtualenv my_app_venv
Pythonアプリケーションモジュールも含めるために、そこに新しいフォルダを作成しましょう。
これは、アプリケーションモジュールが存在するフォルダーです。
mkdir app
そして、仮想環境内でインタープリターをアクティブにして、それを使用します。
「my_app_venv」以外の名前を使用する場合は、仮想環境に選択した名前を使用してください。
source my_app_venv/bin/activate
最終的に、メインアプリケーションのデプロイメントディレクトリは次のようになります。
my_app # Main Folder to Contain Everything Together
|
|=== my_app_venv # V. Env. folder with the Python Int.
|=== app # Your application module
|..
|.
CherryPyのダウンロードとインストール
CherryPyのWSGIWebサーバーを使用するには、最初にダウンロードしてインストールする必要があります。
pipを使用してCherryPyをインストールするには、以下を実行します。
pip install cherrypy
注:環境内で作業している場合は、CherryPyがそこにインストールされます。 それ以外の場合、インストールはグローバルに利用可能(つまり、 システム全体)。 グローバルインストールはお勧めしません。 サーバーと開発マシンの両方でvirtualenvを使用することを常に選択してください。
Nginxのダウンロードとインストール
CentOS / RHELユーザーへの注意:
以下の手順は、CentOSシステムでは機能しません。 CentOSについては、こちらの説明をご覧ください。
次のコマンドを実行して、デフォルトのシステムパッケージマネージャー aptitude installNginxを使用します。
sudo aptitude install nginx
Nginxを実行するには、次を使用できます。
sudo service nginx start
Nginxを停止するには、次を使用できます。
sudo service nginx stop
Nginxを再起動するには、次を使用できます。
Nginxを再構成するたびに、新しい設定を有効にするために再起動またはリロードが必要です。
sudo service nginx restart
注: UbuntuでのNginxの詳細については、記事 Ubuntu12.04にNginxをインストールする方法を参照してください。
CherryPyWebサーバーでPythonWebアプリケーションを提供する
このセクションでは、WSGIアプリケーションがCherryPyWebサーバーでどのように機能するかを確認します。 このプロセスは、サーバーに呼び出し可能なWSGIアプリケーションを提供することで構成されます(例: application = (..)
)エントリポイントとして。
WSGI
一言で言えば、WSGIは、Webサーバーとアプリケーション自体の間のインターフェイスです。 これは、さまざまなサーバーとアプリケーション(フレームワーク)間の標準化された方法が相互に連携し、必要に応じて互換性を確保できるようにするために存在します(例: 開発環境から本番環境への切り替え)、これは今日の必須のニーズです。
注: WSGIおよびPythonWebサーバーの詳細については、記事PythonベースのWebサーバーの比較をご覧ください。 Webアプリケーション。
WSGIアプリケーションオブジェクト(呼び出し可能): wsgi.py
上記のように、WSGIで実行されているWebサーバーにはアプリケーションオブジェクトが必要です(つまり、 アプリケーションの)。
ほとんどのフレームワークとアプリケーションでは、これは次のもので構成されます。
- wsgi.py は、サーバーで使用されるアプリケーションオブジェクト(または呼び出し可能)を含み、提供します。
- そして、がアプリケーションオブジェクトを含み、それを使用してサービスを提供するserver.py。
模範的な「wsgi.py」の作成から始めて、CherryPyの共通の「server.py」の作成を続けます。
wsgi.pyおよびserver.pyの代わりに任意の名前を選択できます。 ただし、これらは一般的に使用されるものです(例: Djangoによる)。
基本的なWSGIアプリケーションを含むwsgi.pyファイルの作成から始めましょう。
次のコマンドを実行して、テキストエディタnanoを使用してwsgi.pyを作成します。
nano wsgi.py
引き続き、基本的なWSGIアプリケーションコードを内部に移動(コピー/貼り付け)します(これは、本番用に呼び出し可能な独自のアプリケーションに置き換える必要があります)。
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ["Hello!"]
これはサーバーに含まれているファイルであり、リクエストが来るたびに、サーバーはこのアプリケーション呼び出し可能オブジェクトを使用して、アプリケーションのリクエストハンドラーを実行します(つまり、 コントローラー)URLの解析時(例: mysite.tld / controller / method / variable)。
アプリケーションコードを配置した後、CTRL + Xを押し、Yで確定して、このファイルを my_app
仮想環境および実際のアプリケーションを含むアプリモジュールと一緒にフォルダー。
注:このWSGIアプリケーションは、この種の最も基本的な例です。 アプリケーションモジュールから独自のアプリケーションオブジェクトを含めるには、このコードブロックを置き換える必要があります。
完了すると、メインのアプリケーションデプロイメントディレクトリは次のようになります。
my_app # Main Folder to Contain Everything Together
|
|=== my_app_venv # V. Env. folder with the Python Int.
|=== app # Your application module
|
|--- wsgi.py # File containing application callable
|..
|.
CherryPy Webサーバーを使用するためのスクリプトの作成: server.py
現在の作業ディレクトリ内(例: my_app)フォルダーに、次のPythonスクリプトを作成する必要があります。
- アプリケーションが含まれています
- 1つ以上のCherryPyWebサーバーインスタンスを作成します
- これらのサーバーインスタンスを構成します
- サーバーエンジンを起動および停止します
このようなスクリプトを取得するには複数の方法があります。以下の例では、単純ですが簡単に構成できるスクリプトを使用します。
nanoを使用してWebサーバー起動スクリプトを含むserver.pyファイルを作成します。
nano server.py
このファイル内に、次のサーバースニペットを書き込み(コピー/貼り付け)します。
# Import your application as:
# from wsgi import application
# Example:
from wsgi import application
# Import CherryPy
import cherrypy
if __name__ == '__main__':
# Mount the application
cherrypy.tree.graft(application, "/")
# 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 = 8081
# server2.thread_pool = 30
# server2.subscribe()
# Start the server engine (Option 1 *and* 2)
cherrypy.engine.start()
cherrypy.engine.block()
CTRL + Xを押し、Yで確定して、保存して再度終了します。
最後に、メインアプリケーションのデプロイメントディレクトリは次のようになります。
my_app # Main Folder to Contain Everything Together
|
|=== my_app_venv # V. Env. folder with the Python Int.
|=== app # Your application module
|
|--- wsgi.py # File containing application callable
|--- server.py # Python executable to launch the server
|..
|.
サーバーの実行
アプリケーションの提供を開始するには、Pythonインストールを使用してserver.pyを実行する必要があります。
以下を実行して、構成されたとおりにサーバーを起動します。
注:仮想環境内で作業を続けているため、アクティブ化されたPythonインタープリターを使用してスクリプトが実行されます。 アクティブ化されていない場合は、パス my_app / bin / pythonserver.pyを指定する必要があります。
python server.py
これにより、サーバーがフォアグラウンドで実行されます。 停止したい場合は、CTRL+Cを押してください。
サーバーをバックグラウンドで実行するには、次を実行します。
python server.py &
コマンドラインに戻るには、Enterキーを押すだけです。 アプリは引き続き実行されます。
アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。
Nginxの構成
アプリケーションを実行するようにCherryPyを設定した後、CherryPyサーバーと通信するためにNginxで同じことを行う必要があります。 このためには、Nginxの構成ファイル「nginx.conf」を変更する必要があります。
次のコマンドを実行してnginx.confを開き、nanoテキストエディターを使用して編集します。
sudo nano /etc/nginx/nginx.conf
その後、ファイルを次の設定例に置き換えて、Nginxをリバースプロキシとして機能させ、アプリケーションと通信することができます。
注: SSLサポートの組み込みについては、最初に次の記事をお読みください:NginxでのSSL証明書の作成。
Webアプリケーションの構成例:
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の詳細については、記事VPSでNginxWebサーバーを構成する方法を参照してください。
その他のヒントと提案
ファイアウォール:
SSHの保護:
アラートの作成:
サーバーアクセスログを毎日監視および監視します。