みなさん、こんにちは。
今回は、ラズベリーパイ(Raspberry Pi)上で動作しているFlaskアプリに対して、クライアントの接続数を管理する方法をご紹介します。
Flaskアプリを直接公開すると、接続が殺到してリソースを使い果たし、サーバがダウンしてしまう可能性があります。そこで、Nginxをリバースプロキシとして設定し、負荷の管理を行う方法を説明します。
目的と背景
やりたいこと
- 対象サーバ: ラズベリーパイで稼働中のFlaskアプリ
- 制限内容:
- 負荷制限: 同一クライアントIPからの大量リクエストを制限
- 同一IPアドレスからの接続数: 個々のクライアントについて、同時接続を1セッション以内に制限
- 例外: 自ホスト(127.0.0.1)からの接続についてはセッション制限を設けず、自由に接続可能にする
Flaskアプリ自体は軽量ですが、無制限の接続を許すとリソースを消費しすぎ、最悪の場合アプリが落ちてしまうリスクがあります。Nginxを間に挟むことで、これらの制限を効率的に実現できます。
解決方法
今回の解決策は、Nginxのリバースプロキシ機能と接続数・リクエスト数の制限機能を利用することです。具体的には、以下の2つの設定を行います。
- 同一IPからの接続数制限
Nginxのlimit_conn
ディレクティブを使用して、各IPアドレスからの同時接続数を1に制限します。 - 異なるIPからのリクエストレートの制限
Nginxの limit_req ディレクティブを利用し、各IPアドレスごとに1秒あたりのリクエスト数を制限します。
一時的なリクエスト増加に対応できるよう、最大10リクエストまでは即時処理し、それを超えると1秒に1リクエストの制限が適用されます。
また、Nginxを利用していても、直接Flaskアプリのポート(ここでは5000番)にアクセスされると制限が適用されないため、ファイアウォールなどで5000番への直接アクセスをブロックする対策も必要です。
設定手順
1. Nginxのインストール
まずはNginxをインストールします。以下のコマンドを実行してください。
sudo apt install nginx
2. Nginxの設定ファイルの編集
Nginxの設定ファイル(通常は /etc/nginx/sites-available/default
)を編集して、リバースプロキシと接続制限の設定を行います。以下は設定例です。
http {
# 同一IPからの接続数制限ゾーン
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=1r/s;
map $remote_addr $limit_conn_value {
127.0.0.1 1000000; # 自ホストは制限なし(非常に大きな値を設定)
default 1; # 他のホストは同時接続数1に制限
}
server {
listen 8080;
# 127.0.0.1 以外のIPだけリスエスト数を制限
limit_conn conn_limit $limit_conn_value;
limit_req zone=req_limit burst=10 nodelay;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
この設定により、Nginxは8080番ポートで外部からのリクエストを受け付け、内部で動作するFlaskアプリ(5000番ポート)へリクエストを転送します。同時に、各クライアントIPアドレスからの接続数を1つに制限し、1秒あたりのリクエスト数を1件に制限します。ただし、短時間に集中して発生するリクエストに対しては、最大10件まで遅延なく処理し、それ以降のリクエストは1秒あたり1件のペースで処理します。
3. Flaskアプリの設定
Flaskアプリは5000番ポートで起動するように設定します。app.py
の起動部分は以下のように記述してください。
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=False)
※ host='0.0.0.0'
にすることで、外部からのアクセスを許可します。
4. Nginxの再起動と動作確認
設定を変更したら、文法をチェックして問題なければNginxを再起動して変更を反映させます。
# 設定ファイルの文法チェック
sudo nginx -t
# 正常であればNginxを再起動
sudo systemctl restart nginx
また、設定変更後は /var/log/nginx/error.log
などのエラーログを確認し、設定に問題がないかチェックしましょう。
注意点
- 直接アクセス対策:
Nginxを介さずにFlaskアプリのポート5000にアクセスされると、接続制限が適用されません。
必要に応じて、ファイアウォールなどでポート5000への直接アクセスを遮断してください。 - 設定変更後の再起動:
Nginxの設定を変更した場合は必ず再起動し、動作確認を行ってください。
まとめ
以上が、Nginxを利用してFlaskアプリへの接続を制限する方法です。これにより、各クライアントの過剰な接続やリクエストを制限し、サーバの負荷を軽減できます。
みなさんもぜひお試しください。
本日も最後までお読みいただきありがとうございました。
それではよいIoTライフを!