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 ログの設定と表示方法

推薦する

MySQLトランザクションの基本的な学習と経験の共有

トランザクションは、論理的な操作のグループです。この操作グループを構成する各ユニットは、成功するか失...

MySQLのexecute、executeUpdate、executeQueryの違い

execute、executeUpdate、executeQuery の違い (およびそれらの戻り値...

ページ要素の絶対位置と相対位置に関するある程度の理解

今日から、定期的にちょっとした豆知識を整理していきます。簡単なものもあるかもしれませんが、どれも役に...

Reactでのこのリファレンスの詳細な説明

目次原因:以下を実行します: 1. コンストラクター2.レンダリング機能3.bind関数とarrow...

MySQL シャーディングの詳細

1. ビジネスシナリオの紹介MySQLを使用する電子商取引システムがあるとします。大量のデータを保存...

アイデアはDockerプラグインを使用してワンクリックの自動デプロイを実現します

目次環境: 1. Dockerはリモート接続アクセスを可能にするidea dockerプラグインをイ...

MySQL におけるデータタイムとタイムスタンプの違い

MySQL には 3 つの日付型があります。日付(年-月-日)テーブル test(hiredate ...

CSS ピックアップ矢印、カタログ、アイコン実装コード

1. CSS その他のアイコンアイコンを作成するには 3 つの方法があります。写真css (小さな矢...

Docker を使用して nginx で tomcat クラスターを構築する方法 (画像とテキスト付き)

まず、Tomcatフォルダを作成します。Dockerの設定を容易にするために、ルートディレクトリに直...

Vueのメソッドとプロパティの詳細な説明

Vueのメソッドとプロパティ1. 方法使用法 1メソッド: {メソッド名: function(){}...

React における useEffect と useLayoutEffect の違い

目次前提条件使用効果コミット前ミューテーション効果コミットミューテーション効果コミットレイアウト効果...

入力ファイルの制御と美化について

一部のWebサイトでアップロードする場合、「参照」ボタンをクリックすると、[ファイルの選択]ダイアロ...

Node.jsで子プロセスを作成する方法

目次導入子プロセスプロセスを非同期的に作成する同期作成プロセス導入Node.js のメイン イベント...

MySQL 5.7.27 winx64 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 5.7.27 winx64のインストールと設定方法を参考までに紹介します。...

Vue で Google サードパーティ ログインを実装するためのサンプル コード

目次1. 開発者プラットフォームの構成問題を解決する1. 開発者プラットフォームの構成1. 開発者プ...