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

前書き

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

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

前提条件と目標

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

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

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

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

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

sudo yum 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_centos7/ssl_warning.png [web2py SSL警告]

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

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

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

image:https://assets.digitalocean.com/articles/web2py_uwsgi_nginx_centos7/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開発ファイルをインストールする必要があります。 また、実際のバイナリをビルドするためのコンパイラも必要です。 `+ pip +`を取得するには、追加のパッケージを含むEPELリポジトリを使用する必要があります。

次のように入力してEPELリポジトリをアクティブ化できます。

sudo yum install epel-release

その後、入力することで必要なパッケージをインストールできます

sudo yum install python-devel python-pip gcc

次のように入力して、 `+ 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をリバースプロキシとして構成するため、他のオプションがあります。

ネットワークポートを使用する代わりに、すべてのコンポーネントが単一のサーバーで動作しているため、Unixソケットを使用できます。 これはより安全であり、パフォーマンスが向上します。 このソケットはHTTPを使用しませんが、代わりにuWSGIの「+ uwsgi 」プロトコルを実装します。これは、他のサーバーと通信するために設計された高速バイナリプロトコルです。 Nginxは、 ` uwsgi +`プロトコルを使用してネイティブにプロキシできるため、これが最良の選択です。

ファイルを所有しているため、プロセスを実行するユーザーを独自のユーザーに設定する必要があります。 また、Webサーバーに書き込みアクセス権を与えるため、ソケットのアクセス許可と所有権も変更します。 ソケット自体は、uWSGIとNginxの両方がアクセスできる `+ / run / uwsgi +`ディレクトリ(このディレクトリを少し作成します)内に配置されます。 サービスの停止時にソケットファイルが自動的にクリーンアップされるように、バキュームオプションを設定します。

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

master = true
processes = 5

uid =
socket = /run/uwsgi/.sock
chown-socket = :nginx
chmod-socket = 660
vacuum = true

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

uWSGIのSystemd Unitファイルを作成する

uWSGIの構成ファイルを作成しましたが、ブート時に自動的に起動するようにアプリケーションサーバーを設定していません。 この機能を実装するために、Systemdユニットファイルを作成できます。

ユーザーが作成したユニットファイルが保存されている `+ / etc / systemd / system`ディレクトリにユニットファイルを作成します。 ファイルを「+ uwsgi.service +」と呼びます。

sudo nano /etc/systemd/system/uwsgi.service

メタデータの指定に使用される `+ [Unit] +`セクションから始めます。 サービスの説明をここに入力します。

[Unit]
Description=uWSGI Emperor service

次に、[サービス]セクションを開きます。 ExecStartPreディレクティブを使用して、サーバーの実行に必要な部分を設定します。 これにより、/ run / uwsgiディレクトリが作成され、通常のユーザーがNginxグループをグループ所有者として所有するようになります。 -pフラグを指定したmkdirとchownコマンドは、すでに存在していても正常に戻ります。 これが私たちが欲しいものです。

ExecStartディレクティブで指定された実際の開始コマンドの場合、uwsgi実行可能ファイルをポイントします。 「Emperorモード」で実行するように指示し、/ etc / uwsgi / sitesにあるファイルを使用して複数のアプリケーションを管理できるようにします。 Systemdがプロセスを正しく管理するために必要な部分も追加します。 これらは、uWSGIドキュメントhttp://uwsgi-docs.readthedocs.org/en/latest/Systemd.html [こちら]から取得されます。

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown :nginx /run/uwsgi'
ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

これで、[Install]セクションを追加するだけです。 これにより、サービスをいつ自動的に開始するかを指定できます。 サービスをマルチユーザーシステム状態に関連付けます。 システムが複数のユーザー(通常の動作状態)に設定されるたびに、当社のサービスが有効になります:

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown :nginx /run/uwsgi'
ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

これが終了したら、ファイルを保存して閉じます。

nginxユーザーが利用可能であることに依存しているため、この時点ではサービスを正常に開始できません。 Nginxがインストールされるまで、uWSGIサービスの開始を待つ必要があります。

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

uWSGIが構成され、準備ができたら、Nginxをリバースプロキシとしてインストールして構成できます。 これは、「+ yum +」で次のように入力してダウンロードできます。

sudo yum install nginx

Nginxをインストールしたら、先に進み、サーバーブロック構成を変更できます。 メインのNginx構成ファイルを編集します。

sudo nano /etc/nginx/nginx.conf

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

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

server {
   listen                  80 default_server;
   server_name             ;
   root                    /usr/share/nginx/html;

   include /etc/nginx/default.d/*.conf;





   . . .

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

server {
   listen                  80 default_server;
   server_name             ;
   root                    /usr/share/nginx/html;

   include /etc/nginx/default.d/*.conf;

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

   location / {


   }
}

   . . .

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

ファイルの下部で、閉じている `+ http {} `ブロックブラケットの内側に、別の ` server {} +`ブロックを作成します。 これを使用して、SSL接続を構成します。

基本から始めましょう。 このサーバーブロックは、デフォルトのSSLポートであるポート443で接続をリッスンします。 ポート80サーバーブロックの場合と同様に、サーバーのドメイン名またはIPアドレスを設定します。 実際のSSL構成を開始するには、このブロックでSSLを有効にすることを指定し、接続の暗号化に使用するSSL証明書とキーへのパスを指定します。 ファイルを一時的にそこに移動します。

http {
   . . .
   server {
       listen 80;
       . . .
   }








}

受け入れられたプロトコルと暗号を確立するためのSSLボイラープレートを少し続けます。 その後、ポート80サーバーブロックで設定したのと同じ `+ location / {} +`ブロックを設定できます。

http {
   . . .
   server {
       listen 80;
       . . .
   }
   server {
       listen 443;
       server_name ;

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









   }
}

これで、このファイルに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 `ユーザーは、必要に応じて静的ファイルを直接提供できるように、アプリケーションディレクトリにアクセスできる必要があります。 CentOSは各ユーザーのホームディレクトリを非常に厳しくロックダウンするため、ユーザーのグループに「 nginx +」ユーザーを追加して、これが機能するために必要な最小限の権限を開放できるようにします。

これを入力して、 `+ nginx`ユーザーをグループに追加します。 以下のコマンドの「+ user +」をユーザー名に置き換えます。

sudo usermod -a -G  nginx

次に、ユーザーグループにディレクトリの実行権限を付与します。これにより、Nginxプロセスが次の場所にコンテンツを入力してアクセスできるようになります。

chmod 710 /home/

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

sudo nginx -t

構文エラーが報告されない場合、Nginxを開始できます。

sudo service nginx start

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

sudo service uwsgi start

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

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

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

すべてがうまくいけば、NginxとuWSGIを有効にしてブート時に起動できます:

sudo systemctl enable nginx
sudo systemctl enable uwsgi

結論

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

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

Related