ホームページ  >  記事  >  バックエンド開発  >  単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法

単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法

不言
不言オリジナル
2018-07-09 09:28:522178ブラウズ

この記事では、主に 1 つの Nginx イメージを複数の PHP-FPM コンテナに合わせて調整する方法を紹介します。これには一定の参考値があります。今、共有します。必要な友人は参考にしてください。

最近、私は、 Docker コンテナを使用して一連の PHP マイクロサービスをデプロイすることに取り組んできました。問題の 1 つは、PHP アプリケーションが (ここで述べたような単純な Apache/PHP[1] セットアップではなく) PHP-FPM および Nginx で動作するようにセットアップされていることです。そのため、PHP マイクロサービスごとに 2 つのコンテナーが必要です (これも同等です)。 2 つの Docker イメージに):

  • #PHP-FPM コンテナ

  • Nginx コンテナ

  • ##アプリケーションが開発環境と本番環境を含む 6 つを超える PHP マイクロサービスを実行すると、最終的には 30 個近くのコンテナーが存在することになります。 PHP-FPM マイクロサービス イメージごとに一意の Nginx イメージを構築する代わりに、個別の Nginx Docker イメージを構築し、PHP-FPM ホスト名を環境変数としてこのイメージ内の固有の構成ファイルにマップすることにしました。

単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法

このブログ投稿では、上記の方法 1 から方法 2 までのプロセスの概要を説明し、最後に新しいカスタム Nginx Docker イメージの使用方法を紹介します。 . このブログを終了するための解決策。

この画像は GitHub[2] でオープン ソースにしました。この問題が頻繁に発生する場合は、お気軽にチェックしてください。

Nginx を使う理由

単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法PHP-FPM と Nginx を併用すると、PHP アプリケーションのパフォーマンスが向上します [3]。ただし、欠点は、PHP-FPM Docker イメージがデフォルトで PHP Apache に設定されないことです。画像。Nginx にバンドルされています。

Nginx コンテナを PHP-FPM バックエンドに接続する場合は、そのバックエンドの DNS レコードを Nginx 構成に追加する必要があります。

たとえば、PHP-FPM コンテナが php-fpm-api という名前のコンテナとして実行されている場合、Nginx 構成ファイルは次のようになります。

nginx
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # This line passes requests through www.dongfan178.com to the PHP-FPM container
        fastcgi_pass php-fpm-api:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param www.huayi1.cn/ www.dongfan178.com SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param www.00534.cn PATH_INFO $fastcgi_path_info;
    }

PHP-FPM コンテナ アプリケーションを 1 つだけ提供する場合は、 Nginx コンテナーの構成ファイルに対応する名前をハードコードすることができます。ただし、上で述べたように、各 PHP サービスには対応する Nginx コンテナが必要であるため、複数の Nginx コンテナを実行する必要があります。新しい Nginx イメージを作成する (後で保守してアップグレードする必要があります) のは面倒です。単一の変数名を変更するのに、多数の異なるボリュームを管理するだけでも大変な作業のように見えるからです。

最初の解決策: Docker ドキュメントに記載されているメソッド envsubst を使用します。

単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法

最初は、簡単だと思いました。 Docker ドキュメントには envsubst[4] の使用方法に関する優れた小さな章がありますが、残念ながら、これは私の Nginx 構成ファイルでは機能しません:

vhost.conf

nginx
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    client_max_body_size 32M;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass ${NGINX_HOST}:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

my vhost .conf ファイルはいくつかの Nginx 組み込み環境変数を使用するため、Docker ドキュメントに記載されている次のコマンド ラインを実行すると、「$uri と fastcgi_script_name が定義されていません」というエラー メッセージが表示されます。

shell
/bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g &#39;daemon off;&#39;"

これらの変数は通常、Nginx 自体によって渡される [5]ため、それらが何であるか、パラメータを渡す方法を理解するのは簡単ではありません。これはコンテナの動的な構成可能性に影響します

ほぼ成功した別の Docker イメージ

単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法次に、さまざまな Nginx ベース イメージの検索を開始しました。 2つ見つけましたが、どちらも2年間更新されていませんでした。私は martin/nginx[6] から始めて、動作するプロトタイプを取得できるかどうかを確認しようとしました。

Martin のイメージは、特定のファイル ディレクトリ構造を必要とするため、少し異なります。まず Dockerfile に追加しました。

FROM martin/nginx

次に、空の app/ ディレクトリと vhost.conf ファイルのみを含む conf/ ディレクトリを追加しました。

vhost.conf

nginx
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    client_max_body_size 32M;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $ENV{"NGINX_HOST"}:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

これは、元の構成ファイルに似ていますが、fastcgi_pass $ENV{"NGINX_HOST"}:9000; という 1 行だけが変更されています。ここで、Nginx コンテナーと php-fpm-api という PHP コンテナーを起動する場合は、まず新しいイメージをコンパイルし、実行時に対応する環境変数を渡すことができます。ただし、この方法には気になる問題が 2 つあります。

基本イメージのバージョンが古く、2 年以上更新されていません。これにより、セキュリティとパフォーマンスのリスクが生じる可能性があります。

  1. アプリに空のディレクトリを要求する必要はないようですが、ファイルは別のディレクトリに配置されています。

  2. 最終ソリューション

Martin のミラーはカスタム ソリューションの良い選択だと思います。そこで私は彼のリポジトリをフォークして、上記の 2 つの問題を解決する新しい Nginx ベース イメージを構築しました。ここで、動的に名前が付けられたバックエンド アプリケーションを nginx コンテナーで実行したい場合は、次のようにするだけです:

shell
# Pull down the latest from Docker Hub
docker pull shiphp/nginx-env:latest
# Run a PHP container named "php-fpm-api"
docker run --name php-fpm-api -v $(pwd):/var/www php:fpm
# Start this NGinx container linked to the PHP-FPM container
docker run --link php-fpm-api -e NGINX_HOST=php-fpm-api shiphp/nginx-env

如果你想自定义这个镜像,添加你自己的文件或者Nginx配置文件,只需要像下面这样扩展你的Dockerfile:

FROM shiphp/nginx-env
ONBUILD ADD <PATH_TO_YOUR_CONFIGS> /etc/nginx/conf.d/

现在我所有的PHP-FPM容器都使用单个Nginx镜像的实例,当我需要升级Nginx、修改权限或者配置一些东西的时候,这让我的生活变得简单多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP缓存区ob的介绍

如何配置php客户端(phpredis)并连接Redis

使用PHPstudy在Windows服务器下部署PHP系统

以上が単一の Nginx イメージを複数の PHP-FPM コンテナーに合わせて調整する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。