リバースプロキシ設定を実装するためのユニバーサルnginxインターフェース

リバースプロキシ設定を実装するためのユニバーサルnginxインターフェース

1. プロキシサーバーとは何ですか?

プロキシ サーバーは、クライアントが要求を送信すると、それを直接宛先ホストに送信するのではなく、まずプロキシ サーバーに送信します。プロキシ サービスは、クライアントの要求を受け入れた後、それをホストに送信し、宛先ホストから返されたデータを受信し、プロキシ サーバーのハード ディスクに保存してから、クライアントに送信します。

2. プロキシサーバーを使用する理由

1) アクセス速度の向上

ターゲットホストから返されたデータはプロキシサーバーのハードディスクに保存されるため、次回クライアントが同じサイトのデータにアクセスすると、プロキシサーバーのハードディスクから直接読み取られ、キャッシュの役割を果たします。特に人気のあるサイトでは、リクエスト速度が大幅に向上します。

2) ファイアウォール機能

すべてのクライアント要求は、リモート サイトにアクセスするためにプロキシ サーバーを経由する必要があるため、プロキシ サーバーに制限を設定して、特定の安全でない情報をフィルター処理できます。

3) プロキシサーバー経由でアクセスできない対象サイトにアクセスする

インターネット上には多くのプロキシ サーバーが開発されています。クライアントのアクセスが制限されている場合、制限のないプロキシ サーバーを介して目的のサイトにアクセスできます。簡単に言えば、ファイアウォールをバイパスするために使用するブラウザーはプロキシ サーバーを利用しています。海外に行くことはできませんが、外部ネットワークに直接アクセスすることもできます。

リバースプロキシとフォワードプロキシ

1. フォワードプロキシとは何ですか?リバースプロキシとは何ですか?

フォワード プロキシは、クライアントとターゲット ホストの間に設定され、内部ネットワークからインターネットへの接続要求をプロキシするためにのみ使用されます。クライアントはプロキシ サーバーを指定し、元々 Web サーバーに直接送信されていた http 要求をプロキシ サーバーに送信する必要があります。

リバース プロキシ サーバーはサーバー側に設置されます。頻繁に要求されるページをバッファリングすることでサーバーの負荷を軽減し、クライアントの要求を内部ネットワーク上のターゲット サーバーに転送します。また、サーバーから取得した結果を、インターネット上で接続を要求しているクライアントに返します。このとき、プロキシ サーバーとターゲット ホストは外部からは 1 つのサーバーのように見えます。

2. リバースプロキシの主な用途は何ですか?

現在、多くの大規模 Web サイトではリバース プロキシが使用されています。外部ネットワークから内部サーバーへの悪意のある攻撃を防ぎ、サーバーの負荷を軽減するキャッシュ機能やアクセスセキュリティ制御に加え、負荷分散を実行してユーザーリクエストを複数のサーバーに分散することもできます。

フロントエンド開発者にとって、インターフェースをデバッグし、毎回コードをテストサーバーに送信するのは、非常に時間がかかり、面倒な作業です。

効率を向上させるために、nginx リバース プロキシを使用してこの問題を解決しました。

インターフェースアドレス:
テスト

URLにアクセス:
ローカルホスト

根本的な問題は、ログイン時にクッキーが書き込まれないことです。この問題を解決するために、私たちは多くの回り道をしました。

ワーカープロセス 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト10;
  サーバー{
    聞く 80;
    server_name ローカルホスト;
    
    場所 =/ {
      add_header X-Frame-Options SAMEORIGIN;
      ルート D:/workspace/;
      インデックス index.html;
    }

    場所 ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|swf|woff|woff2|ttf|json|svg|cur|vue|otf|eot)$ {
      文字セット utf-8;
      ルート D:/workspace/;
      有効期限は3日です。
    }
    
    場所 = /socket/v2 {
      proxy_pass http://test.com;
      proxy_redirect オフ;
      プロキシ_http_バージョン 1.1;
      proxy_set_header アップグレード $http_upgrade;
      proxy_set_header 接続「アップグレード」;
      proxy_set_header ホスト test.com;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      プロキシ接続タイムアウト 30;
      プロキシ送信タイムアウト 30;
      プロキシ読み取りタイムアウト 60;
      プロキシバッファサイズ 256k;
      プロキシバッファ 4 256k;
    }
    
    位置 / {
      proxy_pass http://test.com;
      proxy_set_header クッキー $http_cookie;
      proxy_cookie_domain test.com ローカルホスト;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header ホスト test.com;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
    }
  }
}

コアコードは次の 3 行のコードです。

proxy_set_header クッキー $http_cookie;
proxy_cookie_domain test.com ローカルホスト;
proxy_set_header ホスト test.com;

具体的な説明については、漠然としか理解していません。

  • 1つ目はクッキーを運ぶことです。
  • クッキーを設定する2番目のドメイン
  • 3番目は実際のホストを設定します

重要な注意: 上記の 3 つの順序を逆にしないでください。そうしないと、プロキシが失敗しますが、その理由はわかりません。

携帯電話でデバッグするにはどうすればいいですか?

携帯電話から localhost に直接アクセスすることはできません。携帯電話とコンピューターを同じネットワークセグメントに接続し、コンピューターの IP を使用してアクセスできます。
しかし、ここではローカルホストのみがプロキシされ、コンピュータのIPはプロキシされません。

したがって、上記の server{...} をコピーし、その中のすべての localhost を自分のコンピューターの IP に変更する必要があります。最終的なコードは次のとおりです。

ワーカープロセス 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト10;
  サーバー{
    聞く 80;
    server_name ローカルホスト;
    
    場所 =/ {
      add_header X-Frame-Options SAMEORIGIN;
      ルート D:/workspace/;
      インデックス index.html;
    }

    場所 ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|swf|woff|woff2|ttf|json|svg|cur|vue|otf|eot)$ {
      文字セット utf-8;
      ルート D:/workspace/;
      有効期限は3日です。
    }
    
    場所 = /socket/v2 {
      proxy_pass http://test.com;
      proxy_redirect オフ;
      プロキシ_http_バージョン 1.1;
      proxy_set_header アップグレード $http_upgrade;
      proxy_set_header 接続「アップグレード」;
      proxy_set_header ホスト test.com;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      プロキシ接続タイムアウト 30;
      プロキシ送信タイムアウト 30;
      プロキシ読み取りタイムアウト 60;
      プロキシバッファサイズ 256k;
      プロキシバッファ 4 256k;
    }
    
    位置 / {
      proxy_pass http://test.com;
      proxy_set_header クッキー $http_cookie;
      proxy_cookie_domain test.com ローカルホスト;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header ホスト test.com;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
    }
  }
  サーバー{
    8080を聴く;
    サーバー名xx.xx.xx.xx;
    
    場所 =/ {
      add_header X-Frame-Options SAMEORIGIN;
      ルート D:/workspace/;
      インデックス index.html;
    }

    場所 ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|swf|woff|woff2|ttf|json|svg|cur|vue|otf|eot)$ {
      文字セット utf-8;
      ルート D:/workspace/;
      有効期限は3日です。
    }
    
    場所 = /socket/v2 {
      proxy_pass http://test.com;
      proxy_redirect オフ;
      プロキシ_http_バージョン 1.1;
      proxy_set_header アップグレード $http_upgrade;
      proxy_set_header 接続「アップグレード」;
      proxy_set_header ホスト test.com;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      プロキシ接続タイムアウト 30;
      プロキシ送信タイムアウト 30;
      プロキシ読み取りタイムアウト 60;
      プロキシバッファサイズ 256k;
      プロキシバッファ 4 256k;
    }
    
    位置 / {
      proxy_pass http://test.com;
      proxy_set_header クッキー $http_cookie;
      proxy_cookie_domain test.com xx.xx.xx.xx;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header ホスト test.com;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
    }
  }
}

アクセス方法: http://xx.xx.xx.xx:8080

構成がパッケージングツールによって生成される場合、Node.jsを使用してコンピューターのIPアドレスを動的に取得できます。

関数 getIPAdress() {   
  var インターフェース = require('os').networkInterfaces();   
  (インターフェース内のvar devName) {      
    var iface = インターフェース[devName];      
    (var i = 0; i < iface.length; i++) の場合 {         
      var alias = iface[i];         
      if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {            
        alias.address を返します。
      }      
    }   
  } 
}

そこで、nginx.configを動的に生成するツールを紹介します。

関数buildNginxConfig(config) {

  関数 getIPAdress() {   
    var インターフェース = require('os').networkInterfaces();   
    (インターフェース内のvar devName) {      
      var iface = インターフェース[devName];      
      (var i = 0; i < iface.length; i++) の場合 {         
        var alias = iface[i];         
        if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {            
          alias.address を返します。         
        }      
      }   
    } 
  }
  var cwd = process.cwd().replace(/\\/g, '/') + '/app';
  var protocol = /https|443/.test(config.ip) ? 'https' : 'http';

  var サーバー = [{
    ブラウザIP: 'localhost',
    ポート: 80、
    ルート: cwd、
    サーバーIP: config.ip、
    プロトコル: プロトコル、
  }, {
    ブラウザIP: getIPAdress(),
    ポート: 8080、
    ルート: cwd、
    サーバーIP: config.ip、
    プロトコル: プロトコル、
  }].map(関数(項目) {
    戻り値 `
  サーバー{
    ${item.port} をリッスンします。
    サーバー名 ${item.browserIp};
    
    場所 =/ {
      add_header X-Frame-Options SAMEORIGIN;
      ルート ${item.root};
      インデックス index.html;
    }

    場所 ~* \\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|swf|woff|woff2|ttf|json|svg|cur|vue|otf|eot)$ {
      文字セット utf-8;
      ルート ${item.root};
      有効期限は3日です。
    }
    
    場所 = /socket/v2 {
      proxy_pass ${item.protocol}://${item.serverIp};
      proxy_redirect オフ;
      プロキシ_http_バージョン 1.1;
      proxy_set_header アップグレード $http_upgrade;
      proxy_set_header 接続「アップグレード」;
      proxy_set_header ホスト ${item.serverIp};
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      プロキシ接続タイムアウト 30;
      プロキシ送信タイムアウト 30;
      プロキシ読み取りタイムアウト 60;
      プロキシバッファサイズ 256k;
      プロキシバッファ 4 256k;
    }
    
    位置 / {
      proxy_pass ${item.protocol}://${item.serverIp};
      proxy_set_header クッキー $http_cookie;
      proxy_cookie_domain ${item.serverIp} ${item.browserIp};
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header ホスト ${item.serverIp};
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header リモートホスト $remote_addr;
    }
  }`;
  }).join('\n');
  var str = `worker_processes 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト10;
  ${サーバー}
}`;

  str を返します。
}

エクスポート = module.exports = buildNginxConfig;

このユニバーサル リバース プロキシを使用すると、任意の Web サイト インターフェイスを自由に操作できます。

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

以下もご興味があるかもしれません:
  • nginx フォワード プロキシを使用してイントラネット ドメイン名転送プロセス分析を実装する
  • nginx を介して方向プロキシを実装するプロセスの図
  • Nginx フォワードプロキシとリバースプロキシの違いと原理分析
  • nginxフォワードプロキシとリバースプロキシの詳細な説明
  • 分散アーキテクチャにおけるフォワードプロキシとリバースプロキシに関する面接の質問

<<:  Centos7 インストール mysql5.6.29 シェル スクリプト

>>:  MySQL スロークエリ: スロークエリを有効にする

推薦する

MySQL 選択最適化ソリューションに関する簡単な説明

目次実生活からの例クエリが遅い最適化する方法カウント制限最大値と最小値 min&max実生活...

LNMP を展開して HTTPS サービスを有効にする方法に関するチュートリアル

LNMP とは: Linux+Nginx+Mysql+(php-fpm、php-mysql)つまり、...

W3C チュートリアル (4): W3C XHTML アクティビティ

HTML は、World Wide Web 上で公開するために使用されるハイブリッド言語です。 XH...

Linux の一般的なテキスト処理コマンドと vim テキストエディタ

今日は、いくつかの一般的なテキスト処理コマンドとvimテキストエディタを紹介します。 3日目 - 一...

iframeを透明にするパラメータ

<iframe src="./ads_top_tian.html" all...

インタビュアーはCSSで固定アスペクト比を実現する方法を尋ねました

この質問に関連するニーズはまだないかもしれませんし、面接でこの質問をされたことがないかもしれませんが...

Tomcat が IDEA のコンソールで文字化けを起こし、IDEA エンコーディングを UTF-8 に設定する方法

1. まず、TomcatログのエンコーディングとIdeaログ表示コンソールのエンコーディングを区別す...

Docker Enterprise Edition を使用して独自のプライベート レジストリ サーバーを構築する

Docker は本当に素晴らしいです。特に、仮想マシンを使用する場合に比べて、Docker イメージ...

Tomcat プロセスの CPU 使用率が高い場合の解決策

目次場合コンテキスト切り替えのオーバーヘッド?要約するCPU は多くの場合、システム パフォーマンス...

react-color を使用してフロントエンドのカラーピッカーを実装する方法

背景次の図に示すように、 react-color を使用してフロントエンド インターフェースのカラー...

優れたユーザー エクスペリエンス デザイナーが行うべき 5 つのこと (画像とテキスト)

この記事は、@C7210 によって翻訳されたブログ「Usability Counts」からの翻訳です...

JSブラウザストレージの詳しい説明

目次導入クッキークッキーとはクッキー生成方法クッキーの適用シナリオクッキーのデメリット回避策ローカル...

jQueryのanimateアニメーションメソッドとアニメーションキューイング問題の解決方法の詳しい説明

目次animate() アニメーションメソッドアニメーションキューイングdelay() メソッドアニ...

22 Vue 最適化のヒント (プロジェクトの実践)

目次コードの最適化v-for でキーを使用するv-if/v-else-if/v-else でキーを使...

Angular 依存性注入の説明

目次概要1. 依存性注入2. Angularの依存性注入フレームワーク概要依存性注入: デザインパタ...