動的および静的分離を実現する nginx のサンプルコード

動的および静的分離を実現する nginx のサンプルコード

1. nginxの動的と静的の分離の簡単な設定

web1は静的サーバー、web2は動的サーバー、node2はプロキシであると仮定します。

1.1 ディレクトリごとに分ける

web1は静的リクエストのみを処理する

[root@web1 ~]# mkdir -p /var/www/www/image
[root@web1 ~]# yum -y install lrzsz
[root@web1 ~]# cd /var/www/www/image/
[root@web1 画像]# rz
[root@web1 画像]# ll
-rw-r--r--。 1 ルート ルート 156848 3月13日 11:31 nhrzyx.png
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf 
 ドキュメントルート "/var/www/www"
[root@web2 ~]# systemctl httpdを再起動します

web2は動的なリクエストのみを処理する

[root@web2 ~]# mkdir -p /var/www/www/dynamic
[root@web2 ~]# echo dynamic10 > /var/www/www/dynamic/index.html
[root@web2 ~]# vim /etc/httpd/conf/httpd.conf 
 ドキュメントルート "/var/www/www"
[root@web2 ~]# systemctl httpdを再起動します

アクセステスト

http://172.25.254.134/image/nhrzyx.png

http://172.25.254.135/dynamic/index.html

1.2 要請による分離

プロキシの設定

[root@lb01 conf]# vim nginx.conf
ワーカープロセス 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
アップストリームスタックプール{
    サーバー 172.25.254.134:80 重み=5;
}
アップストリームダイナミックプール{
    サーバー 172.25.254.135:80 重み=5;
}
  サーバー{
    聞く 80;
    サーバー名 www.lbtest.com;
    位置 / {
      ルートhtml;
      インデックス index.html index.htm;
      proxy_set_header ホスト $host;
      proxy_pass http://dynamic_pools;
    }
    場所 /画像/ {
      proxy_set_header ホスト $host;
    proxy_pass http://stack_pools;
    }
    場所 /dynamic/ {
      proxy_set_header ホスト $host;
    proxy_pass http://dynamic_pools;
    }
  }
}
[root@lb01 conf]# nginx -s リロード

ホストを構成してブラウザアクセスをテストする

172.25.254.131 www.lbtest.com

http://www.lbtest.com/image/nhrzyx.png

http://www.lbtest.com/dynamic/

1.3 拡張子による分離

[root@lb01 conf]# vim nginx.conf

ワーカープロセス 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
アップストリームスタックプール{
    サーバー 172.25.254.134:80 重み=5;
}
アップストリームダイナミックプール{
    サーバー 172.25.254.135:80 重み=5;
}
  サーバー{
    聞く 80;
    サーバー名 www.lbtest.com;
    位置 / {
      ルートhtml;
      インデックス index.html index.htm;
      proxy_set_header ホスト $host;
      proxy_pass http://dynamic_pools;
    }
    場所 ~ .*.(jpg|png|gif|css|js|swf|bmp|jsp|php|asp)$ {
    proxy_set_header ホスト $host;
    proxy_pass http://stack_pools;
    }
  }
}
[root@lb01 conf]# nginx -s リロード

http://www.lbtest.com/image/nhrzyx.png  

1.4 クライアント識別に基づく分離

http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
アップストリームスタックプール{
    サーバー 172.25.254.134:80 重み=5;
}
アップストリームダイナミックプール{
    サーバー 172.25.254.135:80 重み=5;
}
  サーバー{
    聞く 80;
    サーバー名 www.lbtest.com;
    位置 / {
        ($http_user_agent ~* "MSIE") の場合
        {
            proxy_pass http://dynamic_pools;
        }
        ($http_user_agent ~* "firefox") の場合
        {
            proxy_pass http://stack_pools;
        }
    }
    proxy_set_header ホスト $host;
    }
}
[root@web1 イメージ]# echo stack_web>> /var/www/www/test.html
[root@web1 イメージ]# systemctl restart httpd

[root@web2 ~]# echo dynamic_web>>/var/www/www/test.html
[root@web2 ~]# systemctl httpdを再起動します

アクセスするにはIEとFirefoxブラウザを使用してください

http://www.lbtest.com/test.html

1.5 クライアントPCとモバイルの分離を使用する

http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
アップストリームスタックプール{
    サーバー 172.25.254.134:80 重み=5;
}
アップストリームダイナミックプール{
    サーバー 172.25.254.135:80 重み=5;
}
  サーバー{
    聞く 80;
    サーバー名 www.lbtest.com;
    位置 / {
        ($http_user_agent ~* "iphone") の場合
        {
            proxy_pass http://dynamic_pools;
        }
        ($http_user_agent ~* "android") の場合
        {
            proxy_pass http://stack_pools;
        }
    }
    proxy_set_header ホスト $host;
    }
}

AndroidとiPhoneを使用してテストにアクセスします

http://www.lbtest.com/test.html

2. 最適化

[root@node2 ~]# vim /etc/sysctl.conf

ネット.ipv4.tcp_fin_timeout = 2
ネット.ipv4.tcp_tw_recycle = 1
ネット.ipv4.tcp_tw_reuse = 1
ネット.ipv4.tcp_syncookies = 1
ネット.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
ネット.ipv4.tcp_max_syn_backlog = 16348
ネット.ipv4.tcp_max_tw_buckets = 36000
ネット.ipv4.tcp_syn_retries = 1
ネット.ipv4.tcp_synack_retries = 1
ネット.ipv4.tcp_max_orphans = 16384
ネット.コア.somaxconn = 16384
ネット.コア.ネットdev_max_backlog = 18364

[root@node2 ~]# sysctl -p

keepalive と nginx の簡単な紹介

nginx ロードバランシングの高可用性を実現するために keepalived を設定する

IP ドリフトの検出には、キープアライブの方が適しています。リソース サービスが制御されている場合は、ストレージ方向の高可用性など、ハートビートの方が適しています。

3. nginxリバースプロキシのヘルスチェック

nginx がリバース プロキシとして動作する場合、バックエンド サーバーがダウンすると、ngixn はこのリアル サーバーをアップストリームから削除できないため、リクエストをバックエンド リアル サーバーに転送します。nginx は、顧客に返されるエラー ページを解決するためにローカルで proxy_next_upstream を有効にすることができますが、それでもリクエストはこのサーバーに転送され、その後他のサーバーに転送されるため、1 回の転送が無駄になります。Taobao チームがリア リアル サーバーのヘルス状態を検出するために開発した nginx モジュール nginx_upstream_check_module の助けを借りて、バックエンド サーバーが利用できない場合、すべてのリクエストはこのサーバーに転送されません。

チェック間隔=5000 上昇=1 下降=3 タイムアウト=4000;

3.1 設定ファイルに直接追加する

[root@node2 ~]# vim /usr/local/nginx/conf/nginx.conf

ワーカープロセス 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
アップストリーム web_pools {
    サーバー 172.25.254.134:80 重み=5;
    サーバー 172.25.254.135:80 重み=5;
# サーバー 172.25.254.158:80 重み = 5 バックアップ;
チェック間隔=5000 上昇=1 下降=3 タイムアウト=4000;

}
  サーバー{
    聞く 80;
    サーバー名 www.lbtest.com;
    位置 / {
      #ルートhtml;
      # インデックス index.html index.htm;
      proxy_set_header ホスト $host;
      proxy_pass http://web_pools;
    }
  }
}

[root@node2 ~]# nginx -t

nginx: [emerg] /usr/local/nginx/conf/nginx.conf:14 に不明なディレクティブ "check" があります
nginx: 設定ファイル /usr/local/nginx/conf/nginx.conf のテストに失敗しました

チェック失敗

nginxモジュールをダウンロードし、https://github.com/yaoweibin/nginx_upstream_check_module、nginxを使用してモジュールをインストールし、nginxのアップグレードとして扱います。

3.2 モジュールのダウンロード

[root@node2 nginx-1.12.2]# yum -y gitをインストールします

[root@node2 nginx-1.12.2]# git clone https://github.com/yaoweibin/nginx_upstream_check_module.git

[root@node2 nginx-1.12.2]# ll
drwxr-xr-x. 7 ルート ルート 4096 4月13日 00:57 nginx_upstream_check_module
[root@node2 nginx-1.12.2]# cd nginx_upstream_check_module/

[root@node2 nginx_upstream_check_module]# ll
-rw-r--r--。1 ルート ルート 0 4月13日 00:57 変更
-rw-r--r--. 1 ルート ルート 7921 4月 13 00:57 check_1.11.1+.patch
-rw-r--r--. 1 ルート ルート 8330 4月13日 00:57 check_1.11.5+.patch
-rw-r--r--. 1 ルート ルート 8060 4月13日 00:57 check_1.12.1+.patch
-rw-r--r--。1 ルート ルート 8054 4月13日 00:57 check_1.14.0+.patch
-rw-r--r--。1 ルート ルート 5483 4月13日 00:57 check_1.2.1.patch
-rw-r--r--. 1 ルート ルート 7130 4月13日 00:57 check_1.2.2+.patch
-rw-r--r--。1 ルート ルート 7094 4月13日 00:57 check_1.2.6+.patch
-rw-r--r--。1 ルート ルート 6791 4月13日 00:57 check_1.5.12+.patch
-rw-r--r--。1 ルート ルート 8295 4月13日 00:57 check_1.7.2+.patch
-rw-r--r--。1 ルート ルート 8346 4月13日 00:57 check_1.7.5+.patch
-rw-r--r--。1 ルート ルート 8509 4月 13 00:57 check_1.9.2+.patch
-rw-r--r--. 1 ルート ルート 6943 4月13日 00:57 check.patch
-rw-r--r--。1 ルート ルート 749 4月13日 00:57 config
drwxr-xr-x. 2 ルート ルート 43 4月 13 00:57 doc
-rw-r--r--。1 ルート ルート 1709 4月 13 00:57 nginx-sticky-module.patch
drwxr-xr-x. 2 ルート ルート 29 4月 13 00:57 nginx-tests
-rw-r--r--。1 ルート ルート 112010 4月 13 00:57 ngx_http_upstream_check_module.c
-rw-r--r--。1 ルート ルート 529 4月 13 00:57 ngx_http_upstream_check_module.h
-rw-r--r--。1 ルート ルート 2848 4月 13 00:57 ngx_http_upstream_jvm_route_module.patch
-rw-r--r--。1 ルート ルート 11509 4月 13 00:57 README
drwxr-xr-x. 6 ルート ルート 79 4月 13 00:57 テスト
-rw-r--r--。1 ルート ルート 3342 4月13日 00:57 アップストリーム_フェア.パッチ
drwxr-xr-x. 2 ルート ルート 81 4月 13 00:57 util

3.3 パッチ適用

[root@node2 nginx_upstream_check_module]# cd ../

[root@node2 nginx-1.12.2]# yum -y パッチをインストール

注: nginxバージョンの更新により、nginxバージョン1.12以上のパッチはcheck_1.11.5+.patchです。

[root@node2 nginx-1.12.2]# パッチ -p0 < ./nginx_upstream_check_module/check_1.11.5+.patch

ファイル src/http/modules/ngx_http_upstream_hash_module.c のパッチ適用
パッチファイル src/http/modules/ngx_http_upstream_ip_hash_module.c
ファイル src/http/modules/ngx_http_upstream_least_conn_module.c のパッチ適用
ファイル src/http/ngx_http_upstream_round_robin.c のパッチ適用
パッチファイル src/http/ngx_http_upstream_round_robin.h

3.4 コンパイルとインストール

[root@node2 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx \
> --user=nginx --group=nginx \
> --with-http_ssl_module \
> --with-http_realip_module \
> --http_addition_module \ を追加
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --http_sub_module \ を追加
> --with-pcre \
> --add-module=./nginx_upstream_check_module

objs という名前の新しいディレクトリが表示されます。

[root@node2 nginx-1.12.2]# ll

drwxr-xr-x. 4 ルート ルート 187 4月 13 01:04 objs

[root@node2 nginx-1.12.2]# make

sed -e "s|%%PREFIX%%|/usr/local/nginx|" \
  -e "s|%%PID_PATH%%|/usr/local/nginx/logs/nginx.pid|" \
  -e "s|%%CONF_PATH%%|/usr/local/nginx/conf/nginx.conf|" \
  -e "s|%%ERROR_LOG_PATH%%|/usr/local/nginx/logs/error.log|" \
  < man/nginx.8 > オブジェクト/nginx.8
make[1]: ディレクトリ `/usr/local/src/nginx-1.12.2' を離れます

[root@node2 nginx-1.12.2]# ll objs/

drwxr-xr-x. 3 ルート ルート 41 4月 13 01:04 アドオン
-rw-r--r--。1 ルート ルート 16895 4月13日 01:04 autoconf.err
-rw-r--r--. 1 ルート ルート 42396 4月13日 01:04 Makefile
-rwxr-xr-x. 1 root root 5993600 4月13日 01:06 nginx #nginx 新しい実行可能ファイル -rw-r--r--. 1 root root 5341 4月13日 01:06 nginx.8
-rw-r--r--。1 ルート ルート 7202 4月13日 01:04 ngx_auto_config.h
-rw-r--r--。1 ルート ルート 657 4月13日 01:03 ngx_auto_headers.h
-rw-r--r--。1 ルート ルート 6412 4月 13 01:04 ngx_modules.c
-rw-r--r--。1 ルート ルート 87120 4月13日 01:06 ngx_modules.o
drwxr-xr-x. 9 ルート ルート 91 4月 3 22:38 src

nginxをバックアップし、新しいnginxをコピーします

[root@node2 nginx-1.12.2]# cd /usr/local/nginx/sbin/

[root@node2 sbin]# mv nginx nginx.bak

[root@node2 sbin]# cp /usr/local/src/nginx-1.12.2/objs/nginx /usr/local/nginx/sbin

[root@node2 sbin]# /usr/local/nginx/sbin/nginx -s 停止

nginx: [emerg] getpwnam("nginx") が失敗しました

[root@node2 sbin]# id nginx

id: nginx: そのようなユーザーはいません

[root@node2 sbin]# useradd nginx

[root@node2 sbin]# id nginx

uid=1002(nginx) gid=1002(nginx) グループ=1002(nginx)

[root@node2 sbin]# /usr/local/nginx/sbin/nginx -s 停止

[root@node2 sbin]# /usr/local/nginx/sbin/nginx

[root@node2 ~]# nginx -t

nginx: 設定ファイル /usr/local/nginx/conf/nginx.conf の構文は正常です
nginx: 設定ファイル /usr/local/nginx/conf/nginx.conf のテストが成功しました

インストール成功

3.5 構成

ワーカープロセス 1;
イベント {
  ワーカー接続 1024;
}
http {
  mime.types を含めます。
  デフォルトタイプ アプリケーション/オクテットストリーム;
  ファイル送信オン;
  キープアライブタイムアウト65;
アップストリーム web_pools {
    サーバー 172.25.254.134:80 重み=5;
    サーバー 172.25.254.135:80 重み=5;
# サーバー 172.25.254.158:80 重み = 5 バックアップ;
チェック間隔=5000 上昇=1 下降=3 タイムアウト=4000;

}
  サーバー{
    聞く 80;
    サーバー名 www.lbtest.com;
    位置 / {
      proxy_set_header ホスト $host;
      proxy_pass http://web_pools;
    }
    場所 /nステータス{
    ステータスを確認します。
    access_log オフ;
    }
  }
}
[root@node2 conf]# nginx -s reload

3.6 アクセステスト

どちらの状態も正常です

1つをオフにする

[root@web1 イメージ]# systemctl stop httpd 

両方をオフにする

[root@web2 ~]# systemctl stop httpd 

開く

[root@web1 イメージ]# systemctl start httpd 

[root@web2 ~]# systemctl httpdを再起動します

バックエンドチェック機能の実装に成功

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

以下もご興味があるかもしれません:
  • 動的および静的分離のための Apache または Tomcat を使用した Nginx の基本構成例
  • Nginx+uWsgi を使用して Python の Django フレームワーク サイトの動的部分と静的部分を分離する
  • nginx + tomcatリバースプロキシと動的および静的分離のシンプルな実装
  • 静的Tomcatと動的Tomcatを分離するnginxの詳細な説明
  • nginxは負荷分散と動的および静的分離を実現します
  • 動的および静的分離を実装するための Nginx サンプル コード
  • Nginx+Apache の動的および静的分離の導入の詳細な例
  • Nginx は動的と静的の分離を実装します 例の説明
  • Nginx の動的および静的分離実装ケースのコード分析
  • Springmvc nginxで動的と静的の分離を実現するプロセスの詳細な説明
  • 負荷分散と動的および静的分離操作を実現するDocker NginxコンテナとTomcatコンテナ
  • 負荷分散と動的・静的分離を実現するNginx+Tomcatの原理の分析
  • Nginx の負荷分散と動的および静的分離の原理と構成
  • nginx が動的と静的の分離を実装する方法の例
  • インストールから設定までの nginx の詳細な手順 (インストール、セキュリティ設定、ホットリンク防止、動的および静的分離、HTTPS 設定、パフォーマンスの最適化)
  • Nginx+Tomcat 負荷分散と動的および静的分離クラスタの実装
  • 動的および静的分離を実現するサーバー負荷分散 nginx+tomcat
  • Nginx の動的および静的分離構成の実装と説明

<<:  MySQL方言の簡単な紹介

>>:  React でカレンダー コンポーネントを構築するためのステップ バイ ステップ ガイド

推薦する

Docker ベースの nginx ファイル サーバーを構築する方法と手順

1. このマシンに新しい設定ファイルdocker_nginx.confを作成します。 サーバー{ 7...

BFCとは何ですか? CSS 疑似要素を使用してフロートをクリアする方法

BFCコンセプト:ブロック フォーマット コンテキストは、BFC 内の要素を外部の要素から分離する独...

sysbenchツールによるMySQLデータベースのパフォーマンステストの実装方法

1. 背景Sysbench は、システムのハードウェア パフォーマンスをテストできるストレス テスト...

CSS 画像アニメーション効果のサンプルコード(フォトフレーム)

この記事では、CSS 画像アニメーション効果(フォトフレーム)のサンプルコードを紹介し、皆さんと共有...

Webフロントエンドインターフェースの設計に必須のスキル

[必須] ユーザーインターフェースPhotoShop/花火デザインアーティストと協力して、スケッチを...

MYSQL マスタースレーブ レプリケーションの知識ポイントの概要

単一の MYSQL サーバーが現在の Web サイトのトラフィックに対応できない場合の最適化ソリュー...

MySQLのビューの詳細な説明

ビュー: MySQL のビューはテーブルと多くの類似点があります。ビューも複数のフィールドと複数のレ...

CSSを使用して、頻繁に表示される奇妙なボタンを簡単に実装します。

背景グループでは、CSS を使用してインセット コーナー ボタンを実装する方法や、矢印付きのボタンを...

Linux FTP匿名アップロードとダウンロードが自動的に開始される問題を解決する

勉強や仕事で FTP サーバーを頻繁に使用する場合は、起動時に自動的に起動するように設定できます。設...

MySQL 集計関数のネストされた使用操作

目的: MySQL 集計関数のネストされた使用集計関数は直接ネストできません。例: max(coun...

40 CSS/JSスタイルと機能的な技術処理

1-ドロップダウン選択ボックスのスタイル設定 - ドロップダウン リストを変更します。 2- <...

Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

基本的な概念: Macvlanの動作原理: Macvlan は、Linux カーネルでサポートされて...

MySQLのジョイントインデックス機能の分析と使用例

この記事では、例を使用して、MySQL 共同インデックスの機能と使用方法を説明します。ご参考までに、...

Linux の crw、brw、lrw などのファイル属性は何ですか?

ファイルとは何ですか?すべてのファイルは実際には文字列のストリームですが、適切な解析方法を使用すると...

MySQLユーザー管理操作例の分析

この記事では、MySQL ユーザー管理操作について説明します。ご参考までに、詳細は以下の通りです。こ...