今回は、Apache Webserver Software と mod_wsgi WSGI を使用して、Flask Application を Virtual Private Server (VPS) にデプロイします。
VPSとは?
VPSとは、Virtual Private Server の略で、様々なホスティング会社がサービスとして販売している仮想マシンのことです。
ノートパソコンのCPUハードウェアに似ていますが、生の状態、つまりScreenやキーボードなどがない状態と考えていただければよいでしょう。
GoogleやAmazonなど、さまざまな企業がクラウドサーバーサービス(GCP、AWSなど)を提供しています。
このサービスの一環として、世界のさまざまな場所にあるサーバーを借りることができます。
使用時間やCPU使用率など、様々な基準に基づいて課金されます。
クラウドサーバーを利用することで、以下のような利点がある。
- クラウドサーバーを使うと、次のような利点がある。ローカルホスト(ラップトップ)の場合、24時間稼働させ続ける必要があり、現実的ではありません。
- スケーラビリティ – ストレージが一杯になった場合でも、クラウド上ではサービス(ストレージ、RAMなど)を迅速にスケールアウトすることができます。
- 安全性 – すべてのハードウェアがクラウドセンター内にあるため、より安全です。
- アクセス性 – どのラップトップやコンピューターからでもクラウドサーバーにアクセスすることができます。
この記事では、デプロイメントの目的でAWS – Amazon Web Servicesを使用する予定です。
あなたは、VPSプロバイダのいずれかを使用することができます。
インターネット上でアプリケーションを実行するために必要なソフトウェア
さて、VPSにデプロイされたFlaskアプリケーションは、以下のことを実行する必要があります。
- HTML/ CSS/ JS のような静的ファイルをホストします。
- Httpリクエストの処理
- クラッシュからのリカバリ
- 必要なときにスケールアップ
これらのタスクを実行するために、以下のソフトウェアが必要です。
- ウェブサーバーソフトウェア(Apache、Nginxなど) 2.
- Web Server Gateway Interface (WSGI) アプリケーションサーバー – Mod_WSGI, Gunicorn, etc.
- 実際のWebアプリケーション – Flask、Djangoなどを使って書かれたもの
ここでは、ApacheのようなWebサーバーソフトウェアが、ドメインロジックを処理し、HTTPリクエストを受け付けるために必要です。
適切なリクエストは、WSGIアプリケーションサーバ(mod_wsgi、Gunicornなど)を介して、メインのWebアプリケーション(Flask)に送信されます。
WSGIアプリケーションサーバーは、ApacheソフトウェアとFlaskアプリケーションの間のゲートウェイインターフェースを提供します。
WSGIの主な用途は、リクエストをpythonで読める形式に変換してアプリケーションコード(Flask-pythonで書かれています)に送り、そのアプリケーションが必要な機能を実行し、応答Webページを返します。
したがって、WSGIはApacheとFlaskアプリケーションの間のゲートウェイとして動作します。
それらを個別に見てみましょう
この記事もチェック:Flaskにおけるアプリケーションコンテキストとリクエストコンテキストを解説する
ウェブサーバーソフトウェアとは?
ウェブサーバーソフトウェアの主な役割は、インターネット上でウェブサイトをホストすることです。
それは、サーバーとクライアントマシンの間の仲介役として機能します。
これらのソフトウェアアプリケーションは、クライアントの要求を処理し、その後、サーバー上に存在する物理ファイル(テンプレート/データ)を返し、クライアントにそれらを表示します。
ウェブサーバーソフトウェアの例としては、Apache、NGINXなどがあります。
この記事では、インターネット上のWebアプリケーションの約47%をホストしている、古き良きApacheサーバーを使用することにします。
mod_wsgi WSGI Application Server とは何ですか?
mod_wsgi は Apache HTTP Server のモジュールで、Python ベースのウェブアプリケーションを Apache でホストするための WSGI 準拠のインターフェイスを提供します。
Python バージョン 2 と 3 をサポートしており、Apache ソフトウェアとクラウドサーバ上の Flask アプリケーションの間のインターフェイスとして動作します。
VPSにFlaskプロジェクトをデプロイする
最初のステップは、VPSプロバイダからサーバを選択することです。
VPS を提供している会社では、以下のように異なる OS で動作するサーバを複数台持っています。
ssh username@<server_IP>
|
必要なサーバーを選択したら、いくつかのステップを経て、サーバーをセットアップして起動する必要があります。
クラウドサーバーのHTTPポート(80)が有効になっていることを確認してください。
80番ポートとは、Webサーバーソフト(Apacheなど)がWebクライアントからのリクエストを「リッスン」するためのポートです。
sudo apt update
sudo apt upgrade
|
サーバーのセットアップが完了すると、サーバーのIPアドレスまたはパブリックDNSが取得され、後にクラウドサーバーに接続するために必要となります。
sudo apt install apache2
sudo apt install libapache2-mod-wsgi
|
1. ローカルコンピューターからクラウドサーバーに接続する
サーバーへの接続には、ssh コマンドを使用します。
ローカルコンピューターからクラウドサーバーに接続するには、以下のコマンドを実行します。
- Mac または Linux を使用する場合。
Mac または Linux の場合: シェルで、次のコードを実行します。
sudo apt install python-pip
|
Ubuntuサーバーの場合、ユーザー名はubuntuです。
- Windowsの場合
Windowsの場合、PuTTYというインターネットから直接ダウンロードできるソフトを使用します。
ダウンロードしたら、そこにcloud_IPを入力し、openを押してください。
sudo pip install flask
sudo pip install flask_sqlalchemy
.... .... |
私のサーバーにアクセスするために使用するcloud_IP/Public DNSは以下の通りです。
mkdir flask_project
cd flask_project
|
AWSの場合は、さらに秘密鍵を使用する必要があります。
そのため、VPSプロバイダによっては、security_keyを追加する必要があります。
これで、クラウドサーバーOSにログインできるようになります。
scp -i <path/to/secret_key> -r <path/to/file> ubuntu@<public_DNS>:<path/to/destination> |
2. 必要なパッケージのインストール
サーバーに接続すると、新しいubuntuのコンピュータと同じような状態になります。
まず、重要なパッケージをすべてインストールする必要があります。
そこで、以下のコマンドを実行します。
アップグレードのインストール
sudo ln -sT ~ /flask_project /var/www/html/flask_project
|
サーバーを起動したら、必ずシステムをアップデートしてください。
サーバーにapache2とmod_wsgiをインストールする
まず、Apache2とmod_wsgiパッケージをシステムにインストールします。
sudo nano app.py
|
Apache2が動作しているかどうかを確認するために、クラウドサーバーのPublic DNS/IPアドレスにアクセスします。
Apache Default Pageが表示されます。
python3-pipのインストール
python3とpipをインストールします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from flask import Flask
app = Flask(__name__)
@app .route( '/blogs' )
def blogs():
return 'Welcome to The Blog App'
@app .route( '/blog/<int:id>' )
def blog( id ):
return "The Blog id is {}" . format ( id )
if __name__ = = '__main__' :
app.run()
|
Flaskとその拡張機能のインストール
Flask Frameworkと、Flask_SQLAlchemy, Flask_login, Flask_wtf, etcのようなFlask Extensionsのインストールを行います。
1
2
3
4
5
|
#flaskapp.wsgi import sys
sys.path.insert( 0 , '/var/www/html/flask_project' )
from app import app as application
|
Flask Project に必要な Flask Extensions をインストールします。
この記事もチェック:Flaskの便利な拡張機能(Extension)を紹介していく
3. Flask プロジェクトをローカルマシンからクラウドサーバに転送する
新しいディレクトリを作成し、そこに Flask アプリを nano テキストエディタでコーディングします。
cd /etc/apache2/sites-enabled/
|
より良いオプションは、ローカルマシンでプロジェクトをコーディングして、flask_projectフォルダをクラウドサーバに転送することです。
ファイルを転送するには、次のコードを使用します。
WSGIDaemonProcess flask_project threads=5 WSGIScriptAlias / /var/www/html/flask_project/app.wsgi < Directory flask_project>
WSGIProcessGroup flask_project
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</ Directory >
|
sudo service apache2 restart
|
AWSの場合、セキュリティキーを入れる必要もあります。
VPSプロバイダでセキュリティキーがない場合は、コマンドからkey_pathを削除してください。
ホームディレクトリにある Flask Application Project ディレクトリ flask_project と Apache の Configurations (/var/www/html ディレクトリにある) をリンクします。
コードで行います。
この記事もチェック:Flaskのライブラリflask-wtfの使い方|簡単にフォームを作成するよ
4. Flask アプリケーションのコーディング
Flask_project フォルダの中に、app.py, models.py, Templates など、全ての Flask ファイルがあるはずです。
単純な Flask Application をコーディングしてみましょう。
を作成し、コードを追加します。
その後、WSGI ファイルを作成する必要があります。
そのために、メインの Flask Application File と同じ名前の .wsgi ファイルを作成します。
私の場合、app.wsgi です。
nano app.wsgi を使って、以下のコードを追加します。
素晴らしい! 次に、Apache が Flask アプリケーションとやり取りするために、mod_wsgi を有効にする必要があります。
そのためには、/etc/apache2/sites-enabled/ に行ってください。
nano Text editor で 000-default.conf を開き、DocumentRoot /var/www/html の行の下に、以下のコードを追加します。
Flaskアプリケーションの実行
以上で、apache サーバの再起動は完了です。
そして公開DNSにアクセスすると、ウェブサイトが稼働します!
同様に、他のURLにも
完璧です。
まとめ
これであなたの Flask アプリケーションはクラウドサーバ上で動作するようになりました。
ぜひ、クラウドサーバ上で自分の Flask アプリケーションを動かしてみてください。