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

推薦する

シンプルな計算機を実装する JavaScript コード

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

html+cssレイアウトの3つの方法(ナチュラルレイアウト/フローレイアウト/ポジショニングレイアウト)

1. 自然なレイアウト<br />レイアウトは変更せずに自動的に左揃えになります。 2....

Vueウォッチの監視方法の概要

目次1. Vueにおけるwatchの役割はその名の通り、監視の役割です。 2. このオブジェクトのプ...

知らないかもしれない実用的なTypeScriptのヒント

目次序文関数のオーバーロードマッピングタイプ部分的、読み取り専用、Null 可能、必須選択、記録除外...

Apache ストレステストツールのインストールと使用

1. ダウンロードApacheの公式サイトhttp://httpd.apache.org/にアクセス...

doctype のマークアップ検証

しかし最近、この方法を使用すると問題が発生することがわかりました。コードを参照してください。コードを...

CSS で div にスクロールを追加し、スクロール バーを非表示にする

CSS は div にスクロールを追加し、スクロール バーを非表示にします。具体的なコードは次のとお...

MySQL 学習データベースバックアップの詳細な説明

目次1.DB、DBMS、SQL 2. データベースの特徴3. SQL分類4. MySQLを起動および...

DockerのIDEA構成プロセス

IDEA は Java で最も一般的に使用されている開発ツールであり、Docker は最も人気のある...

CentOS7 64ビットインストールmysqlグラフィックチュートリアル

MySQL をインストールするための前提条件: CentOS 7 64 ビットをインストールし、Ce...

select count() と select count(1) の違いと実行方法

Count(*) または Count(1) または Count([column]) は、おそらく S...

js シンプルで粗雑なパブリッシュとサブスクライブのサンプルコード

パブリッシュ/サブスクライブとは何ですか?例を挙げてみましょう。あなたは服を買うために店に行きます。...

Linux での MySQL のアンインストールとインストールのグラフィック チュートリアル

ブログを書くのは初めてです。開発に携わって2年になります。仕事の後に何か有意義なことを見つけたいと思...

JS変数ストレージのディープコピーとシャローコピーの詳しい説明

目次可変タイプとストレージスペーススタックメモリとヒープメモリ基本的なデータ型参照タイプグラフィック...

MySQLデータベースを別のマシンに移行する方法の詳細な説明

1. まず、移行サーバー上のデータ ファイルを見つけます。MySQL 5.7 とデフォルトのインスト...