NginxとGunicornを使用してubuntuでFlaskサービスアプリケーションを公開する

この記事では、NginxとGunicornを使用してFlaskサービスアプリケーションをubuntuで公開する方法を紹介します。Ubuntuの元のバージョンは18で、私のテスト環境は20です。

学習リンク:https//www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04

前提条件

この記事の内容にはnginxのインストールは含まれていません。参照できます:UbuntuへのNginxのインストール、テスト

この記事では、root以外のユーザーが必要ですが、sudoグループに属している必要があります。そうでない場合は、rootユーザーで次の手順を実行します。

  1. adduser sammy

  2. usermod -aG sudo sammy

インストール

以下をせよ:

sudo apt update
sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

Python仮想環境をセットアップする

仮想環境プログラムをインストールする

sudo apt install python3-venv

作業ディレクトリを作成します。 

mkdir ~/myproject
cd ~/myproject

ディレクトリに仮想環境を作成します。

python3.6 -m venv myprojectenv

 上記は元のテキストの操作です。ubuntu18が原因である可能性があります。python3のバージョンは3.6で、ubuntu20のバージョンは3.8です。したがって、私の操作は次のとおりです。

python3.8 -m venv myprojectenv

python3 -m venv myprojectenvを直接実行できるはずです。そうでない場合は、python3のバージョンを確認する必要があります。 

他のアプリケーションをインストールする前に、仮想環境をアクティブ化します。

source myprojectenv/bin/activate

仮想環境にgunicornフラスコをインストールします。仮想環境ではpip3を使用せず、pipを使用します。

pip install gunicorn flask

簡単なサンプルアプリケーションを作成する

非常に単純なFlaskアプリケーションを作成します。

nano ~/myproject/myproject.py

ファイルの内容は次のとおりです。

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

ファイアウォールがある場合は、以下を設定する必要があります。

sudo ufw allow 5000

 次に、アプリケーションを開始します。

python myproject.py

見るべき:

Output
* Serving Flask app "myproject" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

ブラウザに入力します。

http://your_server_ip:5000

上記のyour_server_ipを、ここでホストのIPアドレスに置き換えてください。 

あなたは見ることができるはずです

 これは、単純なFlaskアプリケーションが成功していることを示しています。

WSGIエントリポイントを確立する

wsgiエントリポイントファイルを作成します。

nano ~/myproject/wsgi.py

ファイルの内容は次のとおりです。

from myproject import app

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

Gunicornを構成する

まず、Gunicornアプリケーションをテストします。

cd ~/myproject
gunicorn --bind 0.0.0.0:5000 wsgi:app

次の出力が表示されます。

Output
[2018-07-13 19:35:13 +0000] [28217] [INFO] Starting gunicorn 19.9.0
[2018-07-13 19:35:13 +0000] [28217] [INFO] Listening at: http://0.0.0.0:5000 (28217)
[2018-07-13 19:35:13 +0000] [28217] [INFO] Using worker: sync
[2018-07-13 19:35:13 +0000] [28220] [INFO] Booting worker with pid: 28220

上記のテストフラスコアプリケーションと同様に、ブラウザにIPアドレスとポート番号を入力します。

http://your_server_ip:5000

出力は上記と同じである必要があります。

環境を終了します。

deactivate

以下のウォッチドッグプログラムを作成します。

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

 ファイルの内容は次のとおりです。

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/myproject/myprojectenv/bin"
ExecStart=/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

 ユーザー名はsammyであると想定されており、環境ディレクトリに一貫性があるかどうかは、状況に応じて変更する必要があります。

ExecStart行の説明は次のとおりです。


プロジェクトディレクトリに作成され、Unixソケットファイルmyproject.sockにバインドされた3つのワーカープロセスを開始します(必要に応じて調整する必要があります)umask値を007に設定して、所有者とグループのアクセス権を付与するソケットファイルを作成し、他のアクセス権を制限します。
ファイルで呼び出すことができるWSGIエントリポイントファイル名とPython(wsgi:app)を指定します。

ここで、サービスを開始し、起動時に自動実行を有効にします。

sudo systemctl start myproject
sudo systemctl enable myproject

実行ステータスを確認します。

sudo systemctl status myproject

次のような出力が表示されます。

Output
● myproject.service - Gunicorn instance to serve myproject
   Loaded: loaded (/etc/systemd/system/myproject.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-07-13 14:28:39 UTC; 46s ago
 Main PID: 28232 (gunicorn)
    Tasks: 4 (limit: 1153)
   CGroup: /system.slice/myproject.service
           ├─28232 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007
           ├─28250 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007
           ├─28251 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007
           └─28252 /home/sammy/myproject/myprojectenv/bin/python3.6 /home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007

 Nginxを構成する

Nginxサイト構成ファイルを作成します

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

ファイルの内容は次のとおりです。

server {
    listen 80;
    server_name your_domain www.your_domain;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}

特別な注意:your_domainは実際のドメイン名に置き換える必要があり、sammy / myprojecct / projectの一部も自分のものに変更する必要があります

私の理解では、sammy / projectは作業ディレクトリWorkingDirectoryを指し、myproject.sockは/etc/systemd/system/myproject.serviceのコンテンツに対応するUnixソケットファイルunix:myproject.sockを指します。

Nginxサイト構成ブロック(サーバーブロック構成)を有効にします。

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled

有効にした後、nginxの構成をテストできます。

sudo nginx -t

エラーが発生した場合は、上記の設定ブロックファイルなどの構文を確認したり、/ etc / nginx / sites-enabledディレクトリにデフォルト以外のファイルがあることを確認したり、不要なファイルを削除したりできます。すべてのファイルが構成に追加されるためです。

エラーがない場合は、nginxを再起動できます。

sudo systemctl restart nginx

ファイアウォールのポート番号5000は不要になったため、次のようにファイアウォールを変更できます。

sudo ufw delete allow 5000
sudo ufw allow 'Nginx Full'

ブラウザアドレスにドメイン名を入力します。

http://your_domain

見るべき:

エラーがある場合は、以下を確認できます。

  • sudo less /var/log/nginx/error.log:Nginxエラーログを確認してください。
  • sudo less /var/log/nginx/access.log:Nginxアクセスログを確認してください。
  • sudo journalctl -u nginx:Nginxプロセスログを確認してください。
  • sudo journalctl -u myproject:FlaskアプリケーションのGunicornログを確認してください。

紹介は以上です。アプリケーションセキュリティも原文で紹介されていますが、わかりませんでした。必要に応じて原文を読むことができます。

おすすめ

転載: blog.csdn.net/leon_zeng0/article/details/108837619