私たちは最後に、暗闇のない場所で会うことになるでしょう。 ~ジョージ、1984年 Nginx は Apache と同様に Web サーバーです。 REST アーキテクチャ スタイルに基づいて、Uniform Resource Descriptor (URl) または Uniform Resource Locator (URL) を通信の基盤として使用し、HTTP プロトコルを通じてさまざまなネットワーク サービスを提供します。 Apache は長い歴史を持ち、誰もが認める世界最大のサーバーです。安定性、オープンソース、クロスプラットフォームなど、多くの利点があります。それが登場してから長い時間が経ち、登場した当時はインターネット業界は今日ほど発達していませんでした。そのため、重量級になるように設計されています。多数の同時サーバーをサポートしていません。 Apache で数万の同時アクセスを実行すると、サーバーは大量のメモリを消費します。また、オペレーティング システムのプロセスまたはスレッドの切り替えによっても大量の CPU リソースが消費され、HTTP リクエストの平均応答速度が低下します。 これらすべてにより、Apache は高性能な WEB サーバーにはなれないと判断され、軽量で同時実行性の高いサーバーである Nginx が誕生しました。 特徴これは、軽量の IMAP/POP3/SMTP サービスを提供する高性能 HTTP およびリバース プロキシ Web サーバーです。2004 年 10 月 4 日にリリースされました (最初の公開バージョン 0.1.0)。Nginx の安定バージョン 1.4.0 は、2013 年 4 月 24 日にリリースされました。C 言語で記述された Nginx は、クロスプラットフォーム サーバーです。Nginx には独自の関数ライブラリがあり、zlib、PCRE、OpenSSL を除き、標準モジュールはシステム C ライブラリ関数のみを使用します。 利点メモリの占有量が少ない (3W の同時接続では、開かれた 10 個の nginx プロセスが約 150M のメモリを消費します) 高い同時実行能力 (公式テストでは 5W の同時接続をサポートでき、実際の運用環境では 2~3W の同時接続に達することができます) シンプル (構成ファイルはわかりやすい) 価格 (無料、オープンソース) Rewriter 書き換えをサポート (ドメイン名と URL に応じて、HTTP リクエストを異なるバックエンド サーバー グループに分割できます) ヘルス チェックが組み込まれています (nginx バックエンドの複数のサービスがダウンしても、フロントエンドのアクセスには影響せず、サービスの状態を自動的に検出できます) 帯域幅を節約 (GZIP 圧縮をサポートし、ブラウザーのローカル キャッシュ ヘッダーを追加できます) 機能: Web サーバー、軽量、負荷分散、キャッシュ、高同時実行性 アプリケーションシナリオ: プロキシサーバー、IP 負荷、静的負荷、動的および静的分離、電流制限、ヘルスモニタリング インストールとコマンドインストール: sudo apt-get でnginxをインストールします バージョンを表示 nginx -v nginx バージョン: nginx/1.18.0 (Ubuntu) 基本コマンド # nginx のアクセス ページの特定の場所 (nginx へようこそ) vi /usr/share/nginx/html/index.html # アクセスIP カール 192.168.100.111 #nginxプロセスをシャットダウンする nginx -s stop # nginxプロセスを起動します /usr/sbin/nginx # yumでインストールされたnginxもservic nginx startを使用できます # 設定ファイルが正しいか確認する nginx –t # 設定ファイルを再読み込みする nginx –s reload # ログを表示します tail -f ファイル名 # 表示ファイルはデフォルトで 10 行です。表示を更新します # 例: tail -f /var/log/lvs-agent.log tail -f /etc/nginx/nginx.conf # ファイルの最後の数行を表示します。 tail -n 行番号 ファイル名 例: tail -n 100 /var/log/aa.log # ネットワークカードのIPを削除する IP アドレス del 192.168.11.5/32 dev lo (lo eth1 eth2) # lvs はすべてのクラスター サービスをクリアします ipvsadm –C # eth0 ネットワークカードの IP 値を取得します ip a|grep eth0|grep inet|awk '{print $2}'|cut -d "/" -f1 # IPまたはURLが利用可能かどうかを確認し、200を返します カール -I -m 10 -o /dev/null -s -w %{http_code} 10.110.26.10:8080 # jar パッケージをバックグラウンドで起動します nohup java -jar /usr/sbin/プロジェクト名.jar >>/var/log/プロジェクト名.log 2>&1 & # 前のコマンドが正常に実行されたかどうかを確認します。正常に実行された場合は 0 を返します。それ以外の場合は echo $? # nginx プロセスが開始されているかどうかを確認します。このコマンドは、コード内でnginxプロセスが起動しているかどうかを判断するために使用されます。ps aux | grep nginxのみを使用すると、起動していなくても内容が返され、判断に影響します。ps aux | grep nginx | greo –v grep 設定ファイルnginx.conf nginx.conf をカスタマイズするには、以下のコマンドを実行します。 # グローバル設定領域 user www-data; ワーカープロセスは自動です。 pid /run/nginx.pid; /etc/nginx/modules-enabled/*.conf を含めます。 # ネットワークイベント構成エリアイベント { ワーカー接続数 768; # multi_accept オン; } # HTTPモジュール http { ## # HTTP グローバル設定 ## ファイル送信オン; tcp_nopush オン; tcp_nodelay オン; キープアライブタイムアウト65; タイプハッシュの最大サイズは2048です。 # server_tokens オフ; # server_names_hash_bucket_size 64; # server_name_in_redirect をオフ; /etc/nginx/mime.types を含めます。 デフォルトタイプ アプリケーション/オクテットストリーム; ## # SSL設定 ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # SSLv3 の削除、参照: POODLE ssl_prefer_server_ciphers をオン; ## # ログ設定 ## アクセスログ /var/log/nginx/access.log; エラーログ /var/log/nginx/error.log; ## # リソース圧縮設定 ## gzip on; # デフォルトで有効 # gzip_vary on; # gzip_proxied 任意; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_バージョン 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # 仮想ホストの設定 ## /etc/nginx/conf.d/*.conf を含めます。 /etc/nginx/sites-enabled/* を含めます。 } /etc/nginx/sites-enabled/* server { # 仮想ホストの設定 listen 80 default_server; # リスニングポート listen [::]:80 default_server; # SSL 設定 # # 443 ssl default_server をリッスンします。 # listen [::]:443 ssl default_server; # # 注意: SSL トラフィックでは gzip を無効にする必要があります。 # 参照: https://bugs.debian.org/773332 # # 安全な構成を確保するには、ssl_ciphers について読んでください。 # 参照: https://bugs.debian.org/765782 # # ssl-cert パッケージによって生成された自己署名証明書 # 本番サーバーでは使用しないでください。 # # snippets/snakeoil.conf をインクルードします。 # データキャッシュの場所 root /var/www/html; # PHPを使用している場合は、リストにindex.phpを追加します インデックス index.html index.htm index.nginx-debian.html; #ドメイン名、server_name は複数指定できます _; # / location / でリバースプロキシを実行します { # まずリクエストをファイルとして提供しようとし、次に # ディレクトリとして保存すると、404 が表示されます。 uwsgi_pass 127.0.0.1:8000; /etc/nginx/uwsgi_params を含めます。 try_files $uri $uri/ =404; } # PHPスクリプトをFastCGIサーバーに渡す # #場所 ~ \.php$ { # snippets/fastcgi-php.conf をインクルードします。 # # # php-fpm (または他の Unix ソケット) の場合: # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # # php-cgi (または他の TCP ソケット) の場合: #fastcgi_pass 127.0.0.1:9000; #} # Apacheのドキュメントルートが.htaccessファイルへのアクセスを拒否する # nginxのものと一致します # #場所 ~ /\.ht { # すべて拒否; #} } プロキシモードとリバースプロキシ構成フォワードプロキシ:クライアント(ユーザーA)とオリジンサーバー(配信元サーバー)(ターゲットサーバー)の間に位置するサーバー(プロキシサーバー)です。クライアントはオリジンサーバーからコンテンツを取得するために、プロキシサーバーにリクエストを送信し、ターゲット(オリジンサーバー)を指定します。プロキシサーバーはリクエストをオリジンサーバーに転送し、取得したコンテンツをクライアントに返します。フォワード プロキシを使用するには、クライアントは特別な構成を実行する必要があります。一般的に、特別な説明がない限り、プロキシ技術はデフォルトでフォワードプロキシ技術を指します。 これはプロの仲介者と同等であり、クライアントと実際のサーバーは通信できません。クライアントは自分が仲介者であることを知っています。 リバースプロキシ:フォワード プロキシとは対照的に、クライアントからはオリジン サーバーのように見え、クライアントは特別な構成を実行する必要がありません。クライアントはリバース プロキシの名前空間内のコンテンツに通常の要求を送信し、リバース プロキシは要求を転送する場所 (元のサーバー) を決定し、コンテンツが元々クライアントに属していたかのように、取得したコンテンツをクライアントに返します。 それは、家を売買する人に相当します。家を買うときは売り手に対して買い手がいて、家を売るときは買い手に対して売り手がいます。 透過プロキシ:透過プロキシとは、クライアントがプロキシ サーバーの存在をまったく知る必要がないことを意味します。リクエスト フィールド (メッセージ) を調整し、実際の IP を送信します。暗号化された透過プロキシは匿名プロキシであるため、プロキシを設定する必要がないことに注意してください。透過的なプロキシの実践例としては、現在多くの企業で使用されている行動管理ソフトウェアが挙げられます。 # リバースプロキシはデフォルトで無効になっています # アップストリームのlocalhostはアップストリームのlocalhostのバランスをとるサードパーティのモジュールです { # 実際のサーバー server 192.168.136.133:8081; サーバー 192.168.136.133:8081; サーバー 192.168.136.133:8081; } # サーバーをロード { listen 80 # プロキシサーバーポート server_name localhost; 位置 / { proxy_pass http://localhost; # リクエストを実際のサーバーの 1 つに送信します } } 負荷分散方法: ポーリング方法(デフォルト) 加重ラウンドロビン(重み) 公平 url_ハッシュ 送信元アドレスのハッシュ 最小接続 静的と動的の分離Nginx の動的および静的分離は、単に動的リクエストと静的リクエストを分離することを意味します。動的ページを静的ページから単に物理的に分離するという意味ではありません。 厳密に言えば、動的リクエストは静的リクエストから分離する必要があります。静的ページを処理するために Nginx を使用し、動的ページを処理するために Tomcat を使用するというように理解できます。 現在の実装の観点から、動的分離と静的分離は、おおまかに次の 2 つのタイプに分けられます。
server { # 仮想ホストの設定 listen 80 default_server; # リスニングポート listen [::]:80 default_server; # データキャッシュの場所 root /var/www/html; # PHPを使用している場合は、リストにindex.phpを追加します インデックス index.html index.htm index.nginx-debian.html; #ドメイン名、server_name は複数指定できます _; # / location / でリバースプロキシを実行します { # まずリクエストをファイルとして提供しようとし、次に # ディレクトリとして保存すると、404 が表示されます。 uwsgi_pass 127.0.0.1:8000; /etc/nginx/uwsgi_params を含めます。 try_files $uri $uri/ =404; } # これらのファイル拡張子のいずれかである場合は、ここで検索してください location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css) $ { ルート /static; 30日で期限切れ; # キャッシュの有効期間 } } ログ管理ログ形式ログは、Nginx ルート ディレクトリの logs/access.log ファイルに生成されます。デフォルトのログ形式は「main」です。デフォルトのログ形式「main」をカスタマイズすることもできます。 og_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; $remote_addr: クライアント IP アドレス (プロキシ サーバー、プロキシ サービス IP を表示) $remote_user: リモート クライアントのユーザー名を記録するために使用されます (通常は "-") $time_local: アクセス時間とタイムゾーンを記録するために使用されます。$request: 要求された URL と要求メソッドを記録するために使用されます。$status: 応答ステータス コード (例: 200 成功、404 ページが見つかりません、など)。 $body_bytes_sent: クライアントに送信されたファイル本体のコンテンツのバイト数 丸太の伐採Nginx ログファイルにはローテーション機能がありません 毎日ログ ファイルを書き込みます。ログ ファイルを自動的に切り取る nginx ログ切り取りスクリプトを作成できます。
nginx ログを 1 分ごとに自動的にカットするスクリプトは次のとおりです。 新しいシェルスクリプトを作成する 高同時実行アーキテクチャ分析高い同時実行性とは何ですか?高い同時実行性は、インターネット分散システム アーキテクチャの設計で考慮しなければならない要素の 1 つです。これは通常、システムが同時に多数のリクエストを並行して処理できるように設計されていることを意味します。 高い同時実行性に関連して一般的に使用される指標には、応答時間、スループット、1 秒あたりのクエリ数 (QPS)、同時ユーザー数などがあります。
システムの同時実行機能を向上させるにはどうすればよいでしょうか?インターネット分散アーキテクチャ設計の同時実行機能を向上させるための主な方法論的アプローチには、垂直拡張 (ScaleUp) と水平拡張 (ScaleOut) の 2 つがあります。 垂直拡張: 単一マシンの処理能力を向上します。垂直方向にスケーリングするには 2 つの方法があります。
インターネットビジネスが急速に発展していた初期の頃は、予算に問題がなければ、システムの同時実行能力を向上させるために「スタンドアロンハードウェアのパフォーマンスを強化する」という方法を使用することが強く推奨されていました。この段階では、企業の戦略は時間に敏感な方法でビジネスを展開することであり、「スタンドアロンハードウェアのパフォーマンスを強化する」ことが最も速い方法であることが多かったためです。 単一マシンのハードウェア パフォーマンスを向上させる場合でも、単一マシン アーキテクチャのパフォーマンスを向上させる場合でも、致命的な欠点があります。単一マシンのパフォーマンスには常に限界があります。したがって、インターネット分散アーキテクチャ設計における高並行性を実現する究極のソリューションは、水平拡張です。 水平拡張: サーバーの数を増やすだけで、システム パフォーマンスを直線的に拡張できます。 サーバーには限界がある 達成するための3つの方法
ここに小さなツールがあります:テストツールのダウンロードを制限する yum インストール http-tools -y
接続フローの制限http { # バイナリリモートアドレス:IP # zone=one:10m; 接続されたIPを保存するための10Mのスペースを申請する limit_conn_zone $binary_remote_addr ゾーン=1:10m; サーバー{ # ゾーン領域では、毎回 10 個の接続が解放され、nginx limit_conn one 10 によって処理されます。 } } リクエストフローの制限(レート制限)http { # レートは、各接続が 1 秒あたり 1 つの接続を送信できることを意味します。limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s; サーバー{ # brust: トークンを 1 つずつ追加します。120 個のトークンが発行されるとエラー 503 が報告されます。 limit_req ゾーン=req_one brust=120; } } バックグラウンドサービスの制限このモジュールは、必要なバックエンドの電流制限機能を提供します。 このモジュールにはパラメータがあります: max_connsはサーバーのフローを制限できますが、これはnginxの商用バージョンでのみ使用できます。 nginx1.11.5以降、公式はこのパラメータを商用バージョンから分離しました。つまり、本番環境で広く使用されているnginx1.9.12および1.10バージョンをアップグレードする限り、これを使用できるということです。 サーバー{ # max_conns 受信サービスの最大数 サーバー 127.0.0.1:8080 max_conns=100; } セキュリティ構成バージョンセキュリティ http { server_tokens オフ; } IPセキュリティ http { 位置 / { allow 127.0.0.1; # ホワイトリスト deny all; # ブラックリスト } } ファイルセキュリティ http { 場所 /logs{ autoindex on; # ディレクトリのルートを表示します /static; } 場所 ^/logs~*\.(log|txt)$ { ヘッダーコンテンツタイプ text/plain を追加します。 ルート /static; } } 接続セキュリティ http { # SSL設定 } Nginx の最適化Nginxのメイン設定ファイルを調整して同時実行性を高める worker_processes 2;# CPUイベントと一致するように調整します{ # ワーカーあたりの同時接続の最大数 worker_connection 65535; } Nginx の長い接続: HTTP1.1 以降、HTTP プロトコルは永続的な接続、つまり長い接続をサポートします。その利点は、1 つの TCP 接続で複数の HTTP 要求と応答を送信できることです。 Nginxの長い接続と短い接続は、サーバーの災害復旧能力を高めることができます 接続の確立と終了にかかるコストと遅延を削減します。 nginx をリバース プロキシまたは負荷分散として使用する場合、クライアントからの長い接続要求は短い接続に変換され、サーバーに送信されます。長い接続をサポートするには、nginx サーバーでいくつかの構成を行う必要があります。 nginx を使用する場合、長い接続を実現したい場合は、次の 2 つのことを実行する必要があります。
クライアントにとって、nginx は実際にはサーバーの役割を果たします。逆に、サーバーにとって、nginx はクライアントです。 イベント { # キープアライブ タイムアウト、デフォルトは 60 秒です。このパラメータは大きく設定しすぎないように注意してください。そうしないと、多くの無効な http 接続が nginx 接続の数を占有し、最終的に nginx がクラッシュしてしまいます。 キープアライブタイムアウト60; } http { キープアライブタイムアウト60; } Nginx 圧縮Gzip 圧縮機能: 応答メッセージをクライアントに送信する前に圧縮機能を有効にすると、帯域幅を効果的に節約し、クライアントへの応答速度を向上させることができます。圧縮は nginx の CPU パフォーマンスを消費します。 Gzip圧縮はhttp、サーバー、ロケーションモジュールで設定できます。 http { #gzip モジュール設定 #圧縮をオンにする gzip をオンにします。 # 圧縮ページに許可される最小バイト数を設定します。ページのバイト数は、ヘッダーのコンテンツ長から取得されます。 デフォルト値は 0 で、ページのサイズに関係なくページが圧縮されます。 2k より大きいバイト数に設定することをお勧めします。2k 未満の場合、圧縮率が高くなる可能性があります。 gzip_min_length 2k; # gzip 圧縮結果のデータ ストリームを保存するために、複数のキャッシュ ユニットを取得するようにシステムを設定します。 たとえば、4 4k は、メモリが 4k 単位で要求されることを意味します。これは、4k 単位の元のデータ サイズの 4 倍です。 4 8kは元のデータサイズに応じて単位が8kであることを意味します ユニットのメモリの 4 倍を要求します。 # 設定されていない場合は、デフォルト値として、gzip 圧縮結果を格納するために元のデータと同じサイズのメモリ領域が適用されます。 gzip_バッファ 4 16k; #圧縮レベル、1~10、数字が大きいほど圧縮率は高くなりますが、CPU 時間も長くなります gzip_comp_level 5; # デフォルト値: gzip_types text/html (js/css ファイルはデフォルトでは圧縮されません) # 圧縮タイプ、圧縮のMIMEタイプと一致 # ワイルドカードテキスト/*は使用できません # (指定の有無に関わらず) text/html はデフォルトで圧縮されます # 圧縮するテキストファイルの種類を設定するには、conf/mime.types を参照してください gzip_types テキスト/プレーン アプリケーション/xjavascript テキスト/css アプリケーション/xml; # 値は 1.0 と 1.1 で、http プロトコル 1.0 を圧縮するかどうかを示します。1.0 を選択した場合は、1.0 と 1.1 の両方を圧縮できます。gzip_http_version 1.0 # IE6以下の圧縮を無効にする gzip_disable "MSIE [1-6]\."; # デフォルト値: オフ # Nginx をリバース プロキシとして使用する場合に有効にし、バックエンド サーバーによって返される結果をオンまたはオフにします。一致の前提条件は、バックエンド サーバーが「Via」を含むヘッダーを返す必要があることです。 # off - すべてのプロキシ結果データの圧縮をオフにします # expired - 「Expires」ヘッダーが含まれている場合に圧縮を有効にします # no-cache - 「Cache-Control: no-cache」ヘッダーが含まれている場合に圧縮を有効にします # no-store - 「Cache-Control: no-store」ヘッダーが含まれている場合に圧縮を有効にします # private - 「Cache-Control: private」ヘッダーが含まれている場合に圧縮を有効にします # no_last_modified - 「Last-Modified」ヘッダーが含まれていない場合に圧縮を有効にします # no_etag - 「ETag」ヘッダーが含まれていない場合に圧縮を有効にします # auth - 「Authorization」ヘッダーが含まれている場合に圧縮を有効にします # any - 無条件に圧縮を有効にします gzip_proxied expired no-cache no-store private auth; # CDNとプロキシサーバーの場合、同じURLに対して、gzip_varyのヘッダー情報に基づいて圧縮コピーと非圧縮コピーが返されることがあります。 } 状態監視 サーバー{ 場所 /NginxStatus { stub_status オン; access_log オフ; } } プラグインのインストール ./configure --prefix=... --with-http_stub_status _module 上記は、高同時実行性における Nginx パフォーマンスを最適化する方法の詳細な概要です。高同時実行性における Nginx パフォーマンスの最適化の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CSS3を使用してフォントカラーグラデーションを実装する
>>: Sitemesh チュートリアル - ページ装飾技術の原理と応用
el-dialogをコンポーネントとしてカプセル化するelement-ui を使用する場合、ポップア...
最近、同社はitpubを皮切りに、コーポレートウェブサイト傘下の全サイトの評価を開始した。そのために...
目次1. 背景2. 複合インデックスを理解する3. 左端一致原則4. フィールド順序の影響5. 単一...
Vue でタブ切り替えを実装する 3 つの方法1. v-showはコンテンツの切り替えを制御します1...
まず、CSS3 Api の position 属性の定義を見てみましょう。 static: 特別な配...
環境: 1. Windows Server 2016 Datacenter 64 ビット 2. SQ...
通常は、最初に Dockerfile ファイルを定義し、次に docker build コマンドを使...
1. getBoundingClientRect() 分析getBoundingClientRect...
この記事では、Baidu News Navigation Barの効果を実現するための具体的なJSコ...
目次前提条件DNSドメイン名解決プロセス外部ネットワークマッピングnginxコア知識nginxとはア...
この記事では、デジタル時計効果を実現するためのJavaScriptの具体的なコードを参考までに紹介し...
今日、Ubuntu 用の小さなツールを顧客に送りましたが、ユーザーはそれを受け取った後、実行できませ...
1. 親コンポーネントは props を使用して子コンポーネントにデータを渡すことができます。 2....
<br />前の記事:Webデザインチュートリアル(6):デザインへの情熱を持ち続けまし...
1. デフォルトでアクセスするには、curl コマンドを使用します。 # curl -I http:...