Nginx のアクセス制御とパラメータ調整方法

Nginx のアクセス制御とパラメータ調整方法

Nginx グローバル変数

Nginx には、$variable 名を通じて使用できるグローバル変数が多数あります。よく使用されるグローバル変数をいくつか示します。

変数例示する
$引数リクエスト内のパラメータ(www.123.com/1.php?a=1&b=2 の $args は a=1&b=2 など)
$コンテンツの長さHTTP リクエスト情報の「Content-Length」
$コンテンツタイプHTTP リクエスト情報の「Content-Type」
$ドキュメントルートnginx仮想ホスト設定ファイルのルートパラメータに対応する値
$ドキュメントURI現在のリクエストには、www.123.com/1.php?a=1&b=2 などの命令の URI が含まれておらず、$document_uri は 1.php であり、次のパラメータも含まれていません。
$ホストホストヘッダー、つまりドメイン名
$http_user_agentクライアントの詳細情報、つまりブラウザ識別子は、curl -Aを使用して指定できます。
$http_クッキークライアントのクッキー情報
$制限レートnginxサーバーがネットワークレートを表示するようにlimit_rateが設定されている場合は、それが表示されます。設定されていない場合は0が表示されます。
$リモートアドレスクライアントのパブリックIP
$リモートポートクライアントポート
$リモートユーザーnginxが認証付きで構成されている場合には、この変数はクライアント認証のユーザー名を表します。
$リクエスト本体ファイルリバースプロキシとして動作しているときにバックエンドサーバーに送信されるローカルリソースの名前
$リクエストメソッドGET/PUT/DELETE などのリソースを要求するメソッド。
$リクエストファイル名現在要求されているリソースファイルのパス名。$document_root/$document_uriの組み合わせに相当します。
$リクエストURI要求されたリンク($document_uri と $args を含む)
$スキーム要求されたプロトコル(ftp、http、httpsなど)
$サーバープロトコルHTTP/1.0、HTTP/1.1、HTTP/2.0 など、クライアントがリソースを要求するために使用するプロトコルのバージョン。
$サーバーアドレスサーバーIPアドレス
$サーバー名サーバーのホスト名
$サーバーポートサーバーのポート番号
$uri $document_uriと同じ
$http_refererクライアントリクエストのリファラは通常、リクエストがジャンプするリンクです。curl -eで指定できます。

Nginx の場所

位置

location ディレクティブは、ユーザーが要求した URI に基づいてさまざまなアプリケーションを実行するために使用されます。つまり、ユーザーが要求したウェブサイトのアドレス URL に応じてマッチングが行われ、マッチングが成功した場合に対応する操作が実行されます。

文法
location の構文は次のとおりです: location [=|~|~*|^~] /uri/ { … }
場所が一致する変数は$uriです
いくつかの文字の説明

キャラクター説明する
=完全一致を示します
大文字と小文字を区別する正規表現マッチングを示します
~*大文字と小文字を区別しない正規の一致を示します
^~ URIが指定された文字または文字列で始まることを示します
/ユニバーサルマッチング、どんなリクエストにもマッチします

ルールの優先順位

= より高い^~ より高い~* 等しい~ より高い/

例1

場所 = "/12.jpg" {...}
のように:
www.syushin.com/12.jpg は一致しますが、www.syushin.com/abc/12.jpg は場所 ^~ "/abc/" { ... } と一致しません。
のように:
www.syushin.com/abc/123.html は www.syushin.com/a/abc/123.jpg と一致しますが、場所 ~ "png" { ... } とは一致しません。
のように:
www.syushin.com/aaa/bbb/ccc/123.png は www.syushin.com/aaa/png/123.html と一致し、場所は ~* "png" { ... } と一致します。
のように:
www.syushin.com/aaa/bbb/ccc/123.PNG は www.syushin.com/aaa/png/123.html と一致し、場所 /admin/ { ... } と一致します。
のように:
www.syushin.com/admin/aaa/1.php は一致しますが、www.syushin.com/123/admin/1.php は一致しません

知らせ:

位置情報サポートに関する一部の情報が一致しません!~ 例: location !~ 'png'{...}

これは間違っています。場所はサポートされていません!~

このような要件がある場合は、if (location priority is less than if) を通じて実装できます。例: if ($uri !~ 'png') { ... }

アクセス制御

Web2.0 時代では、多くの Web サイトがユーザー中心になっており、ユーザーがコンテンツをサーバーに公開できます。アップロード機能はユーザーに公開されているため、ハッカーがトロイの木馬プログラムなどをアップロードするなど、セキュリティ上の大きなリスクがあります。そのため、アクセス制御を設定する必要があります。

拒否と許可

文字通り拒否と許可として理解するのは簡単です。

Nginx の deny および allow ディレクティブは、Nginx インストールにデフォルトで組み込まれている ngx_http_access_module モジュールによって提供されます。

文法

構文: allow/deny address | CIDR | unix: | all

特定の IP または IP セグメントへのアクセスを許可/拒否することを意味します。unix: が指定されている場合は、ソケット アクセスが許可されます。

注: この機能は Unix 1.5.1 で新しく追加されました。

nginx では、許可ルールと拒否ルールが順番に実行されます。

例1:

位置 /
{
  192.168.0.0/24 を許可します。
  127.0.0.1 を許可します。
  すべてを否定する;
}

注: この構成値は、192.168.0.0/24 ネットワーク セグメントと 127.0.0.1 からの要求を許可し、その他のすべての送信元 IP アドレスを拒否します。

例2:

場所 ~ "admin"
{
  192.168.30.7 を許可します。
  すべて否定する
}

注: アクセスされた URI には管理者リクエストが含まれており、IP 192.168.30.7 からのリクエストのみが許可されます。

位置情報に基づくアクセス制御

日常生活では、アクセス制御は基本的に場所と連動して設定されます。直接的な例を見てみましょう。

例1:

場所 /ブログ/
{
  すべてを否定する;
}

注: /blog/ ディレクトリでは、すべてのアクセスが禁止されています。ここでの deny all; は、403; を返すように変更できます。

例2

場所 ~ ".bak|\.ht"
{
  403 を返します。
}

注意: アクセスした URI に .bak または .ht が含まれている場合は、403 ステータス コードが直接返されます。

テストリンクの例:

  • ホームページ
  • www.syushin.com/blog/123/.htalskdjf

ユーザーが入力した URL が上記のいずれかの場合、403 が返されます。

例3

場所 ~ (データ|キャッシュ|tmp|画像|添付ファイル).*\.php$
{
  すべてを否定する;
}

注意: データ、キャッシュ、tmp、画像、添付ファイルを含み、.php で終わるすべての要求された URI へのアクセスは禁止されています。

テストリンクの例:

  • www.xxxxxx.com/aming/cache/1.php
  • www.xxxxxxx.com/image/123.phps
  • このサイトについて

$document_uri ベースのアクセス制御

前述したように、組み込み変数 $document_uri は、現在のリクエストに指示が含まれていない URI を意味します。

たとえば、www.123.com/1.php?a=1&b=2 の $document_uri は 1.php であり、次のパラメータは含まれません。

この変数に対してアクセス制御を行うことができます。

例1

($document_uri ~ "/admin/") の場合
{
  403 を返します。
}

注: 要求された URI に /admin/ が含まれている場合、403 が直接返されます。

注意: allow と deny は if 構造ではサポートされていません。

テストリンク:

1. www.xxxxx.com/123/admin/1.html に一致する
2. www.xxxxx.com/admin123/1.htmlが一致しません
3. www.xxxxx.com/admin.phpが一致しません

例2

($document_uri = /admin.php) の場合
{
  403 を返します。
}

注: 要求された URI が /admin.php の場合、403 ステータス コードが返されます。

テストリンク:

1. www.xxxxx.com/admin.php # 一致
2. www.xxxxx.com/123/admin.php # が一致しません

例3

$document_uri が '/data/|/cache/.*\.php$' の場合
{
  403 を返します。
}

注: 要求された URI にデータまたはキャッシュ ディレクトリが含まれており、PHP である場合、403 ステータス コードが返されます。

テストリンク:

1. www.xxxxx.com/data/123.php # 一致
2. www.xxxxx.com/cache1/123.php # は一致しません

$request_uri ベースのアクセス制御

$request_uri には $docuemnt_uri よりも多くのリクエスト パラメータがあります。主に要求された URI 内のパラメータを制御します。

($request_uri ~ "gid=\d{9,12}") の場合
{
  403 を返します。
}

注: \d{9,12} は正規表現で、9 ~ 12 個の数字を意味します。たとえば、gid=1234567890 はシンボル要件を満たしています。

テストリンク:

1. www.xxxxx.com/index.php?gid=1234567890&pid=111 が一致
2. www.xxxxx.com/gid=123 が一致しません

背景知識:

CC によって攻撃を受けたクライアントの Web サイトがありました。相手側は次のようなリクエストを多数送信しました: /read-123405150-1-1.html
実際、このようなリクエストは通常​​のリクエストではありません。Web サイトは、投稿が存在しないことを示すページを表示します。
したがって、このようなリクエストに対しては 403 ステータス コードを直接返すことができます。

$http_user_agent に基づくアクセス制御 (クローラー対策)

User_agent は、単純にブラウザ識別子として理解できます。一部のスパイダー クローラーも user_agent によって識別できます。アクセス ログを観察すると、一部の検索エンジン スパイダーが Web サイトを非常に頻繁に訪問していることがわかります。これは好ましくありません。サーバーへの負荷を軽減するために、主流の検索エンジン スパイダーを除くすべてのスパイダー クローラーをブロックすることもできます。

($user_agent ~ 'YisouSpider|MJ12bot/v1.4.2|YoudaoBot|トマト') の場合
{
  403 を返します。
}

注: 上記のキーワードを user_agent に含むすべてのリクエストは、403 ステータス コードを返します。

テスト:

1. curl -A "123YisouSpider1.0"
2. curl -A "MJ12bot/v1.4.1"

$http_referer ベースのアクセス制御

アンチホットリンク機能に加えて、$http_referer はいくつかの特別な要件を満たすこともできます。

例えば:

ウェブサイトがハッキングされ、検索エンジンによってインデックスされたウェブページに問題がありました。検索エンジンを通じてウェブサイトをクリックすると、ギャンブルのウェブサイトが表示されました。
トロイの木馬の検出には時間がかかり、すぐに解決できないため、ユーザーエクスペリエンスに影響を与えないように、このようなリクエストに対して特別な操作を実行できます。
たとえば、Baidu からアクセスしたリンクに 404 ステータス コードを直接返したり、HTML コードの一部を返したりすることができます。

$http_referer が 'baidu.com' の場合
{
  404 を返します。
}

または

$http_referer が 'baidu.com' の場合
{
  200 を返します "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

Nginx パラメータの最適化

高性能 Web サーバーである Nginx は、構成パラメータを調整しなくても、多数の同時リクエストを処理できます。もちろん、構成のチューニングにより Nginx のパフォーマンスはより強力になりますが、構成パラメータはサーバーのハードウェア パフォーマンスを参考にして組み合わせる必要があります。

ワーカープロセスの最適化

ワーカープロセス数;

このパラメータは、開始される作業プロセスの数を示します。ローカル マシンの CPU コアの数と一致させることをお勧めします。各 CPU コアは 1 つのプロセスを処理します。num は数値を示します。

ワーカー_rlimit_nofile

これは、Nginx で使用できるファイル記述子の最大数を示します。システムの最大記述子と一致する必要があります。102400 に設定することをお勧めします。
システムで ulimit -n 102400 を実行する必要もあります。
設定ファイル /etc/security/limits.conf を直接変更して、次の値を変更および増やすこともできます。
#* soft nofile 655350 (先頭の # を削除)
#* ハード nofile 655350 (先頭の # を削除)

ワーカー接続

このパラメータは、各 Nginx ワーカー プロセスが処理できる接続の最大数を構成するために使用されます。
このパラメータは、Nginx サーバーが最大でいくつのクライアント要求を処理できるかを決定します (worker_processes * worker_connections)
このパラメータは 10240 に設定することをお勧めしますが、大きすぎないようにしてください。

http/tcp接続数を最適化する

epollを使用する

Linux システムに最適なモデルである epoll イベント駆動型モデルを使用します。

マルチ_受け入れオン

各ワーカー プロセスが複数のクライアント要求を同時に処理できるようにします。

ファイル送信オン

カーネルの FD ファイル転送機能を使用すると、ユーザー モードとカーネル モードの切り替えが減り、サーバーのパフォーマンスが向上します。

tcp_nopush オン

tcp_nopush がオンに設定されている場合、データ転送のために tcp_cork メソッドが呼び出されます。
この方法を使用すると、アプリケーションがデータを生成するときに、
カーネルはパケットをすぐにカプセル化するのではなく、データ量が一定量に達したときにのみカプセル化して送信します。

tcp_nodelay オン

データ送信をキャッシュしません (Nagle アルゴリズムをオフにします)。これにより、小さなデータ パケットの高頻度送信のリアルタイム パフォーマンスが向上します。

(Nagleのアルゴリズムについて)

1 バイトなどの小さなデータ パケットを頻繁に送信する必要がある場合は、IPv4 を例にとると、各パケットに 40 バイトのヘッダーを付ける必要がります。
つまり、合計 41 バイトのデータのうち、必要なデータは 1 バイトだけです。
この問題を解決するために、Nagle のアルゴリズムが開発されました。
パケットのサイズが MSS に適合している場合はすぐに送信でき、適合していない場合はデータがバッファに格納され、すでに送信されたパケットが確認された後にのみ送信できることが規定されています。
このような規制により、ネットワーク内の小さなパケットの数を減らすことができ、ネットワークのパフォーマンスが向上します。

キープアライブタイムアウト

長時間の接続のタイムアウト期間を定義します。30 秒が推奨されます。短すぎたり長すぎたりするのは適切ではない場合があります。もちろん、このパラメータはビジネス状況に応じて動的に調整するのが最適です。

キープアライブリクエスト

クライアントとサーバーが長時間接続している場合に、各クライアントが実行できるリクエストの最大数を定義します。50000 などの大きな値に設定できます。

reset_timeout_connection オン

オンに設定すると、クライアントがサーバーにリクエストを送信しなくなったときにサーバーが接続を閉じることができます。

クライアント本体タイムアウト

指定された時間内にクライアントがボディデータの読み込みに失敗した場合、接続は切断されます。単位は秒です。デフォルト値は 60 で、10 に設定できます。

送信タイムアウト

このタイムアウトは、応答を送信するためのタイムアウトです。つまり、Nginx サーバーはデータ パケットをクライアントに送信しましたが、クライアントはデータ パケットを受信しませんでした。
接続が send_timeout で定義されたタイムアウトを超えると、Nginx は接続を閉じます。単位は秒で、3 まで設定できます。

圧縮

プレーンテキスト コンテンツの場合、Nginx は gzip 圧縮を使用できます。圧縮技術を使用すると、帯域幅の消費を削減できます。

ngx_http_gzip_module モジュールでサポートされています

構成は次のとおりです。

gzip on; //gzip 機能を有効にするgzip_min_length 1024; //要求されたリソースがこの値 (バイト単位) を超えた場合にのみ圧縮されるように設定するgzip_buffers 16 8k; //圧縮に使用するバッファ サイズを設定する。最初の数字はバッファ サイズ、2 番目はバッファ サイズである。gzip_comp_level 6; //圧縮レベルを 1 ~ 9 の範囲で設定する。9 は最高の圧縮レベルであり、CPU リソースを最も多く消費する。gzip_types text/plain application/x-javascript text/css application/xml image/jpeg image/gif image/png; //圧縮する必要があるファイルの種類を指定するgzip_disable "MSIE 6\."; //IE6 ブラウザでは圧縮が有効にならない

テスト:

curl -I -H "Accept-Encoding: gzip、deflate" http://www.xxxxx.com/1.css

ログ

  • クリティカル レベルなどのエラー ログ レベルを上げて、重要でないログをできるだけ少なく記録します。
  • アクセスログについては、ログを記録する必要がない場合はオフにすることができます。
  • 静的リソースのアクセスログは無効です

静的ファイルの有効期限

静的ファイルの場合、これらのリソースをクライアント ブラウザーにキャッシュできるように有効期限を設定する必要があります。
キャッシュの有効期限が切れる前に、クライアントはサーバーに同じリソースを要求しなくなるため、帯域幅とリソースの消費が節約されます。

設定例は次のとおりです。

場所 ~* ^.+\.(gif|jpg|png|css|js)$                   
{
  expires 1d; //1d は 1 日を意味しますが、1 日を表すために 24h を使用することもできます。
}

アクセス制御やパラメータチューニングは一部だけ記録していますが、一部は仕事で使うかもしれません。SSL設定については後ほどメモしておきます。春採用の筆記試験は難易度が高いので、しっかり勉強しましょう...

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx リバース プロキシと負荷分散の実践
  • nginxとバックエンドポート間の競合の解決策
  • Nginx におけるサーバーとロケーションのマッチングロジックの詳細な理解
  • Django+uwsgi+Nginxのベストプラクティスをオンラインで詳細に解説
  • Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法
  • PHP を使用して Nginx ログのユーザーエージェント データをカウントする方法
  • CentOS7 のシステム サービスに Nginx を追加する方法
  • nginx を使用して同じドメイン名で複数の Vue プロジェクトをデプロイし、リバース プロキシを使用する方法
  • Nginx 設定ファイルの差異を監視し、電子メールアラートを送信する Python 実装例
  • Nginx サーバーで Web クローラーをブロックおよび禁止する方法

<<:  CocosCreatorで複数のタイマーを使用する方法の詳細な説明

>>:  SQL 文における複合主キーと結合主キーに関する予備的研究

推薦する

http:// の代わりに // を使用する利点は何ですか (アダプティブ https)

//デフォルトプロトコル/ デフォルト プロトコルの使用は、リソース アクセス プロトコルが現在の...

MySQL InnoDB アーキテクチャの概要

目次導入1. MySQLデータベースの全体的なアーキテクチャSQL インターフェースパーサーオプティ...

UA による Web サイトのクロールを防ぐ Nginx のクローラー対策戦略

クローラー対策ポリシー ファイルを追加しました: vim /usr/www/server/nginx...

SQL における distinct と row_number() over() の違いと使い方

1 はじめにデータベース内のデータを操作するための SQL 文を記述するときに、いくつかの不快な問題...

VueのSSRサーバーサイドレンダリング例の詳細な説明

サーバーサイドレンダリング (SSR) を使用する理由検索エンジンのクローラーが完全にレンダリングさ...

EclipseでTomcatを作成する原理の詳細な説明

ローカルEclipse上にTomcatサーバーを作成する場合、 tomcaインストールディレクトリの...

WeChatアプレットがシンプルな計算機機能を実装

WeChatアプレット:シンプルな計算機、参考までに、具体的な内容は次のとおりです。ミニプログラムに...

Cronジョブを使用してCpanelでPHPを定期的に実行する方法

cpanel 管理バックエンドを開き、「詳細」オプションの下に「Clock Guardian Job...

Dockerがコンテナを起動するたびに、IPとホストが指定した操作が実行されます。

序文Dockerを使ってHadoopクラスタを起動するたびに、ネットワークカードの再バインド、IPの...

Vue Element フロントエンドアプリケーション開発開発環境の準備

目次概要1. 必要なソフトウェア環境を開発する1) VSコードのインストール2) ノード開発環境をイ...

ウェブサイトをIE6、7、8、9の古いバージョンに対応させるための3つのソリューション

Microsoft は後からブラウザの研究開発に力を入れてきましたが、実際のところ、最新の IE ブ...

Jupyter Notebook で JavaScript を実行する方法

その後、VSC で Jupyter Notebook を使用する方法も追加しました...アナコンダを...

クロスブラウザローカルストレージⅠ

原文: http://www.planabc.net/2008/08/05/userdata_beh...

CSS scroll-snap スクロールイベント停止と要素位置検出の実装

1. スクロールスナップはフロントエンド開発者にとって必須のスキルですCSS スクロール スナップは...