ホームページ 運用・保守 Nginx 高負荷ネットワーク向けに Nginx と Node.js を最適化する方法

高負荷ネットワーク向けに Nginx と Node.js を最適化する方法

May 13, 2023 pm 01:31 PM
node.js nginx

ネットワークチューニング
まずnginxとnode.jsの基礎となる送信メカニズムを理解し、ターゲットを絞った最適化を実行しないと、2つのチューニングをどれほど詳細に行ったとしても、無駄です。通常、nginx は tcp ソケットを介してクライアントと上流アプリケーションを接続します。
私たちのシステムには、カーネル パラメータを通じて設定される tcp のしきい値と制限が多数あります。これらのパラメータのデフォルト値は一般的な目的のために設定されていることが多く、Web サーバーの高トラフィックと短い寿命の要件を満たすことができません。
TCP を調整するためのパラメーターをいくつか示します。これらを有効にするには、それらを /etc/sysctl.conf ファイルに入れるか、/etc/sysctl.d/99-tuning.conf などの新しい構成ファイルに入れてから sysctl -p を実行します。カーネルにそれらをロードさせます。この物理的な作業には sysctl-cookbook を使用します。
ここにリストされている値は安全に使用できますが、負荷、ハードウェア、および使用状況に基づいてより適切な値を選択するために、各パラメーターの意味を検討することをお勧めします。

コードをコピーしますコードは次のとおりです:

net .ipv4.ip_local_port_range='1024 65000'
net.ipv4.tcp_tw_reuse='1'
net.ipv4.tcp_fin_timeout='15'
net.core.netdev_max_backlog='4096'
net. core.rmem_max ='16777216'
net.core.somaxconn='4096'
net.core.wmem_max='16777216'
net.ipv4.tcp_max_syn_backlog='20480'
net.ipv4。 tcp_max_tw_buckets=' 400000'
net.ipv4.tcp_no_metrics_save='1'
net.ipv4.tcp_rmem='4096 87380 16777216'
net.ipv4.tcp_syn_retries='2'
net.ipv4。 tcp_synack_retries=' 2'
net.ipv4.tcp_wmem='4096 65536 16777216'
vm.min_free_kbytes='65536'

重要なもののいくつかを強調表示します。
net.ipv4.ip_local_port_range
上流アプリケーションのために下流クライアントにサービスを提供するには、nginx は 2 つの TCP 接続を開く必要があります。1 つはクライアントに接続し、もう 1 つはアプリケーションに接続します。サーバーが多数の接続を受信すると、システムの使用可能なポートがすぐに枯渇してしまいます。 net.ipv4.ip_local_port_range パラメータを変更すると、使用可能なポートの範囲を増やすことができます。 /var/log/syslog で「ポート 80 で syn フラッディングが発生している可能性があります。Cookie を送信しています」というエラーが見つかった場合は、システムが使用可能なポートを見つけられないことを意味します。 net.ipv4.ip_local_port_range パラメータを増やすと、このエラーを減らすことができます。
net.ipv4.tcp_tw_reuse
サーバーが多数の TCP 接続を切り替える必要がある場合、time_wait 状態の接続が多数生成されます。 time_wait は、接続自体は閉じられていますが、リソースは解放されていないことを意味します。 net_ipv4_tcp_tw_reuse を 1 に設定すると、カーネルは安全なときに接続をリサイクルしようとします。これは、新しい接続を再確立するよりもはるかに安価です。
net.ipv4.tcp_fin_timeout
これは、time_wait 状態の接続がリサイクルするまで待機する必要がある最小時間です。小さくすることでリサイクルを早めることができます。
接続ステータスを確認する方法
netstat:
netstat -tan | awk '{print $6}' | sort | uniq -c
または ss:
を使用します。 ss - s
nginx
ss -s
total: 388 (カーネル 541)
tcp: 47461 (estab 311、クローズド 47135、孤立 4、synrecv 0、timewait 47135/0)、ポート 33938
トランスポート合計 ip ipv6
* 541 - -
raw 0 0 0
udp 13 10 3
tcp 326 325 1
inet 339 335 4
frag 0 0 0
Web サーバーの負荷が徐々に増加すると、nginx の奇妙な制限に遭遇し始めます。接続が切断され、カーネルは syn フラッドを報告し続けます。現時点では、負荷平均と CPU 使用率は非常に小さく、サーバーは明らかにより多くの接続を処理できるため、非常にイライラします。
調査の結果、time_wait 状態の接続が多数あることが判明しました。これはサーバーの 1 つからの出力です:
time_wait 接続が 47,135 個あります!また、ss を見ると、それらはすべて閉じた接続であることがわかります。これは、サーバーが使用可能なポートのほとんどを消費したことを示し、サーバーが接続ごとに新しいポートを割り当てていることも意味します。ネットワークを調整することで問題は少し解決しましたが、それでも十分なポートがありませんでした。
さらに調査した結果、アップストリーム接続キープアライブ ディレクティブに関するドキュメントを見つけました:
アップストリーム サーバーへのアイドル キープアライブ接続の最大数を設定します。これらの接続はワーカー プロセスのキャッシュに保持されます。 。 ###面白い。理論的には、この設定では、キャッシュされた接続を介してリクエストを渡すことにより、無駄な接続が最小限に抑えられます。ドキュメントには、proxy_http_version を「1.1」に設定し、「connection」ヘッダーをクリアする必要があるとも記載されています。さらに調査した結果、http/1.1 は http1.0 に比べて tcp 接続の使用を大幅に最適化し、nginx はデフォルトで http/1.0 を使用するため、これは良いアイデアであることがわかりました。
ドキュメントの推奨事項に従って変更すると、アップリンク構成ファイルは次のようになります:

コードをコピーします。コードは次のとおりです:

アップストリーム backend_nodejs {
サーバー nodejs-3:5016 max_fails=0 フェイル_タイムアウト=10s;
サーバー ノードjs-4:5016 max_fails=0 フェイルタイムアウト=10秒;
サーバー ノードjs-5:5016 max_fails=0また、提案に従ってサーバー セクションのプロキシ設定も変更しました。 。同時に、失敗したサーバーをスキップするために proxy_next_upstream が追加され、クライアントの keepalive_timeout が調整され、アクセス ログがオフになりました。構成は次のようになります。


コードをコピーします。コードは次のとおりです。

server {
listen 80;

server_name fast.gosquared.com;

client_max_body_size 16m;

keepalive_timeout 10;

location / {
proxy_next_upstream エラー タイムアウト http_500 http_502 http_503 http_504;
proxy_set_header 接続 "";
proxy_http_version 1.1;
proxy_pass http://backend_nodejs;
}
access_log off;
error_log /dev/null crit;
}

新しい構成を採用した後、サーバーが占有するソケットが 90% 削減されたことがわかりました。 。はるかに少ない接続を使用してリクエストを送信できるようになりました。新しい出力は次のとおりです。
ss -s
total: 558 (kernel 604)
tcp: 4675 (estab 485、closed 4183、orphaned 0、synrecv 0、timewait 4183/0)、ports 2768

transport total ip ipv6

* 604 - -
raw 0 0 0
udp 13 10 3
tcp 492 491 1
inet 505 501 4
node.js
got I/O を非同期に処理するイベント駆動型の設計のおかげで、Node.js はすぐに大量の接続とリクエストを処理できます。他にもチューニング方法はありますが、この記事では主にnode.jsのプロセス面に焦点を当てます。
ノードはシングルスレッドであり、複数のコアを自動的に使用しません。つまり、アプリケーションはサーバーのすべての機能を自動的に取得できません。

ノード プロセスのクラスタリングの実現

複数のスレッドをフォークし、同じポートでデータを受信するようにアプリケーションを変更することで、負荷が複数のコアにまたがることが可能になります。 Node には、この目標を達成するために必要なすべてのツールを提供するクラスター モジュールがありますが、それらをアプリケーションに追加するには多くの手作業が必要です。 Expressを使用している場合、eBayにはcluster2というモジュールがあり、それを使用できます。

コンテキスト切り替えの防止複数のプロセスを実行する場合、各 CPU コアが同時に 1 つのプロセスのみでビジーになるようにする必要があります。一般に、CPU に n 個のコアがある場合、n-1 個のアプリケーション プロセスを生成する必要があります。これにより、各プロセスが適切なタイム スライスを取得し、カーネル スケジューラが他のタスクを実行できるように 1 つのコアが空きます。また、CPU 競合を防ぐために、基本的に、node.js 以外の他のタスクがサーバー上で実行されないようにする必要もあります。
私たちはかつて間違いを犯し、サーバー上に 2 つの Node.js アプリケーションをデプロイしてしまい、各アプリケーションが n-1 個のプロセスを開きました。その結果、CPU を奪い合うことになり、システム負荷が急激に上昇します。当社のサーバーはすべて 8 コア マシンですが、コンテキストの切り替えによって生じるパフォーマンスのオーバーヘッドは依然としてはっきりと感じられます。コンテキストスイッチングとは、CPU が他のタスクを実行するために現在のタスクを一時停止する現象を指します。切り替えるとき、カーネルは現在のプロセスのすべての状態を一時停止してから、別のプロセスをロードして実行する必要があります。この問題を解決するために、各アプリケーションが起動するプロセスの数を減らし、CPU を公平に共有できるようにし、その結果、システムの負荷が軽減されました。上の図に注目してシステムを見てください。負荷 (青線) が CPU コア数 (赤線) を下回っている様子を確認してください。他のサーバーでも同じことが確認されました。合計のワークロードは同じままであるため、上のグラフのパフォーマンスの向上はコンテキスト スイッチの減少によるものとしか考えられません。
順不同:


1. パフォーマンスの問題が発生した場合、アプリケーション層で計算と処理が実行できる場合は、データベース層から計算と処理を実行します。出てくる。並べ替えとグループ化は典型的な例です。データベース層よりもアプリケーション層のパフォーマンスを向上させる方が常に簡単です。 MySQL と同様に、sqlite は制御が簡単です。
高負荷ネットワーク向けに Nginx と Node.js を最適化する方法2. 並列コンピューティングに関しては、できる限り避けるようにしてください。それが避けられない場合は、大きな力には大きな責任が伴うことを思い出してください。可能であれば、スレッド上で直接操作することは避けてください。可能な限り、より高い抽象レベルで動作します。たとえば、iOS では、GCD、ディストリビューション、キュー操作が友達になります。人間の脳は無限の一時的な状態を分析するようには設計されていません - 私はこれを苦労して学びました。

3. 状態を可能な限り単純化し、可能な限りローカライズします。適用性が第一です。

4. 短くて組み合わせ可能なメソッドが味方です。

5. コードのコメントは、古くなったり誤解を招きやすいため危険ですが、だからといってコメントを書かない理由にはなりません。些細なことについてはコメントしないでください。ただし、必要に応じて、特別な場所では長い戦略的なコメントが必要です。おそらく明日の朝、コーヒーを一杯飲んだ後、あなたの記憶はあなたを裏切るでしょう。

6. ユースケース シナリオが「大丈夫」かもしれないと思った場合、1 か月後にリリースされた製品で大失敗する可能性があります。懐疑的になり、テストし、検証してください。

7. 疑問がある場合は、チームの全員に相談してください。

8. 正しいことをしましょう—通常、それが何を意味するかあなたは知っています。

9. ユーザーは愚かではなく、ショートカットを理解する忍耐力がないだけです。

10. 開発者があなたが開発したシステムを長期間保守する予定がない場合は、その開発者に注意してください。ソフトウェアのリリース後、血、汗、涙の 80% が流されます。そうすれば、あなたは人間嫌いになりますが、より賢い「鑑定家」にもなります。

11. ToDo リストはあなたの親友です。

12. 仕事をもっと楽しくするために率先して行動しましょう。これには時にはあなたの努力が必要です。

13. 静かなメルトダウン、今でも悪夢で目が覚めます。モニタリング、ロギング、アラート。さまざまな誤報や避けられない感覚の鈍化に注意してください。システムの障害に対する警戒をタイムリーに保ちます。

以上が高負荷ネットワーク向けに Nginx と Node.js を最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Tomcat サーバーへの外部ネットワーク アクセスを許可する方法 Tomcat サーバーへの外部ネットワーク アクセスを許可する方法 Apr 21, 2024 am 07:22 AM

Tomcat サーバーが外部ネットワークにアクセスできるようにするには、以下を行う必要があります。 外部接続を許可するように Tomcat 構成ファイルを変更します。 Tomcat サーバー ポートへのアクセスを許可するファイアウォール ルールを追加します。 Tomcat サーバーのパブリック IP を指すドメイン名を指す DNS レコードを作成します。オプション: リバース プロキシを使用して、セキュリティとパフォーマンスを向上させます。オプション: セキュリティを強化するために HTTPS を設定します。

nginx へようこそ!それを解決するにはどうすればよいですか? nginx へようこそ!それを解決するにはどうすればよいですか? Apr 17, 2024 am 05:12 AM

「nginx へようこそ!」エラーを解決するには、仮想ホスト構成を確認し、仮想ホストを有効にし、Nginx をリロードする必要があります。仮想ホスト構成ファイルが見つからない場合は、デフォルト ページを作成して Nginx をリロードすると、エラー メッセージが表示されます。が消え、ウェブサイトは通常のショーになります。

HTMLファイルからURLを生成する方法 HTMLファイルからURLを生成する方法 Apr 21, 2024 pm 12:57 PM

HTML ファイルを URL に変換するには Web サーバーが必要です。これには次の手順が含まれます。 Web サーバーを取得します。 Webサーバーをセットアップします。 HTMLファイルをアップロードします。ドメイン名を作成します。リクエストをルーティングします。

Nodejsプロジェクトをサーバーにデプロイする方法 Nodejsプロジェクトをサーバーにデプロイする方法 Apr 21, 2024 am 04:40 AM

Node.js プロジェクトのサーバー デプロイメント手順: デプロイメント環境を準備します。サーバー アクセスの取得、Node.js のインストール、Git リポジトリのセットアップ。アプリケーションをビルドする: npm run build を使用して、デプロイ可能なコードと依存関係を生成します。コードをサーバーにアップロードします: Git またはファイル転送プロトコル経由。依存関係をインストールする: サーバーに SSH で接続し、npm install を使用してアプリケーションの依存関係をインストールします。アプリケーションを開始します。node Index.js などのコマンドを使用してアプリケーションを開始するか、pm2 などのプロセス マネージャーを使用します。リバース プロキシの構成 (オプション): Nginx や Apache などのリバース プロキシを使用して、トラフィックをアプリケーションにルーティングします。

外部からnodejsにアクセスできますか? 外部からnodejsにアクセスできますか? Apr 21, 2024 am 04:43 AM

はい、Node.js には外部からアクセスできます。次の方法を使用できます。 Cloud Functions を使用して関数をデプロイし、一般にアクセスできるようにします。 Express フレームワークを使用してルートを作成し、エンドポイントを定義します。 Nginx を使用して、Node.js アプリケーションへのリバース プロキシ リクエストを実行します。 Docker コンテナを使用して Node.js アプリケーションを実行し、ポート マッピングを通じて公開します。

PHP を使用して Web サイトを展開および維持する方法 PHP を使用して Web サイトを展開および維持する方法 May 03, 2024 am 08:54 AM

PHP Web サイトを正常に展開して維持するには、次の手順を実行する必要があります。 Web サーバー (Apache や Nginx など) を選択する PHP をインストールする データベースを作成して PHP に接続する コードをサーバーにアップロードする ドメイン名と DNS を設定する Web サイトのメンテナンスを監視する手順には、PHP および Web サーバーの更新、Web サイトのバックアップ、エラー ログの監視、コンテンツの更新が含まれます。

Fail2Ban を使用してサーバーをブルート フォース攻撃から保護する方法 Fail2Ban を使用してサーバーをブルート フォース攻撃から保護する方法 Apr 27, 2024 am 08:34 AM

Linux 管理者にとっての重要なタスクは、サーバーを違法な攻撃やアクセスから保護することです。デフォルトでは、Linux システムには、iptables、Uncomplicated Firewall (UFW)、ConfigServerSecurityFirewall (CSF) などの適切に構成されたファイアウォールが付属しており、さまざまな攻撃を防ぐことができます。インターネットに接続されているマシンはすべて、悪意のある攻撃のターゲットになる可能性があります。サーバーへの不正アクセスを軽減するために使用できる Fail2Ban と呼ばれるツールがあります。 Fail2Ban とは何ですか? Fail2Ban[1] は、ブルート フォース攻撃からサーバーを保護する侵入防止ソフトウェアです。 Python プログラミング言語で書かれています

Linux を学び、Nginx をインストールするために私と一緒に来てください Linux を学び、Nginx をインストールするために私と一緒に来てください Apr 28, 2024 pm 03:10 PM

今回は、Linux 環境に Nginx をインストールする方法を説明します。 ここで使用する Linux システムは CentOS7.2 です。 インストール ツールを準備します。 1. Nginx 公式 Web サイトから Nginx をダウンロードします。ここで使用するバージョンは 1.13.6.2. ダウンロードした Nginx を Linux にアップロードする ここでは例として /opt/nginx ディレクトリを使用します。 「tar-zxvfnginx-1.13.6.tar.gz」を実行して解凍します。 3. /opt/nginx/nginx-1.13.6 ディレクトリに切り替え、./configure を実行して初期設定を行います。次のプロンプトが表示された場合は、マシンに PCRE がインストールされていないため、Nginx がインストールする必要があることを意味します。

See all articles