NginxはLua+Redisを使用してIPを動的にブロックします

NginxはLua+Redisを使用してIPを動的にブロックします

1. 背景

日常的なウェブサイトのメンテナンスでは、このような要件に頻繁に遭遇します。特定のクローラーや悪意のあるユーザーによるサーバーへのリクエストをブロックするには、動的 IP ブラックリストを確立する必要があります。ブラックリストに登録された IP の場合、サービスは拒否されます。

この記事では、Nginx が Lua+Redis を使用して IP アドレスを動的にブロックする方法を紹介します。詳しい紹介を見てみましょう。

2. 建築

IP ブラックリスト機能を実装する方法は多数あります。

1. オペレーティング システム レベルで、指定された IP アドレスからのネットワーク要求を拒否するように iptables を構成します。

2. Web サーバー レベルで、Nginx 独自の拒否オプションまたは Lua プラグインを使用して IP ブラックリストを設定します。

3. アプリケーション レベルで、サービスを要求する前にクライアント IP がブラックリストに登録されているかどうかを確認します。

管理と共有を容易にするために、Nginx + Lua + Redis アーキテクチャを通じて IP ブラックリスト機能を実装します。アーキテクチャ図は次のとおりです。

アーキテクチャ図

3. 実装

1. Nginx + Lua モジュールをインストールします。さまざまな Lua モジュールを統合した Nginx サーバーである OpenResty を使用することをお勧めします。


オープンレスティ

2. Redis サーバーをインストールして起動します。

3. Nginx の例を設定します。


Nginx の設定

lua_shared_dict ip_blacklist 1m;

Nginx プロセスは、IP ブラックリストをキャッシュするために 1M の共有メモリ領域を割り当てます。以下を参照してください。

lua_shared_dict モジュール

アクセス_by_lua_file lua/ip_blacklist.lua;

luaスクリプトの場所を指定する

4. Redis から最新の IP ブラックリストを定期的に取得するように Lua スクリプトを設定します。ファイルの内容については、以下を参照してください。

出典: github.com


lua スクリプトの内容

5. Redis サーバーに新しい Set タイプのデータ ip_blacklist を作成し、最新の IP ブラックリストを追加します。

上記の手順を完了したら、nginx をリロードすると設定が有効になります。

IP アドレスがブラックリストに登録されている場合、サーバーにアクセスするとアクセスが拒否されます。


アクセスが拒否されました

IV. 結論

上記はNginx+Lua+Redisで実装されたIPブラックリスト機能であり、次のような利点があります。

1. シンプルで軽量な構成で、サーバーのパフォーマンスにほとんど影響を与えません。

2. 複数のサーバーが Redis インスタンスを通じてブラックリストを共有できます。

3. 動的構成: Redis のブラックリストを手動または自動で設定できます。

さて、以上がこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM をご愛顧いただきありがとうございます。

以下もご興味があるかもしれません:
  • Nginx で IP と IP 範囲をブロックする方法
  • nginx で IP をブロックし、イントラネット IP アクセスを許可する例

<<:  JavaScript キャンバスは影付きのグラフィックとテキストを実装します

>>:  MySQL ログの設定と表示方法

推薦する

Vueは画像のズームとドラッグをサポートするリッチテキストエディタを統合しています

必要:ビジネス要件によると、写真をアップロードできる必要があり、アップロードされた写真はモバイル端末...

Mysqlはブール型の演算を設定します

Mysqlはブール型を設定します1. Tinyintタイプテストテーブルを作成し、blフィールドをブ...

MySQL ストアド プロシージャの作成と呼び出しの詳細な説明

目次序文ストアドプロシージャ: 1. ストアドプロシージャの作成と呼び出し1. ストアドプロシージャ...

react-virtualized を使用して、動的な高さを持つ画像の長いリストを実装する

目次開発中に発生した問題解決具体的な実装実績まとめバーチャルリストは、スクロールコンテナ要素の表示領...

ホバープロンプトにはvue2+elementuiを使用する

Vue2+elementui のホバー プロンプトは、外部と内部に分かれています。内部のものは el...

MySQL マルチテーブルクエリ例の詳しい解説 [リンククエリ、サブクエリなど]

この記事では、例を挙げて MySQL のマルチテーブル クエリについて説明します。ご参考までに、詳細...

WIN10 での JDK インストールと環境変数の設定手順 (詳細版)

目次1. JDKをダウンロードする(例としてjdk1.8.0を使用する) 2. JDK をインストー...

Ubuntu 20.04 LTSの詳細なインストール履歴

この記事では、USB ブート ディスクの作成とシステムのインストールについて説明します。システム構成...

データベースミドルウェアMyCatの紹介

1. Mycatの適用シナリオMycat は幅広いシナリオに合わせて開発されており、新しいユーザーが...

Vue+Openlayer をベースに geojson を動的に読み込む方法

1つ以上の機能をロードする <テンプレート> <div id="map&...

Docker Compose で環境変数を参照する方法の例

プロジェクトでは、さまざまな条件や使用シナリオを制御するために、docker-compose.yml...

MySQL シリーズ 7 MySQL ストレージ エンジン

1. MyISAM ストレージエンジン欠点:トランザクションはサポートされていません最小粒度ロック:...

MySQLはこのような更新文を決して書きません

目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...

Linux仮想メモリについての簡単な説明

目次起源仮想メモリページングとページテーブルメモリのアドレス指定と割り当て関数プロセスメモリ管理デー...

HTML入力ファイルコントロールはアップロードされるファイルの種類を制限します

入力ファイルの HTML コントロールを Web ページに追加します。 <input id=&...