開発者ドキュメント

CentOS6.4でNginxの背後にあるuWSGIを使用してFlaskWebアプリケーションをデプロイする方法

ステータス:非推奨

この記事では、サポートされなくなったバージョンのCentOSについて説明します。 現在CentOS6を実行しているサーバーを運用している場合は、サポートされているバージョンのCentOSにアップグレードまたは移行することを強くお勧めします。

理由: CentOS 6は2020年11月30日に保守終了(EOL)に達し、セキュリティパッチまたはアップデートを受信しなくなりました。 このため、このガイドは維持されなくなりました。

代わりに参照:このガイドは参照として役立つ場合がありますが、他のCentOSリリースでは機能しない場合があります。 可能な場合は、使用しているCentOSのバージョン用に作成されたガイドを使用することを強くお勧めします。

次のDigitalOceanチュートリアルは、CentOS 7サーバーでのuWSGIおよびNginxを使用したFlaskアプリケーションのデプロイの概要を示しているため、すぐに役立つ可能性があります。

序章


Armin RonacherのFlaskは、過去2年間にPython用に作成されたWebアプリケーションフレームワークの分野でこれまでに起こった中で最も素晴らしいものの1つです。

Flask は、ミニマリストですが、非常に機能的で強力なフレームワークであり、非常に人気があり、非常に拡張性があり、サードパーティのライブラリを豊富に選択できます(例: Flask-WTFまたはFlask-SQLAlchemy)。 この開発者に優しいフレームワークは、Pythonを使用してWeb開発を開始するための優れた方法です。特に、クリーンで読みやすいコードベースのおかげで、技術的な課題がどのように解決されるかを学習しようとしている場合は、発見を待っています。

このDigitalOceanの記事では、アプリケーションをデプロイし、同様の方法で稼働させる方法を紹介します。 まず、Python用のCentOS 6.4を実行するデプロイメントサーバーの準備から始め、Nginxリバースプロキシの背後で動作するように設定されたuWSGIアプリケーションサーバーを適切に操作する方法を確認します。

用語集


1.1。 フラスコの概要


  1. Webアプリケーションの展開
  2. WSGIの概要
  3. リバースプロキシとしてのNginxの使用
  4. PythonWSGIWebアプリケーションサーバー
  5. uWSGIの概要

2.2。 導入のためのシステムの準備


  1. システムの更新
  2. Python、pip、virtualenvの設定
  3. 開発のためのシステムの準備
  4. CentOSでのPythonのダウンロード、コンパイル、インストール
  5. 新しいPythonインストールを使用したCentOSへのpipのインストール
  6. 新しいPythonインストールを使用したCentOSへのvirtualenvのインストール

3.3。 アプリケーションデプロイメントの開始


  1. デプロイメント用のアプリケーションディレクトリの作成
  2. 仮想環境の作成
  3. 仮想環境での作業
  4. 仮想環境内でのuWSGIのダウンロードとインストール
  5. Flaskライブラリのダウンロードとインストール
  6. サンプルFlaskアプリケーションの作成

4.4。 展開段階:Nginxのインストールとセットアップ


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

5.5。 展開段階:uWSGIの操作


  1. サーバーの実行

6.6。 参考文献


フラスコの概要


フラスコの性質を考えると、導入セクションですでに述べたこと以外に言うことはあまりありません。 これは、Jinja2テンプレートエンジンとWerkzeug WSGIツールキットの2つの直接的な依存関係を持つ、美しくプログラムされた最小限のWebアプリケーション開発ライブラリです。

Flaskを使用すると、単一のファイルから数十の再利用可能なモジュール(つまり、 コンポーネント)ブループリントを使用して構造化されています。

この記事では、非常に基本的なサンプルのFlaskアプリケーションを使用します。これは、展開を示すために厳密に作成されたものです。 アプリケーションのパッケージ化とアップロードについては、記事Pythonアプリケーションをパッケージ化して配布する方法をご覧ください。 Flaskと「大きくなる」ことについてもっと知りたい場合は、大きなFlaskアプリケーションを構築する方法に興味があるかもしれません。

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


すべてのPythonWSGIWebアプリケーションに関して、デプロイメントは、アプリケーションオブジェクトへの参照を含むWSGIモジュールの準備で構成されます。このモジュールは、アプリケーションによって処理される要求を渡すためにWebサーバーによってエントリポイントとして使用されます。コントローラ(またはビュー)。

ここでは、Nginxの背後でFlaskアプリケーションを提供するFlaskアプリケーションを含むWSGIアプリケーションサーバーとして機能するuWSGIを使用します。 NginxはuWSGIの推奨される(高く評価されている)より高速なワイヤープロトコルをネイティブでサポートしているため、それに応じて機能するように設定します。

WSGIの概要


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

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

Flaskの場合、WSGI操作は基盤となるWerkzeugミドルウェアライブラリによって処理されます。

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


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

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

その人気と成功により、Nginxの背後で実行されているFlaskアプリケーションをデプロイして、その強力な機能を活用します。 uWSGIアプリケーションサーバーをネイティブでサポートしているため、オンラインにするための好ましい方法でもあります。

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


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

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

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

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

uWSGIの概要


非常に紛らわしい命名規則にもかかわらず、uWSGI自体は、ホスティングサービスを構築するための完全なソフトウェアスタックを提供することを目的とした、多くのコンポーネントを備えた広大なプロジェクトです。 これらのコンポーネントの1つであるuWSGIサーバーは、PythonWSGIアプリケーションを実行します。 SCGIとほぼ同一の独自のuwsgiワイヤプロトコルを含むさまざまなプロトコルを使用できます。 アプリケーションサーバーの前でスタンドアロンHTTPサーバーを使用するという理解できる要求を満たすために、NGINXおよびCherokee Webサーバーは、プロセスを直接制御するuWSGIの[独自の]最高のパフォーマンスのuwsgiプロトコルをサポートするようにモジュール化されています。

uWSGIのハイライト

導入のためのシステムの準備


システムの更新


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

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

次を実行して、CentOSシステムを更新します。

yum -y update

Python、pip、virtualenvの設定


注:このガイドは、CentOSバージョン6.5、および5.8と6.4で有効である必要があります。

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

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

全体として、次のPythonパッケージを使用します。

注:以下は、 CentOs 6.4でPython2.7.6および3.3.3をセットアップする方法の要約です(完全なものですが)。 詳細を知りたい場合は、チェックすることをお勧めします。 pipとvirtualenvについて詳しく知りたい場合は、一般的なPythonツール:virtualenvとpipのチュートリアルを参照してください。

開発のためのシステムの準備


CentOSディストリビューションには、必要になる可能性のある一般的なアプリケーションやツールの多くが付属していません-これは意図的な設計上の選択です

インストールには、いくつかのライブラリとツールが必要になります(つまり、 開発[関連]ツール)はデフォルトでは出荷されていません。

したがって、続行する前に、それらをダウンロードしてインストールする必要があります。

YUMソフトウェアグループは、一般的に使用されるツール(アプリケーション)の束で構成されており、1つのコマンドを実行し、グループ名を指定することで、すべて同時にダウンロードできます。

注: YUMを使用すると、複数のグループを一緒にダウンロードすることもできます。

必要な開発ツールを入手するには、次のコマンドを実行します。

yum groupinstall -y development

また;

yum groupinstall -y 'development tools'

注:以前の(短い)バージョンは、CentOS古いディストリビューションでは機能しない可能性があります。

便利な追加パッケージをダウンロードするには:

yum install -y zlib-devel openssl-devel sqlite-devel bzip2-devel

CentOSでのPythonのダウンロード、コンパイル、インストール


注:ここに記載されている手順は、Pythonの任意のバージョンをダウンロードするために使用できます。 記載されているバージョン(以下の例では2.7.6)を必要なバージョン(例: 3.3.3). 複数のバージョンを同時にインストールして使用できます。 ただし、実行中にバージョンを指定する必要があります(つまり、 Pythonの代わりに、python2.7またはpython3.3を使用する必要があります)

Pythonソースコードを含む(圧縮された)アーカイブの取得から始めましょう。 対象とします --version 2.7.6.

wget http://www.python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz

このファイルは、XZライブラリを使用して圧縮されています。 お使いのシステムは、そのバージョンによっては、ない場合があります。 その場合は、以下を実行してXZライブラリをインストールします。

 yum install xz-libs

XZアーカイブをデコードし、tarアーカイブの内容を抽出します。

# Let's decode (-d) the XZ encoded tar archive:
xz -d Python-2.7.6.tar.xz


# Now we can perform the extraction:
tar -xvf Python-2.7.6.tar

を使用してコードベースを確認します ./configure:

# Enter the file directory:
cd Python-2.7.6

# Start the configuration (setting the installation directory)
# By default files are installed in /usr/local.
# You can modify the --prefix to modify it (e.g. for $HOME).
./configure --prefix=/usr/local    

Python2.7.6をビルドしてインストールします。

# Let's build (compile) the source
# This procedure can take awhile (~a few minutes)
make && make altinstall

[オプションの手順]新しいPythonインストール場所をPATHに追加します。

注:デフォルト設定を使用して指示に従った場合は、このセクションを実行する必要はありません。 ただし、Pythonをインストールするために / usr / local とは異なるパスを選択した場合、完全な[インストールを明示せずに実行できるようにするには、次の手順を実行する必要があります。 ]パス毎回

# Example: export PATH="[/path/to/installation]:$PATH"
export PATH="/usr/local/bin:$PATH"

PATHの詳細については、LinuxInformationProjectのPATH定義を読むことを検討してください。

一般的なPythonツールの設定pipとvirtualenv


Pythonをインストールしたら、アプリケーションの作成とデプロイの基本を完了することができます。 このために、最も一般的に使用されるツールの2つpipパッケージマネージャーとvirtualenv環境マネージャーをセットアップします。

これら2つのツールの詳細に興味がある場合、または知識をすばやく更新する場合は、一般的なPythonツール:virtualenvの使用、Pipを使用したインストール、およびパッケージの管理を読むことを検討してください。

新しいPythonインストールを使用したCentOSへのpipのインストール


pipをインストールする前に、その唯一の外部依存関係( setuptools)を取得する必要があります。

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

これにより、[Python]バージョン2.7.6にインストールされます

# Let's download the installation file using wget:
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz

# Extract the files from the archive:
tar -xvf setuptools-1.4.2.tar.gz

# Enter the extracted directory:
cd setuptools-1.4.2

# Install setuptools using the Python we've installed (2.7.6)
python2.7 setup.py install

pip自体のインストールは、その後の非常に簡単なプロセスです。 上記の記事の手順を使用して、cURLライブラリを使用して自動的かつ安全にダウンロードおよびインストールします。

pipのセットアップファイルをダウンロードして、Python(2.7)にインストールしてもらいましょう。

これにより、[Python]バージョン2.7.6にインストールされます

curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python2.7 -

新しいPythonインストールを使用したCentOSへのvirtualenvのインストール


次のコマンドを実行して、pipを使用してvirtualenvをダウンロードしてインストールします。

pip install virtualenv

アプリケーションデプロイメントの開始


サンプルアプリケーションの作成と実際のサーバーのダウンロード(およびインストール)を開始する前に、アプリケーション関連のライブラリとデータを含む仮想環境を作成する必要があります(作成する必要はありませんが、作成する必要があります)。

デプロイメント用のアプリケーションディレクトリの作成


以下を含むアプリケーションディレクトリの構築から始めましょう。

# Folders / Directories
mkdir ~/MyApplication     # Replace the name to suit your needs
mkdir ~/MyApplication/app # Application (module) directory

# Application Files 
touch ~/MyApplication/WSGI.py          # Server entry-point
touch ~/MyApplication/app/__init__.py  # Application file

仮想環境の作成


仮想環境の使用を開始するのは非常に簡単です。

以下を実行して、内部の新しい環境を開始します MyApplication ディレクトリ:

cd ~/MyApplication
virtualenv env

このコマンドは、新しいディレクトリを作成します-と呼ばれます env -アプリケーションモジュールの横 app.

仮想環境での作業


仮想環境を操作するには、いくつかの方法があります。

簡単にするために、2番目のオプションに従い、Pythonインタープリターとpipの場所を明示的に示します。

仮想環境内でのuWSGIのダウンロードとインストール


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

~/MyApplication/env/bin/pip install uwsgi

このコマンドにより、仮想環境内にuWSGIがインストールされます。

Flaskライブラリのダウンロードとインストール


pipを使用してFlaskをインストールするには、次のコマンドを実行します。

~/MyApplication/env/bin/pip install flask

このコマンドにより、Flaskが仮想環境内にインストールされます

サンプルFlaskアプリケーションの作成


デプロイの例を続けるには、サンプルアプリケーションを実行するように設定する必要があります。

単一ページのFlaskアプリケーションを作成(編集)しましょう:

nano ~/MyApplication/app/__init__.py

以下のコンテンツを配置して、単純なFlaskアプリを定義します。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello!"

if __name__ == "__main__":
    app.run()

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

アプリケーションをインポートするサンプルWSGIファイルの作成


通常のシナリオでは、作成したアプリフォルダーにメインのアプリケーションモジュールが含まれます。これを1つのファイルにまとめました。 このアプリケーションモジュールは、アプリオブジェクトとともに、提供されるWSGIファイルによってインポートされます。 このステップでは、アプリケーションをインポートするWSGIファイルを作成し、次のステップでそれをuWSGIアプリケーションサーバーに提供します。

WSGI.py ファイルを作成(編集)しましょう:

nano ~/MyApplication/WSGI.py

以下の内容を配置します。

from app import app

if __name__ == "__main__":
    app.run()

展開段階: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をインストールします。

# Enable EPEL Repository
sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'

# Download and install Nginx
sudo yum install -y 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

Nginxの構成


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

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

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

sudo nano /etc/nginx/nginx.conf

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

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

注: SSLサポートの組み込みについては、最初に次の記事をお読みください:NginxでのSSL証明書の作成。

以下の例では、uwsgiワイヤープロトコルを介したnginxのuWSGIアプリケーションサーバーとのネイティブ統合を利用しています。

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 uwsgicluster {
    
        server 127.0.0.1:8080;
        # server 127.0.0.1:8081;
        # ..
        # .
    
    }

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

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

        # Proxying connections to application servers
        location / {
        
            include            uwsgi_params;
            uwsgi_pass         uwsgicluster;

            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サーバーを構成する方法を参照してください。

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


注:uWSGIを使用したPythonWebアプリケーションのデプロイの詳細については、記事uWSGIWebサーバーを使用してデプロイする方法を確認してください。

uWSGIを使用したアプリケーションの提供


このセクションでは、PythonWSGIアプリケーションがuWSGIWebサーバーでどのように機能するかを確認します。 uWSGIに必要なのは、他のサーバーと同様に、アプリケーションがエントリポイントを提供することです(つまり、 と app 物体)。 起動時に、この呼び出し可能オブジェクトは、構成変数とともにuWSGIに渡され、そのジョブの実行を開始します。 リクエストが到着すると、リクエストを処理し、アプリケーションのコントローラーに渡して処理します。

サーバーの実行


uWSGIには多くのオプションと構成があり、その柔軟性のおかげでそれらを使用するための多くの可能な方法があります。 最初から複雑にすることなく、できるだけ簡単に作業を開始し、さらに高度な方法で作業を続けていきます。

注:以下のコマンドを実行する前に、フォルダーにあることを確認してください。そうでない場合、uwsgiは見つけることができません。 wsgi.py また、アプリケーションオブジェクトappをインポートしません。

簡単な使用例:

# Enter the application directory
cd ~/MyApplication

# Run uWSGI Installed inside the virtual environment
env/bin/uwsgi [option] [option 2] .. -w [wsgi file with app. callable]

uWSGIを実行して、アプリケーションの提供を開始するには wsgi.py、以下を実行します。

cd ~/MyApplication
env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app

# To get uWSGI communicate with Nginx using HTTP:
# env/bin/uwsgi --socket 127.0.0.1:8080 --protocol=http -w WSGI:app

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

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

env/bin/uwsgi --socket 127.0.0.1:8080 -w WSGI:app &

アプリケーションをバックグラウンドで実行する場合は、プロセスマネージャーを使用する必要があります(例: htop)それを殺す(または止める)。 詳細については、以下のセクションを参照してください。

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

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

# Hello, world!

参考文献


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

投稿者: https ://twitter.com/ostezer ”> OS Tezer
モバイルバージョンを終了