Ubuntu 14.04でuWSGIおよびNginxを使用してWeb2py Pythonアプリケーションをデプロイする方法

前書き

web2pyフレームワークは、フル機能のPython Webアプリケーションを迅速に開発するための強力で使いやすいツールです。 web2pyでは、管理Web UIを使用してアプリケーションを簡単に開発および管理できます。

このガイドでは、Ubuntu 14.04にweb2pyアプリケーションをデプロイする方法を示します。 uWSGIアプリケーションサーバーを使用して、複数のワーカープロセスでアプリケーションとインターフェイスします。 uWSGIの前で、実際のクライアント接続を処理するために、リバースプロキシ構成でNginxをセットアップします。 これは、web2pyサーバーまたはuWSGIを単独で使用するよりもはるかに堅牢な展開戦略です。

前提条件と目標

このガイドを完了するには、 `+ sudo +`特権が設定された非rootユーザーを持つ新しいUbuntu 14.04サーバーインスタンスが必要です。 https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 [初期サーバーセットアップガイド]を実行して、これを設定する方法を学ぶことができます。

web2pyフレームワークをダウンロードしてテストし、デフォルトのアプリケーション環境が正しく機能することを確認します。 その後、リクエストとweb2py Pythonコード間のインターフェースとして機能するuWSGIアプリケーションコンテナをダウンロードしてインストールします。 クライアント接続とuWSGIへのプロキシ要求を処理できるように、この前にNginxをセットアップします。 管理上の介入の必要性を最小限に抑えるために、ブート時に開始するように各コンポーネントを構成します。

web2pyフレームワークをダウンロードする

最初のステップは、実際のweb2pyフレームワークをダウンロードすることです。 これはGitHubの `+ git `リポジトリに保持されているため、ダウンロードする最良の方法は ` git +`自体を使用することです。

次のように入力して、デフォルトのUbuntuリポジトリから「+ git +」をダウンロードしてインストールできます。

sudo apt-get update
sudo apt-get install git

`+ git `がインストールされたら、リポジトリをユーザーのホームディレクトリに複製できます。 好きなようにアプリケーションに名前を付けることができます。 この例では、簡単にするために「+」という名前を使用しています。 データベース抽象化レイヤーは独自の `+ git `サブモジュールとして処理されるため、 `-recursive +`フラグを追加する必要があります。

git clone --recursive https://github.com/web2py/web2py.git ~/

web2pyフレームワークは、ホームディレクトリ内の `+ myapp +`というディレクトリにダウンロードされます。

ディレクトリに移動して、デフォルトのアプリケーションをテストできます。

cd ~/

管理インターフェイスはSSLで保護する必要があるため、簡単な自己署名証明書を作成してこれをテストできます。 次のように入力して、サーバーキーと証明書を作成します。

openssl req -x509 -new -newkey rsa:4096 -days 3652 -nodes -keyout .key -out .crt

生成する証明書の情報を入力する必要があります。 この状況で実際に重要なのは、サーバーのドメイン名またはIPアドレスを参照する「+ Common Name +」フィールドのみです。

. . .

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:[email protected]

終了したら、SSLキーと証明書がアプリケーションディレクトリにあるはずです。 これらはそれぞれ「+ .key」および「+ .ctrl」と呼ばれます。

これが完了したら、web2py Webインターフェースを起動してテストできます。 これを行うには、次のように入力します。

python web2py.py -k .key -c .crt -i 0.0.0.0 -p 8000

管理インターフェースのパスワードを選択するよう求められます。

これで、次の場所に移動して、Webブラウザーでアプリケーションにアクセスできます。

https://:8000

上記のアドレスでは、必ず `+ http `の代わりに ` https +`を使用してください。 ブラウザがSSL証明書を認識しないという警告が表示されます。

画像:https://assets.digitalocean.com/articles/web2py_uwsgi_nginx_1404/ssl_warning.png [web2py SSL警告]

これは、独自の証明書に署名したためです。 「詳細」リンクをクリックするか、ブラウザから提供される他のリンクをクリックして、予定どおりにサイトに進みます。 web2pyインターフェースが表示されます:

image:https://assets.digitalocean.com/articles/web2py_uwsgi_nginx_1404/welcome_app.png [web2pyウェルカムアプリ]

右端の「管理インターフェース」ボタンをクリックすると、サーバーの実行時に選択したパスワードを入力し、管理サイトにアクセスできるはずです。

image:https://assets.digitalocean.com/articles/web2py_uwsgi_nginx_1404/admin_interface.png [web2py admin interface]

これにより、アプリケーションを実行している実際のコードにアクセスでき、インターフェイス自体からファイルを編集および調整できます。

見回し終えたら、ターミナルウィンドウにCTRL-Cを再度入力します。 アプリケーションをテストし、web2py開発サーバーの実行中にWebからアクセスできることを実証しました。

uWSGIのインストールと構成

web2pyアプリケーションが動作するようになったので、uWSGIを構成できます。 uWSGIは、WSGIと呼ばれる標準インターフェイスを介してアプリケーションと通信できるアプリケーションサーバーです。 詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14-04をご覧ください。 Ubuntu 14.04でのuWSGIおよびNginxのセットアップに関するガイドの#definitions-and-concepts [このセクション]。

uWSGIのインストール

上記のリンクガイドとは異なり、このチュートリアルでは、uWSGIをグローバルにインストールします。 uWSGIをインストールする前に、 + pip +、Pythonパッケージマネージャー、およびuWSGIが依存するPython開発ファイルをインストールする必要があります。 これらをUbuntuのリポジトリから直接インストールできます。

sudo apt-get install python-pip python-dev

次のように入力して、 `+ pip +`でuWSGIをグローバルにインストールできます。

sudo pip install uwsgi

uWSGIアプリケーションコンテナサーバーは、WSGIインターフェイス仕様を使用してPythonアプリケーションとインターフェイスします。 web2pyフレームワークには、 `+ handlers +`ディレクトリ内にこのインターフェースを提供するように設計されたファイルが含まれています。 ファイルを使用するには、ディレクトリからプロジェクトのメインディレクトリに移動する必要があります。

mv ~//handlers/wsgihandler.py ~/

メインプロジェクトディレクトリのWSGIハンドラーを使用して、uWSGIが次のように入力してアプリケーションを提供できることを確認できます。

uwsgi --http :8000 --chdir ~/ -w wsgihandler:application

これにより、ポート8000​​でアプリケーションが再び起動します。 今回は、SSL証明書とキーを使用していないため、HTTPSではなくプレーンHTTP経由で提供されます。 `+ http +`プロトコルを使用して、ブラウザでこれを再度テストできます。 暗号化が利用できない場合、web2pyはこれを無効にするため、管理インターフェイスをテストすることはできません。

終了したら、ターミナルウィンドウでCTRL-Cを入力してサーバーを停止します。

uWSGI構成ファイルの作成

uWSGIがアプリケーションを提供できることがわかったので、アプリケーションの情報を使用してuWSGI構成ファイルを作成できます。

`+ / etc / uwsgi / sites +`にディレクトリを作成して設定を保存し、そのディレクトリに移動します。

sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites

設定ファイルを `+ myapp.ini +`と呼びます:

sudo nano .ini

設定ファイルでは、すべての設定ディレクティブが配置される `+ [uwsgi] +`ヘッダーで開始する必要があります。 ヘッダーの後に、アプリケーションのディレクトリパスを示し、実行するモジュールを伝えます。 これは、以前にコマンドラインで使用した情報と同じです。 モジュール行を変更する必要はありません。

[uwsgi]
chdir = /home//
module = wsgihandler:application

次に、uWSGIがマスターモードで動作するように指定する必要があります。 5つのワーカープロセスを生成します。

[uwsgi]
chdir = /home//
module = wsgihandler:application

master = true
processes = 5

次に、uWSGIが接続を取得する方法を指定する必要があります。 uWSGIサーバーのテストでは、通常のHTTP接続を受け入れました。 ただし、uWSGIの前でNginxをリバースプロキシとして構成するため、他のオプションがあります。 Nginxは、他のサーバーと通信するためにuWSGIによって設計された高速バイナリプロトコルである「+ uwsgi +」プロトコルを使用してプロキシできます。 このプロトコルを使用して通信します。これは、別のプロトコルを指定しない場合のデフォルトです。

`+ uwsgi +`プロトコルを使用してNginxと通信しているため、ネットワークポートは必要ありません。 代わりに、より安全で高速なUnixソケットを使用します。 これをアプリケーションディレクトリに配置します。 グループがソケットを読み書きできるように、アクセス許可を変更する必要があります。 すぐに、uWSGIとNginxがソケットを介して通信できるように、Nginxプロセスにソケットの所有権を付与します。

[uwsgi]
chdir = /home//
module = wsgihandler:application

master = true
processes = 5

socket = /home///.sock
chmod-socket = 660
vacuum = true

上記の `+ vacuum +`ディレクティブは、uWSGIプロセスの終了時にソケットファイルをクリーンアップします。

uWSGI構成ファイルが完成しました。 ファイルを保存して閉じます。

uWSGI Upstartファイルを作成する

uWSGIの構成ファイルを作成しましたが、ブート時に自動的に起動するようにアプリケーションサーバーを設定していません。 この機能を実装するために、単純なUpstartファイルを作成できます。 アプリケーションサーバーが任意の数の構成を読み取り、それぞれに対してサーバーを起動できるようにする「Emperorモード」でuWSGIを実行するように指示します。

Upstartプロセスが設定ファイルを探す `+ / etc / init +`ディレクトリにファイルを作成します。

sudo nano /etc/init/uwsgi.conf

まず、サービスファイルに説明を付け、どのランレベルで自動的に開始するかを示します。 従来のマルチユーザーランレベルは2、3、4、および5です。 サーバーが他のランレベル(シャットダウン、再起動、シングルユーザーモードなど)に移行すると、Upstartがサービスを停止します。

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

次に、プロセスを実行するユーザーとグループを指定する必要があります。 すべてのプロジェクトファイルを所有しているため、通常のユーザーアカウントを使用します。 私たちのグループでは、 `+ www-data`グループの所有権を許可する必要があります。これは、Nginxが運営するグループです。 これにより、uWSGI configがソケットグループに読み取りおよび書き込み権限を与えたため、WebサーバーがuWSGIと自由に通信できるようになります。

その後、uWSGIを起動するために実行するコマンドを指定するだけです。 `+-emperor +`フラグを使用して、設定ファイルを含むディレクトリを渡すだけです。

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

setuid
setgid www-data

exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites

これにより、web2pyサイトを処理するuWSGIアプリケーションサーバーが起動します。 Emperorモードでは、他のプロジェクト用にこのディレクトリに構成ファイルを簡単に追加できます。 それらは自動的に処理されます。

これで、Upstartスクリプトが完成しました。 ファイルを保存して閉じます。 この時点では、Nginxをまだインストールしていないため、uWSGIサービスを開始できません。 これは、スクリプトを実行するように指示したグループがまだ利用できないことを意味します。

Nginxをリバースプロキシとしてインストールおよび構成する

uWSGIが構成され、準備ができたら、Nginxをリバースプロキシとしてインストールして構成できます。 これは、Ubuntuのデフォルトリポジトリからダウンロードできます。

sudo apt-get install nginx

Nginxをインストールしたら、先に進み、サーバーブロック構成を変更できます。 必要なもののほとんどを備えているため、デフォルトのサーバーブロックをベースとして使用します。

sudo nano /etc/nginx/sites-available/default

web2pyアプリケーションは、プレーンHTTPまたはSSL暗号化のどちらで接続しているかを検出します。 このため、ファイルには実際に各サーバーブロックが含まれます。 ポート80で動作するように構成されたサーバーブロックから始めます。

サイトにアクセスできるドメイン名またはIPアドレスを参照するように「+ server_name 」を変更します。 その後、静的コンテンツのリクエストに一致する ` location {} `ブロックを作成します。 基本的に、正規表現を使用して、「 / static / 」で終わるリクエストを前のパスコンポーネントと照合します。 これらのリクエストをweb2pyプロジェクト内の ` applications +`ディレクトリにマッピングしたいと思います。 ユーザーのホームディレクトリとアプリ名を必ず参照してください。

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.html index.htm;

   server_name ;





   . . .

その後、リクエストをuWSGIソケットに渡すために、 `+ location / {} `ブロックを調整する必要があります。 Nginxにパッケージ化されたuWSGIパラメーターファイルをインクルードし、構成したソケットにリクエストを渡すだけです(uWSGI ` .ini +`ファイルで):

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.html index.htm;

   server_name ;

   location ~* /(\w+)/static/ {
       root /home///applications/;
   }

   location / {


   }
}

これが、最初のサーバーブロックに必要なすべてです。

ファイルの下部には、SSLでコンテンツを提供するために必要なほとんどのディレクティブを含むコメント化されたセクションがあります。 このブロックには、最初のディレクティブとして「+ listen 443; +」があるため、識別できます。 このブロックのコメントを解除して、構成を開始します。

開始するには、サーバーのドメイン名またはIPアドレスと一致するように `+ server_name `を再度変更します。 次に、「 ssl_certificate 」および「 ssl_certificate_key 」ディレクティブにジャンプできます。 生成したSSL証明書を一時的に ` / etc / nginx / ssls`のディレクトリに配置するため、その場所にあるファイルへのパスを指定します。

server {
   listen 443;
   server_name ;

   root html;
   index index.html index.htm;

   ssl on;
   ssl_certificate ;
   ssl_certificate_key ;

   . . .

`+ ssl_protocols +`リストで、プロトコル自体に固有の脆弱性があることがわかっているため、SSLv3を削除します。

次に、 `+ location / {} +`ブロックにジャンプして、最後のサーバーブロックで行ったのと同じuWSGIプロキシ情報を配置できます。

server {
   listen 443;
   server_name ;

   root html;
   index index.html index.htm;

   ssl on;
   ssl_certificate /etc/nginx/ssl/.crt;
   ssl_certificate_key /etc/nginx/ssl/.key;

   ssl_session_timeout 5m;

   ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
   ssl_prefer_server_ciphers on;

   location / {


   }
}

これで、このファイルに2つのサーバーブロックが構成されました。 完了したら保存して閉じます。

最終ステップ

次に、指定したディレクトリにSSL証明書を移動する必要があります。 最初にディレクトリを作成します。

sudo mkdir -p /etc/nginx/ssl

次に、作成した証明書とキーをそのディレクトリに移動します。 商用認証局によって署名されたSSL証明書を持っている場合、ここで証明書と対応するキーを置き換えて、訪問者に対する信頼できないSSL証明書の警告を回避できます。

sudo mv ~//.crt /etc/nginx/ssl
sudo mv ~//.key /etc/nginx/ssl

ルート以外のユーザーがそのディレクトリにアクセスできないように、アクセス許可を変更します。

sudo chmod 700 /etc/nginx/ssl

次に、Nginx構成ファイルの構文エラーを確認します。

sudo nginx -t

構文エラーが報告されていない場合、Nginxを再起動できます。

sudo service nginx restart

uWSGIサービスを開始することもできます。

sudo service uwsgi start

最後に行う必要があるのは、ポート443で接続を提供するときに正しく読み取られるように、アプリケーションのパラメーターファイルをコピーすることです。 これには、管理インターフェイス用に設定したパスワードが含まれています。 ポート8000​​ではなくポート443を示す新しい名前にコピーするだけです。

cp ~//parameters_8000.py ~//parameters_443.py

これにより、サーバーのドメイン名またはIPアドレスを使用してサーバーにアクセスできるようになります。 管理インターフェイスにサインインする場合は、「+ https +」を使用します。

結論

このガイドでは、サンプルのweb2pyプロジェクトをセットアップしてデプロイを練習しました。 アプリケーションとクライアントのリクエスト間のインターフェースとして機能するようにuWSGIを設定しました。 次に、SSL接続を可能にし、クライアントリクエストを効率的に処理するために、uWSGIの前にNginxをセットアップします。

web2pyプロジェクトは、最初から実行可能なWebインターフェースを提供することにより、サイトおよびWebアプリケーションの開発を簡素化します。 この記事で説明した一般的なツールチェーンを活用することで、単一のサーバーから作成したアプリケーションを簡単に提供できます。

Related