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

WBOY
リリース: 2023-05-13 15:55:17
転載
1920 人が閲覧しました

プロキシの方法 (コンテナ間で通信する方法)?

nginx のプロキシ機能を直接使用するだけです (関連機能は別途参照) ここで厄介なのは、Docker コンテナ間の通信です。

docker コンテナ間で通信するには主に 4 つの方法があります:

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

##- ホストの ip:port 経由でアクセスする: ホストの IP が変わると、各アプリケーションを変更したり、ポートをバインドしたりする必要があり、面倒です。

#-リンクを介してリンクを確立します。相互に依存しすぎているため、メンテナンスに役立ちません。

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

明らかに、関連するアプリケーションを同じネットワークにリンクするカスタム ネットワーク方法を選択します。この方法では、アプリケーションとアプリケーション、エージェントとプロキシの間に実際には依存関係がありません。保守が簡単なだけでなく、移行も簡単です。設定は面倒ではなく、通常のIPまたはドメイン名を対応するコンテナ名に置き換えるだけです。

1. 統合ネットワーク

次に、最初に共有ブリッジ ネットワークを作成する必要があります:

docker network create proxy-network

# 查看
docker network ls
ログイン後にコピー

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

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

proxy-nginx
├── docker-compose.yml
├── logs # 日志
│  └── error.log
├── nginx
│  ├── dockerfile
│  ├── nginx.conf
│  └── startup.sh
├── sites # 被代理站点配置
│  ├── baipiaoquan.com.conf
│  └── chaohuahui.com.conf
└── ssl # 证书文件
  └── baipiaoquan.com.pem
ログイン後にコピー

一部のファイルは後続の実行プロセス中に生成されますが、構成中に必要なのは、必要なファイルとディレクトリを作成することだけです。

docker-compose.yml

version: "3"

networks:
 default:
  external:
   name: proxy-network

services:
 nginx:
  build:
   context: ./nginx
  volumes:
   - ./logs:/var/log/nginx
   - ./sites:/etc/nginx/sites-available
   - ./ssl:/etc/nginx/ssl
  ports:
   - "80:80"
   - "443:443"
ログイン後にコピー

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

dockerfile

from nginx:alpine

label maintainer="chuoke"

copy nginx.conf /etc/nginx/

run apk update
  && apk upgrade
  && apk add --no-cache openssl
  && apk add --no-cache bash

run set -x ;
  addgroup -g 82 -s www-data ;
  adduser -u 82 -d -s -g www-data www-data && exit 0 ; exit 1

add ./startup.sh /opt/startup.sh

run sed -i 's/.//g' /opt/startup.sh

cmd ["/bin/bash", "/opt/startup.sh"]

expose 80 443
ログイン後にコピー

設定と制御を容易にするために、実行中のユーザー グループとユーザー www-data がここで作成され、この名前は nginx の設定で使用されます。

nginx.conf

user www-data;
worker_processes 4;
pid /run/nginx.pid;
daemon off;

events {
 worker_connections 2048;
 multi_accept on;
 use epoll;
}

http {
 server_tokens off;
 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 15;
 types_hash_max_size 2048;
 client_max_body_size 20m;
 include /etc/nginx/mime.types;
 default_type application/octet-stream;
 access_log /dev/stdout;
 error_log /dev/stderr;

 gzip on;
 gzip_disable "msie6";

 ssl_protocols 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-aes256-gcm-sha384:ecdhe-rsa-aes256-gcm-sha384:dhe-rsa-aes128-gcm-sha256:dhe-rsa-aes256-gcm-sha384:ecdhe-ecdsa-aes128-sha256:ecdhe-rsa-aes128-sha256:ecdhe-ecdsa-aes128-sha:ecdhe-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-aes128-sha: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-gcm-sha384:aes128-sha256:aes256-sha256:aes128-sha:aes256-sha:des-cbc3-sha:!dss';

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-available/*.conf;

 open_file_cache off; # disabled for issue 619
 charset utf-8;
}
ログイン後にコピー

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

startup.sh

#!/bin/bash

# start crond in background
crond -l 2 -b

# start nginx in foreground
nginx
ログイン後にコピー

これは、nginx プログラムを開始するために使用されます。コンテンツは、主に将来のコンテンツ拡張の便宜のために、現在比較的小規模です。

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

docker-compose up -d nginx
ログイン後にコピー
ログイン後にコピー

正常に docker-compose ps が起動するか確認します。正常に起動しない場合は、設定に誤りがないか確認します。

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

3. アプリケーションの追加

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

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

アプリケーションの作成には docker-compose も使用します。

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

baipiaoquan/
├── docker-compose.yml
├── log
│  └── nginx
│    └── error.log
├── nginx
│  ├── dockerfile
│  ├── log
│  ├── nginx.conf
│  ├── sites
│  │  └── baipiaoquan.com.conf
│  ├── ssl
│  │  ├── baipiaoquan.com.key
│  │  ├── baipiaoquan.com.pem
│  └── startup.sh
└── php-fpm
  ├── dockerfile
  └── php.ini
ログイン後にコピー

docker-compose.yml

version: '3'

networks:
 proxy:
  external:
    name: ${proxy_network_name}
 backend:
  driver: ${networks_driver}

services:
 php-fpm:
   build:
    context: ./php-fpm
   volumes:
    - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
    - ${app_code_path_host}:${app_code_path_container}${app_code_container_flag}
   networks:
    - backend

 nginx:
   build:
    context: ./nginx
    args:
     - php_upstream_container=${nginx_php_upstream_container}
     - php_upstream_port=${nginx_php_upstream_port}
   volumes:
    - ${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
   container_name: ${compose_project_name}_nginx
   depends_on:
    - php-fpm
   networks:
    - proxy
    - backend
ログイン後にコピー

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

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

.env

# 宿主机中代码的位置
app_code_path_host=../

# 容器中代码的位置
app_code_path_container=/var/www

# 这个是抄的 laradock
app_code_container_flag=:cached

# 选择机器上的存储路径。适用于所有储存系统
data_path_host=~/.baipiaoquan/data

### drivers ################################################

# all volumes driver 
volumes_driver=local 

# 网络驱动 
networks_driver=bridge 

# 代理网络名称,这是前面创建的 
proxy_network_name=proxy-network

### docker compose files ##################################
# 
compose_file=docker-compose.yml

# change the separator from : to ; on windows
compose_path_separator=:

# 项目名称
compose_project_name=baipiaoquan
ログイン後にコピー

使用されるプロキシ ネットワーク名は、以前に作成した proxy-network です。

nginx のコンテナ名は、baipiaoquan_nginx になります。


nginx の dockerfile

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

from nginx:alpine

copy nginx.conf /etc/nginx/

run apk update
  && apk upgrade
  && apk --update add logrotate
  && apk add --no-cache openssl
  && apk add --no-cache bash

run set -x ;
  addgroup -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
arg php_upstream_port=9000

# set upstream conf and remove the default conf
run echo "upstream php-upstream { server ${php_upstream_container}:${php_upstream_port}; }" > /etc/nginx/conf.d/upstream.conf
  && rm /etc/nginx/conf.d/default.conf

add ./startup.sh /opt/startup.sh
run sed -i 's/.//g' /opt/startup.sh

cmd ["/bin/bash", "/opt/startup.sh"]

expose 80 443
ログイン後にコピー

php-fpm の dockerfile

from php:7.3-fpm

arg puid=1000

env puid ${puid}

arg pgid=1000

env pgid ${pgid}

run groupmod -o -g ${pgid} www-data &&
  usermod -o -u ${puid} -g www-data www-data

expose 9000

workdir /var/www

cmd ["php-fpm"]
ログイン後にコピー

php.ini ファイルを忘れないでください。デフォルトを使用して、この関連構成を削除することもできます。

サービスbaipiaoquan.com.conf 構成

server {

  listen 80 default_server;

  # for https
  listen 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 5m;
  ssl_protocols tlsv1 tlsv1.1 tlsv1.2;
  ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:high:!anull:!md5:!rc4:!dhe; 
  ssl_prefer_server_ciphers on;

  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;

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

  location ~ .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;
    #fixes timeouts
    fastcgi_read_timeout 600;
    include fastcgi_params;
  }

  location ~ /.ht {
    deny all;
  }

  location /.well-known/acme-challenge/ {
    root /var/www/letsencrypt/;
    log_not_found off;
  }
}
ログイン後にコピー

ここですべてを構成しましたが、実際には合理化でき、構成するだけで済みます。

アプリケーションの開始

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

docker-compose up -d nginx
ログイン後にコピー
ログイン後にコピー

予期せぬことが何も起こらなければ、アプリケーションは起動してサービスを受けられるはずです。コンテナーに入って localhost にアクセスしてテストし、結果が期待どおりかどうかを確認することもできます。次のようにテストしました。

docker-compose exec nginx wget localhost
ログイン後にコピー

次に、返されたデータのサイズを確認し、状況に基づいて成功したかどうかを判断します。

次のコマンドを使用して、アプリケーションがプロキシ ネットワークに正常に接続されているかどうかを確認できます:

docker network inspect proxy-network
ログイン後にコピー

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

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

注: 最初にアプリケーションを起動してからプロキシを起動する必要があります。そうしないと、nginx はアップストリーム エラーを見つけることができません。

ストレージの場所: proxy-nginx/sites/baipiaoquan.com.conf、上記の設定をコピーしていくつかの場所を変更するだけです。最終的な設定は次のとおりです:

# 我这配的仅支持 https,如果没要求,这个就不需要 

server {
  listen 80;
  server_name baipiaoquan.com www.baipiaoquan.com;
  return 301 https://$host$request_uri; 
}

server {

  # 如果是 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    5m;
  ssl_protocols       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 on;

  server_name 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";

  location / {
    proxy_set_header host        $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/ Web サイトにアクセスできるようになります。

他のアプリケーションを追加する必要がある場合も、ロジックとプロセスは同じになります。たとえば、別のアプリケーション https://chaohhuahui.com/ を追加し、それらの IP アドレスに ping を送信して、それらが同じであることを確認できます。

以上がNginx を使用して Docker で複数のアプリケーション サイトをプロキシする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!