HTTP でファイルを提供することで、ストレージプロバイダは HTTP サーバと相互作用するツールのエコシステムを利用することができます。例えば、nginx を使用すると、SP はファイルをダウンロードできる人、1 秒あたりのリクエスト数、各クライアントが 1 秒あたりで使用できるダウンロード帯域幅を制限できます。
デフォルトでは、nginxは設定ファイルを/etc/nginxに配置します。
デフォルトの設定ファイルは、/etc/nginx/sites-available/default です。
IPFSゲートウェイは/ipfsからファイルを提供するので、ロケーション/ipfs/のサーバーブロックを追加します。nginxサーバはポート7575でリッスンし、ポート7777でbooster-httpにリクエストを転送します:
# ipfs gateway config
server {
listen 7575 default_server;
listen[::]: 7575 default_server;
location / ipfs / {
proxy_pass [http://127.0.0.1:7](http://127.0.0.1:7878/)777;
}
}
アクセスを制限する
標準の.htaccessファイルを使用して、IPFSゲートウェイへのアクセスを制限してみましょう。ユーザー名とパスワードを設定した.htaccessファイルを設定する必要があります。aliceという名前のユーザーを作成します:
$ mkdir /etc/nginx/ipfs-gateway.conf.d
$ htpasswd -c /etc/nginx/ipfs-gateway.conf.d/.htpasswd alice
New password:
Re-type new password:
Adding password for user alice
etc/nginx/sites-available/defaultの.htaccessファイルを含めます:
location /ipfs/ {
# htaccess authentication
auth_basic “Restricted Server”;
auth_basic_user_file /etc/nginx/ipfs-gateway.conf.d/.htpasswd;
proxy_pass [http://127.0.0.1:7878](http://127.0.0.1:7878/);
}
これで、/ipfsというパスで任意のURLを開くと、サインインダイアログが表示されるようになりました:
レートリミットの設定
ユーザーが1秒間にあまりにも多くのリクエストをするのを防ぐために、レートリミットを追加してみましょう。
まず、/etc/nginx/ipfs-gateway.conf.d/ipfs-gateway.confにレート制限を設定するファイルを作成します。このファイルに、クライアントIPごとに、1秒間に1リクエストというリクエストゾーン制限を追加します:
limit_req_zone $binary_remote_addr zone=client_ip_10rs:1m rate=1r/s;
etc/nginx/sites-available/defaultからipfs-gateway.confをインクルードし、リクエストが多すぎる場合の応答をHTTPレスポンスコード429に設定します:
include /etc/nginx/ipfs-gateway.conf.d/ipfs-gateway.conf;
server {
listen 7575 default_server;
listen [::]:7575 default_server;
location /ipfs/ {
# htaccess authentication
auth_basic “Restricted Server”;
auth_basic_user_file /etc/nginx/ipfs-gateway.conf.d/.htpasswd;
limit_req zone=client_ip_10rs;
limit_req_status 429;
proxy_pass http://127.0.0.1:7878;
}
}
これで、/ipfs以下のパスでブラウザの更新ボタンを1秒間に1回以上クリックすると、429のエラーページが表示されるようになりました:
帯域制限について
booster-httpからデータをダウンロードする際に、クライアントが占有する帯域幅を制限したい場合があります。各クライアントごとに異なるレートで帯域制限を設定してみましょう。
bobという新しい.htaccessユーザを作成します:
$ htpasswd /etc/nginx/ipfs-gateway.conf.d/.htpasswd bob
etc/nginx/ipfs-gateway.conf.d/ipfs-gateway.conf に .htaccess のユーザー名から帯域制限へのマッピングを追加してください:
map $remote_user $bandwidth_limit {
default 1k;
“alice” 10k;
“bob” 512k;
}
etc/nginx/sites-available/defaultに帯域制限を追加します:
location /ipfs/ {
# htaccess authentication
auth_basic “Restricted Server”;
auth_basic_user_file /etc/nginx/ipfs-gateway.conf.d/.htpasswd;
limit_rate $bandwidth_limit;
limit_req zone=client_ip_10rs;
limit_req_status 429;
proxy_pass [http://127.0.0.1:7878](http://127.0.0.1:7878/);
}
帯域制限を実証する最も簡単な方法は、CURLを使用して、ユーザーalice、そしてbobでファイルをダウンロードすることです:
Average Dload欄(ダウンロード速度の平均値)の違いに注目してください。
このセクションでは、nginx がアクセス制限、レート制限、帯域幅制限を設定できる方法をほんの少し紹介しました。特に、リクエストトークンやJWTトークンを使って制限を追加することができます。このセクションの例は、Deploying NGINX as an API Gatewayから引用したもので、より詳細に説明されています。
まずは、Boostの最新リリース(v1.7.2)に更新して、新しいbooster-http機能を試してみてください。このブログ記事の例に従ってbooster-httpを保護することもできますし、http検索に関するBoostのドキュメントで詳細を確認することもできます。
Boostの最新情報は、Githubをフォローしてください。Boost Discussion Boardでは、プロジェクトの将来の方向性を決定するためのフィードバックや要望をお寄せください。
コメント