Docker で複数のアプリケーション サイトをプロキシするために Nginx を使用する方法

Docker で複数のアプリケーション サイトをプロキシするために Nginx を使用する方法

序文

エージェントの役割は何ですか?
- 複数のドメイン名が同じサーバーに解決される

- 1つのサーバーで複数のアプリケーションに対して1つのポートのみを開くのに便利

- 煩わしいポートを使わずにアプリケーションにアクセスし、ドメイン名で直接アクセスします

- アプリケーションの分離

- カップリングを減らす

- ...

一般的に、メンテナンスが容易であり、1 つのアプリケーションをメンテナンスしても、他のアプリケーションに影響はありません。

プロキシする方法(コンテナは相互にどのように通信するのか)?

nginx のプロキシ機能を直接使用できます (関連する機能は別途参照)。ここで問題となるのは、docker コンテナ間の通信です。

Dockerコンテナが通信する主な方法は 4 つあります。

- コンテナ IP 経由のアクセス: コンテナを再起動すると、IP が変更されます。

- ホストマシンの ip:port 方式によるアクセス: ホストマシンの IP が変更されると、各アプリケーションを変更してポートをバインドする必要があり、面倒です。

- リンクを通じてリンクを確立する: 相互依存性が高すぎると、メンテナンスに役立ちません。

- カスタム ネットワーク: 同じブリッジ ネットワーク内のコンテナーは相互にアクセスできます。

当然のことながら、関連するアプリケーションを同じネットワークにリンクするには、カスタム ネットワーク メソッドが選択されます。この方法では、アプリケーションとエージェントの間に依存関係がないため、メンテナンスだけでなく移行にも便利です。設定も難しくなく、通常の IP またはドメイン名を対応するコンテナ名に置き換えるだけです。

1. 統合ネットワーク

したがって、まず共有ブリッジ ネットワークを作成する必要があります。

docker ネットワーク プロキシネットワークの作成

# docker network ls を表示

2. プロキシサービスコンテナ

docker-compose を使用して構築された proxy-nginx という名前の、プロキシ専用の nginx サービス コンテナを作成します。最終的なディレクトリ構造は次のようになります。

プロキシ-nginx
├── docker-compose.yml
├── logs # ログ│ └── error.log
├── nginx
│ ├── Dockerファイル
│ ├── nginx.conf
│ └── startup.sh
├── sites #プロキシサイトの設定│ ├── baipiaoquan.com.conf
│ └── chaohuahui.com.conf
└── ssl # 証明書ファイル└── baipiaoquan.com.pem

いくつかのファイルは、後続の実行プロセスで生成されます。設定時には、必要なファイルとディレクトリを作成するだけで済みます。

ドッカーの作成

バージョン: "3"

ネットワーク:
 デフォルト:
  外部の:
   名前: プロキシネットワーク

サービス:
 nginx:
  建てる:
   コンテキスト: ./nginx
  ボリューム:
   - ./logs:/var/log/nginx
   - ./sites:/etc/nginx/sites-available
   - ./ssl:/etc/nginx/ssl
  ポート:
   - 「80:80」
   - 「443:443」

外部ポート 80 と 443 をプロキシ サーバーにバインドすると、すべてのアプリケーションがここからアクセスできるようになります。

Dockerファイル

nginx:alpineから

ラベル メンテナー="chuoke"

nginx.conf をコピー /etc/nginx/

apkアップデートを実行する
  && apk アップグレード
  && apk に --no-cache openssl を追加します
  && apk add --no-cache bash

set -x を実行します。
  グループを追加します -g 82 -S www-data ;
  adduser -u 82 -D -S -G www-data www-data && exit 0 ; exit 1

./startup.sh /opt/startup.sh を追加します。

sed -i 's/.//g' /opt/startup.sh を実行します。

コマンド ["/bin/bash", "/opt/startup.sh"]

エクスポーズ 80 443

ここでは、簡単に構成と制御できるように、実行中のユーザー グループとユーザー www-data を作成します。この名前は、nginx 構成で使用されます。

nginx.conf

ユーザー www-data;
ワーカープロセス 4;
pid /run/nginx.pid;
デーモンオフ;

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

http {
 server_tokens オフ;
 ファイル送信オン;
 tcp_nopush オン;
 tcp_nodelay オン;
 キープアライブタイムアウト15;
 タイプハッシュの最大サイズは2048です。
 クライアントの最大ボディサイズは20Mです。
 /etc/nginx/mime.types を含めます。
 デフォルトタイプ アプリケーション/オクテットストリーム;
 アクセスログ /dev/stdout;
 エラーログ /dev/stderr;

 gzip オン;
 gzip_disable "msie6";

 ssl_プロトコル TLSv1 TLSv1.1 TLSv1.2;
 SSL_CIPHERS 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ecdsa-sa-sa-sa-sa-sa-sa-sa-sa-sa-sa-sa-sa-sa-sa- -RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-EECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHA-ECDHA HE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256 DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256:AES256-SMHA384 56-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!dss ';

 /etc/nginx/conf.d/*.conf を含めます。
 /etc/nginx/sites-available/*.conf を含めます。

 open_file_cache off; # 問題 619 のため無効
 文字セット UTF-8;
}

nginx のデフォルトの内容をコピーするだけです。変更する必要があるのは、実行中のユーザー名です。ユーザー名は以前の設定と一致している必要があることに注意してください。

スタートアップ

#!/bin/bash

# crond をバックグラウンドで起動する
crond -l 2 -b

# フォアグラウンドで nginx を起動します
nginx

これは nginx プログラムを起動するために使用されます。主に将来の拡張の便宜を図るため、現在の内容は比較的小さいです。

プロキシサービスコンテナを起動する

docker-compose up -d nginx

docker-compose ps で起動が正常かどうかを確認します。正常でない場合は、設定にエラーがないか確認します。

これで完了です。今はそのままにして、アプリケーションを作成してください。

3. アプリケーションを追加する

サイト https://baipiaoquan.com/ を追加します。

アプリケーションコンテナの構成

また、docker-compose を使用してアプリケーションを作成します。

これは PHP プロジェクトなので、このアプリケーションには少なくとも 2 つのサービス コンテナー (nginx と php-fpm) が必要です。プロジェクトのディレクトリ構造は次のとおりです。

百票全/
├── docker-compose.yml
├── ログ
│ └── nginx
│ └── エラー.log
├── nginx
│ ├── Dockerファイル
│ ├── ログ
│ ├── nginx.conf
│ ├── サイト
│ │ └── baipiaoquan.com.conf
│ ├── SSL
│ │ ├── baipiaoquan.com.key
│ │ ├── baipiaoquan.com.pem
│ └── startup.sh
└──php-fpm
  ├── Dockerファイル
  └──php.ini

ドッカーの作成

バージョン: '3'

ネットワーク:
 プロキシ:
  外部の:
    名前: ${PROXY_NETWORK_NAME}
 バックエンド:
  ドライバー: ${NETWORKS_DRIVER}

サービス:
 php-fpm:
   建てる:
    コンテキスト: ./php-fpm
   ボリューム:
    - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
    - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
   ネットワーク:
    - バックエンド

 nginx:
   建てる:
    コンテキスト: ./nginx
    引数:
     - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
     - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
   ボリューム:
    - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
    - ./log:/var/log/nginx
    - ./sites:/etc/nginx/sites-available
    - ./ssl:/etc/nginx/ssl
   コンテナ名: ${COMPOSE_PROJECT_NAME}_nginx
   依存:
    -php-fpm
   ネットワーク:
    - プロキシ
    - バックエンド

調整を容易にするために、ここでは環境変数が使用されます。

nginx コンテナ名 container_name: ${COMPOSE_PROJECT_NAME}_nginx に注意してください。この値は重要であり、後続のプロキシで使用されます。

.env

# ホスト内のコードの場所 APP_CODE_PATH_HOST=../

# コンテナ内のコードの場所 APP_CODE_PATH_CONTAINER=/var/www

# これはlaradockからコピーしたものです
APP_CODE_CONTAINER_FLAG=:キャッシュ済み

# マシン上のストレージ パスを選択します。すべてのストレージシステムに適用可能 DATA_PATH_HOST=~/.baipiaoquan/data

### ドライバー #####################################################

# すべてのボリューム ドライバー 
VOLUMES_DRIVER=ローカル 

# ネットワークドライバー NETWORKS_DRIVER=ブリッジ 

#プロキシネットワーク名。これは先ほど作成した PROXY_NETWORK_NAME=proxy-network です。

### Docker 構成ファイル ####################################
# 
COMPOSE_FILE = docker-compose.yml

# Windows で区切り文字を : から ; に変更します
COMPOSE_PATH_SEPARATOR=:

# プロジェクト名 COMPOSE_PROJECT_NAME=baipiaoquan

使用されるプロキシ ネットワーク名は、以前に作成された proxy-network です。
nginx のコンテナ名は baipiaoquan_nginx になります。

nginx 用の Dockerfile

このファイルは前のファイルから直接取得でき、PHP に関する関連情報を追加できます。

nginx:alpineから

nginx.conf をコピー /etc/nginx/

apkアップデートを実行する
  && apk アップグレード
  && apk --update ログローテーションを追加
  && apk に --no-cache openssl を追加します
  && apk add --no-cache bash

set -x を実行します。
  グループを追加します -g 82 -S www-data ;
  adduser -u 82 -D -S -G www-data www-data && exit 0 ; exit 1

ARG PHP_UPSTREAM_CONTAINER=php-fpm
引数 PHP_UPSTREAM_PORT=9000

# アップストリームの設定を行い、デフォルトの設定を削除します
実行 echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf
  && /etc/nginx/conf.d/default.conf を変更します

./startup.sh /opt/startup.sh を追加します。
sed -i 's/.//g' /opt/startup.sh を実行します。

コマンド ["/bin/bash", "/opt/startup.sh"]

エクスポーズ 80 443

php-fpm 用の Dockerfile

php:7.3-fpm より

引数PUID=1000

ENV PUID ${PUID}

引数PGID=1000

ENV PGID ${PGID}

実行 groupmod -o -g ${PGID} www-data &&
  usermod -o -u ${PUID} -g www-data www-data

エクスポーズ9000

ワークディレクトリ /var/www

コマンド ["php-fpm"]

php.ini ファイルを忘れないでください。デフォルトのファイルを使用することもできますが、その場合は関連する設定を削除する必要があります。

サービス baipiaoquan.com.conf の設定

サーバー{

  80 default_server をリッスンします。

  # httpsの場合
  443 ssl default_server をリッスンします。
  ssl_certificate /etc/nginx/ssl/3243258_baipiaoquan.com.pem;
  ssl_certificate_key /etc/nginx/ssl/3243258_baipiaoquan.com.key;
  ssl_session_timeout 5分;
  ssl_プロトコル TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
  ssl_prefer_server_ciphers をオン;

  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Content-Type-Options "nosniff";

  # localhost は server_name localhost baipiaoquan.com www.baipiaoquan.com である必要があります。
  root /var/www/; # これは以前の構成と一致しています index index.php index.html index.htm;

  位置 / {
     try_files $uri $uri/ /index.php$is_args$args;
  }

  場所 ~ .php$ {
    try_files $uri /index.php =404;
    fastcgi_pass php-upstream; # これは、nginx Dockerfile で設定された fastcgi_index index.php です。
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #タイムアウトを修正
    fastcgi_read_timeout 600;
    fastcgi_params を含めます。
  }

  場所 ~ /.ht {
    すべてを否定する;
  }

  場所 /.well-known/acme-challenge/ {
    ルート /var/www/letsencrypt/;
    log_not_found オフ;
  }
}

ここではすべてを設定しましたが、簡素化して必要なものだけを設定することもできます。

アプリケーションを起動する

この時点で、baipiaoquan.com サービスを開始できます。baipiaoquan ディレクトリで実行します。

docker-compose up -d nginx

すべてがうまくいけば、アプリが起動し、サービスを受信できるようになります。コンテナに入り、localhost にアクセスして結果が期待どおりかどうかを確認することでテストすることもできます。私は次のようにテストしました:

docker-compose exec nginx wget localhost

次に、返されたデータのサイズを確認し、状況に応じて成功したかどうかを判断します。
次のコマンドを使用して、アプリケーションがプロキシ ネットワークに正常に接続されているかどうかを確認できます。

docker ネットワーク検査プロキシネットワーク

次のステップは、このアプリケーションを世界中の人々が利用できるようにすることです。

nginx-proxyにプロキシ設定を追加する

注意: 最初にアプリケーションを起動し、次にプロキシを起動してください。そうしないと、nginx はアップストリームが見つからないというエラーを報告します。

保存場所: proxy-nginx/sites/baipiaoquan.com.conf。上記の設定をコピーして、いくつかの場所を変更するだけです。最終的な設定は次のようになります。

# 私の設定では https のみをサポートしています。要件がない場合は、サーバーは必要ありません {
  聞く 80;
  サーバー名 baipiaoquan.com www.baipiaoquan.com;
  301 https://$host$request_uri を返します。 
}

サーバー{

  # http の場合は、これを設定します # listen 80 default_server;

  # https の場合は、これを listen 443 ssl; に設定します。
  ssl_certificate /etc/nginx/ssl/3243258_baipiaoquan.com.pem;
  ssl_certificate_key /etc/nginx/ssl/3243258_baipiaoquan.com.key;
  ssl_session_timeout 5分;
  ssl_プロトコル TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers をオン;

  サーバー名 baipiaoquan.com www.baipiaoquan.com;

  add_header X-Frame-Options "SAMEORIGIN";
  add_header X-XSS-Protection "1; mode=block";
  add_header X-Content-Type-Options "nosniff";

  位置 / {
    proxy_set_header ホスト $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_pass http://baipiaoquan_nginx/; # この値はアプリケーション nginx のコンテナ名です}
}

プロキシ サーバーの構成を再読み込みし、nginx-proxy ディレクトリで実行します。

# まず設定ファイルをテストします。このステップは正常に実行される必要があります。docker-compose exec nginx nginx -t

# プロンプトが成功した場合はリロードし、そうでない場合はプロンプトに従って設定ファイルを確認して変更します。docker-compose exec nginx nginx -s reload

ちょっと待ってください。すべてがうまくいけば、世界中の人々がこのウェブサイト https://baipiaoquan.com/ にアクセスできるようになるはずです。

他のアプリケーションを追加する必要がある場合、ロジックとプロセスは同じです。たとえば、別のアプリケーション https://chaohuahui.com/ を追加しました。これらに ping を実行すると、同じ IP があることがわかります。

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

以下もご興味があるかもしれません:
  • Dockerコンテナにnginxを簡単にデプロイするプロセスの分析
  • docker nginxコンテナの起動とローカルへのマウントの詳細な説明
  • Docker ベースの nginx ファイル サーバーを構築する方法と手順
  • Docker で Nginx イメージ サーバーを構築する方法
  • Django+Mysql+Redis+Gunicorn+NginxのDockerデプロイメントの実装
  • Docker+keepalived+nginx を使用してマスタースレーブホットスタンバイを実装する方法の例
  • Dockerでnginxをデプロイし、設定ファイルを変更する方法
  • Docker Compose を使用して nginx のロード バランシングを実装する方法
  • docker で php+nginx+swoole+mysql+redis 環境を構築する方法
  • dockercompose を使用して springboot-mysql-nginx アプリケーションをビルドする
  • DockerでVueプロジェクトをデプロイする方法を教えます
  • vue-cli3 プロジェクトの構築最適化から Docker デプロイ方法まで
  • Docker イメージ + nginx を使用して Vue プロジェクトをデプロイする方法

<<:  標準SQL更新ステートメントの3つの用途についての簡単な理解

>>:  JavaScript の差異を利用して比較ツールを実装する

推薦する

Vueはカルーセルのフレームレート再生を実装します

この記事の例では、カルーセルのフレームレート再生を実現するためのVueの具体的なコードを参考までに共...

CSS で 3D ルービック キューブを実装するサンプル コード

今日は簡単な3Dルービックキューブを作ってみましょうまずはレンダリングを見てみましょう!これを学んだ...

Linuxロスレス展開方法

概要クラウド プラットフォームのお客様のサーバーでは、業務量が拡大し続けるとディスク容量が不足する場...

Linux NFSメカニズムの動作原理と例の分析

NFS とは何ですか?ネットワークファイルシステムネットワーク上でファイルを保存および整理するための...

MySQL/MariaDB ルートパスワードリセットチュートリアル

序文パスワードを忘れることは、よく遭遇する問題です。MySQL または MariaDB データベース...

MySQL の異常なエラー ERROR: 2002 を解決する方法

最近、MySQL の起動中にエラーが発生しました。エラー メッセージは次のとおりです。 エラー 20...

CSS Houdini でダイナミックな波効果を実現

CSS Houdini は、CSS 分野における最もエキサイティングなイノベーションとして知られてい...

HTMLからPDFへの変換のための純粋なクライアント側と純粋なサーバー側の実装ソリューション

必要ユーザーがフォームに入力して「保存」をクリックすると、PDF ドキュメントを直接ダウンロードでき...

ARGB、RGB、RGBAの違いと紹介

ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...

ユニアプリプロジェクトでのウォーターフォールレイアウトの実装

GitHubアドレス、気に入ったらスターを付けてくださいプラグインのプレビューチュートリアル1. プ...

HTTP および HTTP コラボレーション Web サーバー アクセス フロー図

Web サーバーは、独立したドメイン名を持つ複数の Web サイトを構築できるほか、通信経路上のトラ...

vue の webpack -v エラー解決の概要

XiaobaiはVueについて学び、次にwebpackについて学び、そしてさまざまなものをインストー...

CSS 要素の非表示の原則と display:none および visibility:hidden

1. CSS 要素の非表示<br />CSS では、要素を非表示にする (つまり、画面の...

IE環境では、divの高さはフォントの高さよりも大きくなければならないと規定されています。

コードをコピーコードは次のとおりです。 <div class="content&qu...

C# は MySQL コマンドラインのバックアップとリカバリを実装します

MySQL データベースをバックアップするためのツールは多数あります。過去 2 日間で、C# を使用...