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

推薦する

Docker のホスト間コンテナ通信オーバーレイ実装プロセスの詳細な説明

サーバーも 2 つあります。準備:コンテナのホスト名を設定する consul: kv タイプのストレ...

Javascriptでシングルトンパターンを実装する方法

目次概要コードの実装シングルトンパターンの簡易版改良版プロキシバージョンシングルトンモード遅延シング...

CSS スタイルの優先順位はどれくらい複雑ですか?

昨晩、面接の質問を見ていたら、CSS スタイルの優先順位について特に明確に説明していない人が何人かい...

複数の Tomcat を展開して起動し、プロジェクトを移行する方法を 1 つの記事で学習します。

目次tomcatをデプロイする1.ダウンロードして解凍する2. 設定ファイルを変更する移植プロジェク...

Vueナンバープレート入力コンポーネントの使い方の詳しい説明

参考までに、シンプルなナンバープレート入力コンポーネント(vue)です。具体的な内容は次のとおりです...

HTML コード内のスペースと空白行についての簡単な説明

HTML コード内の連続するスペースまたは空白行 (改行) はすべて 1 つのスペースとして表示され...

MySQL の JSON 挿入の問題

MySQL 5.7.8 以降では、JSON テキストでデータを効率的に取得できるネイティブ JSON...

JS で CSS 変数を使用する方法

JS で CSS 変数を使用する方法:export キーワードを使用して、js オブジェクトを le...

Vue データ内のプロパティをランダムに変更すると、ビューは更新されますか?

インタビュアー: Vue のソースコードを読んだことはありますか?応募者:あります。インタビュアー:...

ルートパスワードを変更するための MySQL 設定、MySQL サーバー接続、MySQL 共通コマンド図

1. ルートパスワードの設定と変更mysql が起動しているかどうかを確認します。起動していない場合...

MySql 8.0.16-win64 インストール チュートリアル

1. ダウンロードしたファイルを以下のように解凍します。 。 2. 環境変数に解凍ディレクトリを追加...

JavaScript クロージャの詳細

目次1. クロージャとは何ですか? 2. 閉鎖の役割序文: JavaScript部分ではクロージャが...

全文検索とキーワードスコアリング方式のMySQL実装例

1. はじめに今日、同僚から、MySQL を使用して ElasticSearch に似た全文検索機能...

Vue プロジェクトで垂直テーブルを 2 つの方法で実装するアイデアの分析

問題の説明私たちのプロジェクトでは、水平方向のテーブルが一般的ですが、必要に応じて垂直方向のテーブル...

jsを使用して中国語からピンインへの変換の完全な手順を実行します

jsを使用して、中国語をピンインに変換するパッケージを作成しました。倉庫のアドレスはpinyin-p...