この記事では、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ユーザーで次の手順を実行します。
-
adduser sammy
-
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ログを確認してください。
紹介は以上です。アプリケーションセキュリティも原文で紹介されていますが、わかりませんでした。必要に応じて原文を読むことができます。