nginx+lua を使用した単一マシンでの何万もの同時接続の実装

nginx+lua を使用した単一マシンでの何万もの同時接続の実装

nginx は弊社で最もよく使用されるサーバーで、コンテンツ配信やリバース プロキシによく使用されます。Lua は C に似たスクリプト言語で、ゲーム業界で広く使用されています。Web ゲームが流行していた 10 年前、伝説的なゲームのソース コードを購入したところ、ゲーム内のサーバーは Lua を使用して実装されていました。私たちは、バックエンドJavaに到達するリクエストの頻度を減らすために、オーバーセリングやアンダーセリング、ランキングなどのシンプルで実用的な機能を実行するために、nginx、envoy、redisとよく使用します。

次に、nginx + lua イメージの構築を開始します。自分で構築する理由は、他の人が提供したイメージにウイルスが含まれていることを恐れているためです。非公式の docker イメージには多くのウイルスが含まれているため、誰もが注意する必要があります。

この記事では、nginx の openresty バージョンを使用します。openresty、nginx、lua の具体的な手順については、Baidu で検索してください。

イメージをビルドする前に、nginx-module-vtsモジュールとopenresty-1.15.8.3の圧縮パッケージを用意する必要があります。この2つの圧縮パッケージは、Baiduで検索すると見つかります。公式アカウントの記事が外部リンクを挿入できるかどうかはわかりません。nginx-module-vtsモジュールの機能は、nginxのアクセスデータをカウントすることです。prometheus+grafanaを使用してnginxを監視する場合は、このモジュールをインストールする必要があります。一緒にコンパイルしましょう。

サーバー上にディレクトリを作成する

cd /usr/local/docker
mkdir -p nginx-lua/ビルド
nginx-lua をインストールします

構築後の完全なディレクトリは次のとおりです。

root@today2:/usr/local/docker/nginx-lua# ツリー
。
├── ビルド
│ ├── Dockerファイル
│ ├── nginx-module-vts.zip
│ └── openresty-1.15.8.3.tar.gz
├── docker-compose.yml
├── ルア
│ ├── test.lua
├── nginx.conf
├──wwwルート
│ ├──index.html

Dockerファイル

Dockerfileファイルをビルドディレクトリに置き、ダウンロードしたnginx-module-vts.zipとopenresty-1.15.8.3.tar.gzもビルドディレクトリに置きます。

ubuntu:xenial より

# データソースを更新 WORKDIR /etc/apt
実行 echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main limited universe multiverse' >sources.list
実行 echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main limited universe multiverse' >>sources.list
実行 echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main limited universe multiverse' >>sources.list
実行 echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main 制限付き宇宙 マルチバース' >>sources.list
apt-get updateを実行する

# 依存関係をインストールします。RUN apt-get install unzip make gcc libpcre3-dev libssl-dev perl build-essential curl zlib1g-dev --assume-yes

# ツールパッケージをコピーします ADD openresty-1.15.8.3.tar.gz /usr/local/src
nginx-module-vts.zip /usr/local/src を追加します。

# nginxモジュールvts
ワークディレクトリ /usr/local/src
nginx-module-vts.zip を解凍して実行します。

ワークディレクトリ /usr/local/src/openresty-1.15.8.3
rm -rf ./Makefile を実行します。
実行 ./configure --add-module=/usr/local/src/nginx-module-vts
make && make install を実行します。

# Nginx を設定し、コメントアウトして、コンテナの起動時にコンテナにマウントします # ADD nginx.conf /usr/local/openresty/nginx/conf/

ワークディレクトリ /
エクスポーズ80
CMD ["/usr/local/openresty/nginx/sbin/nginx", "-c", "/usr/local/openresty/nginx/conf/nginx.conf", "-g", "デーモンをオフ;"]

nginx.conf

ユーザー root;
ワーカープロセスは自動です。

ワーカー_rlimit_nofile 65535;

イベント {
 ワーカー接続 102400;
 epoll を使用します。
}

http {
 server_tokens オフ;
 mime.types を含めます。
 デフォルトタイプ アプリケーション/オクテットストリーム;

 アクセスログ
 access_log オフ;
 エラーログ /var/log/nginx/error.log;

 キープアライブタイムアウト65;
 クライアントの最大ボディサイズは10mです。
 
 gzip オン;
 gzip_disable "msie6";
 gzip_min_length 1000;
 gzip_proxied 期限切れ、キャッシュなし、保存なし、プライベート認証。
 gzip_types text/plain application/xml application/javascript text/css application/x-javascript;

 # 次の 3 行は、nginx-module-vts モジュールをインストールした後に nginx トラフィック統計を設定するためのものです。この記事では主に lua について説明しているため、次の 3 行はコメントアウトできます。vhost_traffic_status_zone;
 vhost_traffic_status_filter_by_host がオン;
 vhost_traffic_status_filter_by_set_key $uri uri::$server_name;

 サーバー{
  聞く 80;
  ルート /usr/share/nginx/html;

  # lua スクリプトのキャッシュを有効にするかどうか。デバッグ段階ではオフに設定します (lua ファイルを変更した後に nginx を再起動する必要はありません)。パフォーマンスを向上させるには、正式な環境でこの行を必ずコメント アウトしてください lua_code_cache off;

  # この場所は、実際に Lua スクリプトを呼び出すための設定です。場所 /lua/test {
   #戻り値の型をjsonに指定します
   デフォルトのタイプは 'application/json' です。
   # /lua/test にアクセスしたときに test.lua がコンテンツを返すように指定します。このパスはコンテナ内のパスであり、ホストと混同してはならないことに注意してください。content_by_lua_file '/usr/local/lua/test.lua';
  }

  # トラフィック統計情報もコメントアウトできます。location /status {
   vhost_traffic_status_display;
   vhost_traffic_status_display_format html;
  }

 }
}

ドッカーの作成

バージョン: '3.1'
サービス:
  nginx:
    build: build # 左側のビルドは現在のコンテナがイメージをビルドする必要があることを意味し、右側のビルドはイメージビルドファイルがビルドディレクトリにあることを意味します restart: always
    コンテナ名: nginx
    network_mode: host # ホストモードを指定する必要はありません。これは利便性のためだけのものです。
      nginx.conf は、/usr/local/openresty/nginx/conf にあります。
      - ./log:/var/log/nginx/
      - ./wwwroot:/usr/share/nginx/html
      - ./lua:/usr/local/lua

テスト.lua

./luaディレクトリにtest.luaファイルを作成します。

ngx.say('{"code": 1, "msg": "hello world!"}')

コンテナを起動した後、IP:80/lua/test にアクセスすると、出力 {"code": 1, "msg": "hello world!"} が表示され、Lua スクリプトが有効になったことがわかります。

この時点で、nginx + lua が構築されました。今後の記事では、JWT 検証、Redis 操作、メッセージ キューなど、思いつく限り多くの機能を実現できる、よく使用される lua スクリプトをいくつか紹介します。

nginx+lua を使用して単一マシンで数万の同時呼び出しを実装する方法についての記事はこれで終わりです。nginx lua 単一マシン同時呼び出しに関する関連コンテンツの詳細については、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx+Lua+Redis は高並列 Web アプリケーションを構築します

<<:  アクティビティページでの CSS3 アニメーション効果の適用

>>:  印刷広告を成功させるための「3I」基準

推薦する

JavaScriptプロトタイプと例の詳細な説明

目次コンストラクタインスタンスとプロトタイプの関係プロトタイププロパティ属性またはメンバーの検索原則...

熟練デザイナーの7つの原則(2):色の使い方

<br />前回の記事:優秀なデザイナーの7つの原則(1):フォントデザイン 英語 原文...

JSベースの手持ち連射機能+テキスト揺れ特殊効果コードの簡単実装

少し前にTikTokで揺れる連打が流行っていたので真似してみることにしました。さっそく効果をみてみま...

CSS3を使用してオンラインライブ放送に似たキューアニメーションを実装する方法

以前、グループの友人が質問しました。つまり、ミニプログラムでユーザーがオンラインになったときに、ライ...

mysqldump を使用した MySql のインポートおよびエクスポート方法の概要

データベースデータをエクスポートします:まずcmdを開いてMySQLのbinフォルダに入ります1. ...

プロセスごとにネットワーク帯域幅を監視する Linux ツール Nethogs のインストールと展開

概要Linux 用のオープン ソース ネットワーク監視ツールは数多くあります。たとえば、帯域幅の使用...

初心者のためのWebページ作成: HTMLのハイパーリンクAタグの使い方を学ぶ

ハイパーリンク a タグはリンク ポイントを表し、英語の単語「anchor」の略語です。その機能は、...

Vue でバイナリ ファイル ストリームを受信して​​ PDF プレビューを実現する方法

バックグラウンド コントローラー @RequestMapping("/getPDFStre...

MySQL 上級学習インデックスの長所と短所、使用ルール

1. インデックスの利点と欠点利点: 高速検索、高速グループ化および並べ替えデメリット: ストレージ...

CSS グラデーション効果の概要 (線形グラデーションと放射状グラデーション)

線形グラデーション 背景画像: linear-gradient(方向、開始色、中間色1、中間色2、....

制限およびオフセット ページング シナリオを使用すると速度が遅くなるのはなぜですか?

質問から始めましょう5 年前、私が Tencent にいたとき、ページング シナリオでは MySQL...

条件付きコメント形式の書き方とサンプルコード

フロントエンドエンジニアとして、IE は私たちにとって馴染み深いものであるはずです。設計案を実装する...

Ubuntu 20.04 は Wi-Fi に接続します (2 つの方法)

最近Ubuntu 20.04をインストールしましたが、Wi-Fiに接続できず、Wi-Fiアイコンも表...

HTML+CSSを使用してTG-visionホームページを作成する方法

今回はHTML+CSSレイアウトを使用して、TG-vision Shuanghui Mediaのホー...

よく使われるHTMLタグのインライン要素とブロックレベル要素の詳細な説明

ブロック要素HTMLタグ分類の詳細* 住所 - 住所* blockquote - ブロック引用* c...