Nginxの生成、使用、ソケットプログラミング検証、および加重ラウンドロビンアルゴリズムについて

Nginxの生成、使用、ソケットプログラミング検証、および加重ラウンドロビンアルゴリズムについて

ソースアドレス:https//github.com/duchenlong/linux-text/tree/master/socket

序文-Nginxの起源

Nginxが存在する主な理由は、需要が増加しているためです。

最初は、サーバーをデプロイするときに、サーバー側のプログラムを直接作成し、それを実行してバックグラウンドでハングさせました。この場合、クライアントとサーバーの関係は次のようになります。多对一
ここに画像の説明を挿入

ゆっくりと、ますます多くの人がサーバーにアクセスすると、そのような状況が発生します

ここに画像の説明を挿入
より多くのユーザーが同時にサーバーにアクセスすると、サーバーの負荷が増加し、次のような状況が発生します。
ここに画像の説明を挿入

多对一構造、再びアップグレードし、そこにいくつかのユーザーのアクセスによってもたらされる圧力を共有するために他のサーバーになることができますか?

複数のユーザーが同時にサーバーにアクセスすることによって引き起こされる過度のサーバープレッシャーの問題を解決するには、続行横向扩展してさらにいくつかのサーバーを追加します

アクセスを要求するユーザーが複数いる場合、要求を処理するロジックは他のサーバーに配置されます。これにより、1つのサーバーで複数の要求の処理をブロックする必要がなくなるため、複数のユーザー要求を並行して処理してサーバーの負荷を軽減できます。

直感的に、このモードを実装する場合、各ユーザーは各サーバーのアドレスをガイドする必要があり、これは多对多構造です
ここに画像の説明を挿入
が、この構造はユーザーにとって少し複雑で、プロジェクトにアクセスするだけで、すべてのURLに到達する必要がありますサーバーのは明らかに非科学的で安全ではありません。

別のレイヤーを追加しても解決できないものはありません。ある場合は、別のレイヤーを追加してください。

その結果、次のプロキシサーバーモデルが登場しました。ユーザーがアクセスすると、一意のWebサイトにアクセスするだけで済み、プロキシサーバーはこれらの要求をさまざまなサーバーに配布して処理します。

このように多对多、構造ユーザーとプロキシサーバー間、およびプロキシサーバーとサーバー間の接続に変換できるため、ユーザーとサーバー間多对一,一对多の接続が減少します。
ここに画像の説明を挿入
次に、中間プロキシサーバーが反向代理機能を実現する必要があります。つまり、そのような要求があります。ここで、プロキシサーバーは、どのサーバーが要求を処理できるかを認識し、処理のためにこのサーバーに要求を送信し、処理後にプロキシサーバーを介してユーザーに返す必要があります。

また负载均衡、能力も必要でありNginx、ソフトウェアの機能のひとつです。

Nginxの紹介

Baidu百科事典

Nginx(エンジンx)は、高性能HTTPおよびリバースプロキシWebサーバーであり、IMAP / POP3 / SMTPサービスも提供します。

Nginxは、ロシアで2番目に訪問されたサイトであるRambler.ru(ロシア語:Рамблер)のためにIgor Sesoyevによって開発されました。最初の公開バージョン0.1.0は、2004年10月4日にリリースされました。

BSDのようなライセンスの形でソースコードをリリースし、その安定性、豊富な機能セット、サンプル構成ファイル、および低いシステムリソース消費で知られています。2011年6月1日、nginx1.0.4がリリースされました。

Nginxは、軽量のWebサーバー/リバースプロキシサーバーおよび電子メール(IMAP / POP3)プロキシサーバーであり、BSDのようなプロトコルで発行されます。

特徴:

  1. 少しのメモリを占有します
  2. 強力な並行性

実際、nginxの同時実行機能は、同じタイプのWebサーバーでより優れたパフォーマンスを発揮します。中国本土のnginx Webサイトのユーザーには、Baidu、JD、Sina、NetEase、Tencent、Taobaoなどが含まれます。

Nginxの役割

  1. HTTPプロキシ、リバースプロキシ

リバースプロキシを導入する前にフォワードプロキシの概念があります。海外のウェブサイトにアクセスすると、アクセス速度は比較的遅くなります。通常は、コンピューターでVPNを開くことであり、VPNはフォワードプロキシサーバーです。
ここに画像の説明を挿入

つまり、わが国では、外国のサーバーに直接アクセスするのが遅い場合もあれば、外国のサーバーにアクセスするのが速い場合もあります。この場所にトランジットサーバーを設定して、外国のWebサイトにアクセスできるようにすることができます。 。、そしてプロキシサーバーを介して応答結果を返送すると、外国のWebサイトにすばやくアクセスできます。

フォワードプロキシはクライアント自体のアクティブな動作であると言えますが、リバースプロキシはサーバーの方法であり
ここに画像の説明を挿入
、ブラウザでWebサイトアクセスするときにWebサイトにアクセスするプロセスに類似しています。ネットワークの場合、リクエストはプロキシサーバーに到着します。プロキシサーバーは、指定されたサーバーにリクエストを送信し、バックグラウンドサーバーの処理能力に応じて処理します。処理後、プロキシサーバーに戻り、 network。result
ここに画像の説明を挿入

  1. 負荷分散

Nginxには、負荷分散のための2つの戦略、組み込み戦略と拡張戦略があります。

組み込みの戦略には、主に次のものが含まれます。

  • ポーリング

ポーリング戦略では、サーバー内のサーバーがリクエストを処理する方法は順次処理です。各サーバーには順番にリクエストが割り当てられます。最後のサーバーに割り当てられると、次のリクエストは最初のサーバーから処理されます。再起動
ここに画像の説明を挿入

  • 加重ポーリング

加重ラウンドロビン戦略で解決された問題は、バックエンドサーバーの処理機能が異なる可能性があることです。一部のサーバーはパフォーマンスが高く、3つのリクエストを処理できますが、一部のサーバーはパフォーマンスが低く、1つのリクエストしか処理できません。

このように、ポーリング方式を使用すると、処理能力の低いサーバーではブロックされる可能性が高くなります。次に、各サーバーに重みを割り当てることができる重み付けされたポーリング方式があり、後続の要求はそれぞれに基づくサーバーの重みは順番に割り当てられます。
ここに画像の説明を挿入

  • ipハッシュ

クライアントのIPに対してハッシュ操作を実行し、ハッシュ操作の結果に応じてクライアントのIP要求を固定サーバーに送信します。つまり、クライアントがアクセスするたびに、固定サーバーがリクエストを処理します
ここに画像の説明を挿入

インストール

Nginxインストールパッケージ公式ウェブサイトからダウンロードできます
ここに画像の説明を挿入

Windowsの場合

ダウンロードして解凍すると、次のディレクトリが表示されます
ここに画像の説明を挿入
。Nginxサービスを開き、コマンドラインインターフェイスでnginx.exeプログラムを実行するだけです(視覚化アイコンを直接クリックしても効果はありません)。

ここに画像の説明を挿入
アクセスするにはブラウザ入力localhost:80または入力し127.0.0.1:80ます(ブラウザはデフォルトでポート80を追加するため、ポート80の情報を手動で追加する必要はありません
ここに画像の説明を挿入

Linux下

対応するインストールパッケージを最初にダウンロードしXshellてから、Linuxシステムに転送し、次のコマンドを入力します

# 解压
 	tar -zxvf nginx-1.18.0.tar.gz
# 进入 nginx-1.18.0 目录中
	cd nginx-1.18.0
# 运行 configure 程序
	./configure
# 安装
	make
# 如果权限不够,可以使用sudo ,root用户
	make install 

configureプログラムを実行すると、次のエラーが発生する可能性があります。対応するものをインストールする必要があります。

ここに画像の説明を挿入

ここに画像の説明を挿入

sudo yum -y install pcre-devel
sudo yum -y install zlib-devel

whereisコマンドを使用して、インストールが成功したかどうかを確認できます

[duchlong@localhost nginx-1.18.0]$ whereis nginx
nginx: /usr/local/nginx

手動Nginx実行するには、最初に/usr/local/nginxディレクトリを入力してからディレクトリ
ここに画像の説明を挿入
を入力しsbinnginxプログラムを実行します(権限に問題がある場合は、sudoを追加してから実行できます)

ここに画像の説明を挿入

Nginxスタートアップ

Nginxを起動する前に、デフォルトのポート番号が80あることに注意してください。したがって、対応するポート番号が開いていることを確認する必要があります。

仮想マシン内にある場合は、ファイアウォールをオフにするか、指定されたポートを個別に開くことができます

# 查看firewalld 服务状态
systemctl status firewalld

# 查看firewalld 状态
firewall-cmd --state

# 开启 firewalld 服务
service firewalld start

# 重启 firewalld 服务
service firewalld restart

# 关闭 firewalld 服务
service firewalld stop

# 查看防火墙规则
firewall-cmd --list-all 

# 查询端口是否开放
firewall-cmd --query-port=8080/tcp

# 开放80端口
firewall-cmd --permanent --add-port=80/tcp

# 移除80端口
firewall-cmd --permanent --remove-port=80/tcp

#重启防火墙(修改配置后要重启防火墙
firewall-cmd --reload

パラメータの説明

  1. firwall-cmd:Linuxが提供するファイアウォールを操作するためのツール
  2. -永続的:設定が永続的であることを示します
  3. –add-port:追加されたポートを示します
  4. --Remove-port:ポートを削除することを意味します

クラウドサーバーにある場合は、セキュリティグループを構成し、ポート80(またはカスタムポート)を開く必要があります
ここに画像の説明を挿入

# 进入Nginx 的运行目录
cd /usr/local/nginx/sbin

# 启动 ( 出现权限问题,可以加上 sudo 
./nginx # sudo ./nginx

# 停止
./nginx -s stop

# 安全退出
./nginx -s quit

# 重新加载配置文件
./nginx -s reload

# 查看Nginx进程
ps aux | grep nginx

Nginx構成ファイルが配置されているアドレスは次のとおりです。構成ファイルで、Nginx構成の/usr/local/nginx/conf一部(デフォルトのポート番号、プロセスの数、維持できる接続の数など)を変更できます。

構成ファイルを変更した後、構成ファイルをリロードする必要があります。そうしないと、有効になりません。
ここに画像の説明を挿入

構成ファイル

ルーキーチュートリアルを参照

Nginx構成ファイルは3つの部分に分かれています。

  1. グローバル構成、nginxのグローバルに影響する命令を構成します

一般に、nginxサーバー、nginxプロセスのpidストレージパス、ログストレージパス、構成ファイルの紹介、生成できるワーカープロセスの数などを実行しているユーザーグループがあります。
ここに画像の説明を挿入

  1. イベントブロック:構成はnginxサーバーまたはユーザーとのネットワーク接続に影響します

各プロセスの接続の最大数。接続要求を処理するために選択されるイベント駆動型モデル、複数のネットワーク接続を同時に受け入れるかどうか、複数のネットワーク接続のシリアル化を開くかどうかなど。
ここに画像の説明を挿入

  1. httpブロック:複数のサーバーをネストし、プロキシ、キャッシュ、ログ定義、およびサードパーティモジュールのほとんどの機能と構成を構成できます

ファイルのインポート、mimeタイプの定義、ログのカスタマイズ、sendfileを使用してファイルを転送するかどうか、接続のタイムアウト時間、単一接続要求の数など。

ここに画像の説明を挿入

サーバーブロックの構成

ここに画像の説明を挿入

  • listen、これはNginxがデフォルトでリッスンするポート番号を表します
  • server_name、リスニングアドレスを表します
  • location + urlは、要求されたURLフィルタリングを示し、通常のマッチングをサポートします

httpサービスのリバースプロキシを構成する

ここに画像の説明を挿入

  • 重み、サーバーアクセスの重み
  • backuo、スタンバイサーバー

Nginxの簡単な使用+検証

まず、構成ファイルで、リバースプロキシのサーバーアドレスを構成し、重みを設定して、バックアップサーバーを追加します。
ここに画像の説明を挿入
クライアントが最初にアクセスするとき、最初に最初のサーバー19998ポートにアクセスし、2回目と3回目にポート19999のサーバーにアクセスし、次に4回目に最初のサーバーにアクセスすることが期待されます。生まれ変わり

サーバーはsocketソケットを使用して確立されます。前のブログの
TCPプロトコル通信アプレットと関数インターフェイスhttpプロトコルを参照して、
ipを使用してhtmlWebページにアクセスするデモを簡単に実装できます。

ここに画像の説明を挿入

  • 最初の訪問

ここに画像の説明を挿入

  • 2回目の訪問

ここに画像の説明を挿入

  • 3回目の訪問

ここに画像の説明を挿入

  • 4回目の訪問

ここに画像の説明を挿入

  • 5回目の訪問

ここに画像の説明を挿入

  • 6回目の訪問

ここに画像の説明を挿入

  • 両方のサーバーがダウンした後(2つのサーバーのプロセスを終了した後)

ここに画像の説明を挿入
スタンバイサーバーへのアクセス中、ダウンしていないサーバーが他にある限り、スタンバイサーバーは起動しません。

最後に、Nginxでの重み付けされたサーバーの分散は、期待した結果と同じではないことがわかります。彼は問題を検討しました。バックエンドサーバーの重みがである場合、1:2:3通常のポーリング分散方法はですがABBCCCCCBACBこの方法で割り当てる方が良いですか?1つのサーバーが複数のリクエストを継続的に処理する状況を回避します

Nginxのラウンドロビンスケジューリングメカニズム

各バックエンドサーバーのデフォルト値は0です。

  1. 各サーバーの現在の値+独自の重み=今回の独自の値
  2. 現在の値の中で最大のサーバーを取得し、すべてのノードの重みの合計を減算します
  3. ラウンドが終了するまで手順1を繰り返します

加重ポーリングプロセスをシミュレートします。彼の加重はA:B:C = 1:2:3 A:B:C = 1:2:3です。ABC=123、初期値は0:0:0 0:0:0000

ラウンド 現在の価値 選択したサーバー 選択後の値
1 1 2 3 C 1 2 -3
2 2 4 0 B 2 -2 0
3 3 0 3 A -3 0 3
4 -2 2 6 C -2 2 0
5 -1 4 3 B -1 -2 3
6 0 0 6 C 0 0 0

非常に巧妙に、ラウンド後、すべてのサーバーの値は0になりました。これは、初期値と同じです。

おすすめ

転載: blog.csdn.net/duchenlong/article/details/113956980