Nginxの生成、使用、ソケットプログラミング検証、および加重ラウンドロビンアルゴリズムについて
ソースアドレス:https://github.com/duchenlong/linux-text/tree/master/socket
序文-Nginxの起源
Nginxが存在する主な理由は、需要が増加しているためです。
最初は、サーバーをデプロイするときに、サーバー側のプログラムを直接作成し、それを実行してバックグラウンドでハングさせました。この場合、クライアントとサーバーの関係は次のようになります。多对一
ゆっくりと、ますます多くの人がサーバーにアクセスすると、そのような状況が発生します
より多くのユーザーが同時にサーバーにアクセスすると、サーバーの負荷が増加し、次のような状況が発生します。
で
多对一
構造、再びアップグレードし、そこにいくつかのユーザーのアクセスによってもたらされる圧力を共有するために他のサーバーになることができますか?
複数のユーザーが同時にサーバーにアクセスすることによって引き起こされる過度のサーバープレッシャーの問題を解決するには、続行横向扩展
してさらにいくつかのサーバーを追加します
アクセスを要求するユーザーが複数いる場合、要求を処理するロジックは他のサーバーに配置されます。これにより、1つのサーバーで複数の要求の処理をブロックする必要がなくなるため、複数のユーザー要求を並行して処理してサーバーの負荷を軽減できます。
直感的に、このモードを実装する場合、各ユーザーは各サーバーのアドレスをガイドする必要があり、これは多对多
構造です
が、この構造はユーザーにとって少し複雑で、プロジェクトにアクセスするだけで、すべてのURLに到達する必要がありますサーバーのは明らかに非科学的で安全ではありません。
別のレイヤーを追加しても解決できないものはありません。ある場合は、別のレイヤーを追加してください。
その結果、次のプロキシサーバーモデルが登場しました。ユーザーがアクセスすると、一意のWebサイトにアクセスするだけで済み、プロキシサーバーはこれらの要求をさまざまなサーバーに配布して処理します。
このように多对多
、構造をユーザーとプロキシサーバー間、およびプロキシサーバーとサーバー間の接続に変換できるため、ユーザーとサーバー間多对一,一对多
の接続が減少します。
次に、中間プロキシサーバーが反向代理
機能を実現する必要があります。つまり、そのような要求があります。ここで、プロキシサーバーは、どのサーバーが要求を処理できるかを認識し、処理のためにこのサーバーに要求を送信し、処理後にプロキシサーバーを介してユーザーに返す必要があります。
また负载均衡
、能力も必要でありNginx
、ソフトウェアの機能のひとつです。
Nginxの紹介
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のようなプロトコルで発行されます。
特徴:
- 少しのメモリを占有します
- 強力な並行性
実際、nginxの同時実行機能は、同じタイプのWebサーバーでより優れたパフォーマンスを発揮します。中国本土のnginx Webサイトのユーザーには、Baidu、JD、Sina、NetEase、Tencent、Taobaoなどが含まれます。
Nginxの役割
- HTTPプロキシ、リバースプロキシ
リバースプロキシを導入する前に、フォワードプロキシの概念があります。海外のウェブサイトにアクセスすると、アクセス速度は比較的遅くなります。通常は、コンピューターでVPNを開くことであり、VPNはフォワードプロキシサーバーです。
つまり、わが国では、外国のサーバーに直接アクセスするのが遅い場合もあれば、外国のサーバーにアクセスするのが速い場合もあります。この場所にトランジットサーバーを設定して、外国のWebサイトにアクセスできるようにすることができます。 。、そしてプロキシサーバーを介して応答結果を返送すると、外国のWebサイトにすばやくアクセスできます。
フォワードプロキシはクライアント自体のアクティブな動作であると言えますが、リバースプロキシはサーバーの方法であり
、ブラウザでWebサイトにアクセスするときにWebサイトにアクセスするプロセスに類似しています。ネットワークの場合、リクエストはプロキシサーバーに到着します。プロキシサーバーは、指定されたサーバーにリクエストを送信し、バックグラウンドサーバーの処理能力に応じて処理します。処理後、プロキシサーバーに戻り、 network。result
- 負荷分散
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
ディレクトリを入力してからディレクトリ
を入力しsbin
、nginx
プログラムを実行します(権限に問題がある場合は、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
パラメータの説明
- firwall-cmd:Linuxが提供するファイアウォールを操作するためのツール
- -永続的:設定が永続的であることを示します
- –add-port:追加されたポートを示します
- --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つの部分に分かれています。
- グローバル構成、nginxのグローバルに影響する命令を構成します
一般に、nginxサーバー、nginxプロセスのpidストレージパス、ログストレージパス、構成ファイルの紹介、生成できるワーカープロセスの数などを実行しているユーザーグループがあります。
- イベントブロック:構成はnginxサーバーまたはユーザーとのネットワーク接続に影響します
各プロセスの接続の最大数。接続要求を処理するために選択されるイベント駆動型モデル、複数のネットワーク接続を同時に受け入れるかどうか、複数のネットワーク接続のシリアル化を開くかどうかなど。
- 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
通常のポーリング分散方法はですがABBCCC
、CCBACB
この方法で割り当てる方が良いですか?1つのサーバーが複数のリクエストを継続的に処理する状況を回避します
Nginxのラウンドロビンスケジューリングメカニズム
各バックエンドサーバーのデフォルト値は0です。
- 各サーバーの現在の値+独自の重み=今回の独自の値
- 現在の値の中で最大のサーバーを取得し、すべてのノードの重みの合計を減算します
- ラウンドが終了するまで手順1を繰り返します
加重ポーリングプロセスをシミュレートします。彼の加重はA:B:C = 1:2:3 A:B:C = 1:2:3です。A:B:C=1:2:3、初期値は0:0:0 0:0:00:0:0
ラウンド | 現在の価値 | 選択したサーバー | 選択後の値 |
---|---|---|---|
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になりました。これは、初期値と同じです。