Dockerコンテナ(NGINX+MariaDB+PHP-FPM+phpMyAdmin)によるサイト構築

NGINXによりPHPウェブサイトを立ち上げる場合

NGINXによるPHPで構成されたウェブページのレンダリングには、拡張モジュールPHP-FPM(FastCGI Process Manager)が必要となるため、NGINXの設定ファイルもこれに合わせる必要があります。

事前に専用のdockerネットワークnginx-proxyを新たに作成して下さい。

$ docker network create nginx-proxy

NGINXのプロキシ経由で接続する場合は以下のコンテナnginx-proxyを追加します。

LetsencryptによるSSL接続する場合には以下のコンテナを利用して下さい。

Docker-Composeファイルの作成

docker-compose.yml

version: '3'

services:
  mariadb:
    container_name: mariadb
    image: mariadb
    restart: always
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root_password
      - MYSQL_DATABASE=database
      - MYSQL_USER=user
      - MYSQL_PASSWORD=user_password
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.4

  nginx:
    container_name: nginx
    image: nginx:alpine
    volumes:
      - ./html:/var/www/html
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.6

  php-fpm:
    container_name: php-fpm
    image: php:7.2-fpm-alpine
    expose: 
      - "9000"
    volumes:
      - ./html:/var/www/html
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.7

networks:
  proxy-tier:
    external:
      name: nginx-proxy

追加パッケージ

上記nginx, php-fpmのイメージはともに最小構成OSのalpineのため、docker execコマンドによりbash, nanoをインストールします。

$ docker exec nginx apk update
$ docker exec php-fpm apk update

$ docker exec nginx apk add bash nano
$ docker exec php-fpm apk add bash nano

PHP-FPM拡張モジュールのインストール

PHPインフォメーション

$ docker exec php-fpm php -i

PHPモジュール確認

$ docker exec php-fpm php -m

php-fpmについてはmysqli拡張モジュールをインストールします。PHP拡張モジュールのためのスクリプト docker-php-ext-configure , docker-php-ext-install , and docker-php-ext-enable が予め用意されているため、これを利用します。

$ docker exec php-fpm docker-php-ext-install mysqli

NGINX設定

FastCGI設定箇所をアンコメントし、内容を変更します。

$ docker exec -ti nginx nano /etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    root   /var/www/html;
    index  index.php;

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

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }

    # Mitigate https://httpoxy.org/ vulnerabilities
        fastcgi_param HTTP_PROXY "";

        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;

    # include the fastcgi_param setting
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
}

最後にnginx,php-fpm各コンテナを再起動します。

$ docker container restart nginx
$ docker container restart php-fpm

phpコードによるアプリは /var/www/html フォルダに格納します。

phpmyadminコンテナ追加

phpmyadminコンテナを追加したdocker-composeファイルとnginx設定ファイルを追加します。MariaDBコンテナのデータベースをphpmyadminにより管理します。

Docker Hub phpmyadmin
https://hub.docker.com/r/phpmyadmin/phpmyadmin

phpmyadmin:fpm-alpineを利用

docke-compose.yml
nginxphpmyadmin-fpmvolumes セクションは外部共有ボリューム phpmyadmin_data を作成して共有すること。ホスト側で共有 ./phpmyadmin_data すると中身が空になります。

version: '3'

services:
  mariadb:
    container_name: mariadb
    image: mariadb
    restart: always
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root_password
      - MYSQL_DATABASE=database
      - MYSQL_USER=user
      - MYSQL_PASSWORD=user_password
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.4

  # nginx, additional install $ docker exec nginx apk add bash nano
  nginx:
    container_name: nginx
    image: nginx:alpine
    volumes:
      # shared nginx default.conf between host and container
      - ./nginx_default.conf:/etc/nginx/conf.d/default.conf
      # shared the directory /var/www/html in php-fpm container
      - ./html:/var/www/html/register:ro
      # shared the directory /var/www/html in phpmymyadmin-fpm container
      - phpmyadmin_data:/var/www/html/phpmyadmin:ro
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.6

  # php-fpm, additional install $ docker exec php-fpm apk add bash nano
  # php extension mysqli should be installed, $ docker exec php-fpm docker-php-ext-install mysqli
  php-fpm:
    container_name: php-fpm
    image: php:7.2-fpm-alpine
    tty: true
    expose: 
      - "9000"
    volumes:
      - ./html:/var/www/html
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.7

  # phpmyadmin-fpm, additional install $ docker exec phpmyadmin-fpm apk add bash nano 
  # php extension mysqli should be installed, $ docker exec phpmyadmin-fpm docker-php-ext-install mysqli
  phpmyadmin:
    container_name: phpmyadmin-fpm
    image: phpmyadmin/phpmyadmin:fpm-alpine
    tty: true
    expose: 
      - "9000"
    environment:
      - PMA_HOST=mariadb
      - PMA_PORT=3306
      - PMA_ABSOLUTE_URI=http://localhost/phpmyadmin
    volumes:
      - phpmyadmin_data:/var/www/html
      - /sessions
    restart: always
    networks:
      proxy-tier:
        ipv4_address: 172.18.0.8

networks:
  proxy-tier:
    external:
      name: nginx-proxy

volumes:
  phpmyadmin_data:
    external: true   

/etc/nginx/conf.d/default.conf

resolver 127.0.0.11 valid=15s;

server {
  listen 80;
  server_name localhost;
  root /usr/share/nginx/html;

  index index.html index.htm index.php;

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

  # main directory for app  

  location ~ [^/]\.php(/|$) {
      fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  #   fastcgi_pass php-fpm:9000;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

  # subdirectory for phpmyadmin pages

  location ^~ /phpmyadmin {

    alias /var/www/html/phpmyadmin;
    try_files $uri $uri/ @phpmyadmin;

    location ~ \.php$ {
      fastcgi_split_path_info ^\/phpmyadmin\/(.+\.php)(.*)$;
      fastcgi_pass phpmyadmin-fpm:9000;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    }
  }

  location @phpmyadmin {
     rewrite /phpmyadmin/(.*)$ /phpmyadmin/index.php?/$1 last;
  }

  # subdirectory for register pages
  
  location ^~ /register {

    alias /var/www/html/register;
    try_files $uri $uri/ @register;

    location ~ \.php$ {
      fastcgi_split_path_info ^\/register\/(.+\.php)(.*)$;
      fastcgi_pass php-fpm:9000;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
    }
  }

  location @register {
     rewrite /register/(.*)$ /register/index.php?/$1 last;
  }

}

Nginxのサブディレクトリの設定は以下のサイトを参考にしています。

phpmyadminへのアクセスでブランクページ、403エラーを表示する場合、アクセス権を見直します。
phpmyadmin-fpmコンテナ内でchownコマンドを実行。

# chown -R 755 ../html

NOTE)

phpMyAdminのphpファイル群はphpmyadmin-fpmvar/www/html に、設定ファイル config.inc.php は、 /etc/phpmyadmin に格納されています。

カスタマイズする場合は、 /etc/phpmyadmin/config.user.inc.php に記述します。

Mixed Content Error

NGINX+FastCGI(共にDockerコンテナ)によるサイトの表示エラー。
HTTPSページ読み込み時のエラーで、ページを構築するために必要なCSS,JS等の関連ファイルをHTTPで読み込もうとするために生じるエラー。

Mixed Content: The page at '<URL>' was loaded over HTTPS, but requested an insecure stylesheet '<URL>'. This request has been blocked; the content must be served over HTTPS.

対策

NginxからFastCGIコンテナへのパスをHTTPSで指定。Nginxの設定は以下の通り。

fastcgi_param HTTPS 'on';を追加

location = /index.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_keep_conn on;
        fastcgi_param  HTTPS 'on';
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

参考

phpmyadmin-fpmコンテナによるテーブルデータアップロードエラー

phpmyadminコンテナ内の以下設定ファイル /usr/local/etc/php/conf.d/phpmyadmin-misc.ini

post_max_size = 20M
upload_max_filesize = 10M

を追加。post_max_size>upload_max_filesizeとすること。

phpMyAdmin Error 504 Gateway Timeout Reloaded

Pimcoreのsqlテーブルのインポート時に504エラーが発生したため、nginxの設定に以下追加。

fastcgi_connect_timeout 900;//in 900 timeout
fastcgi_send_timeout 900; //in 900secend
fastcgi_read_timeout 900; //in 900secend

ログイン時のエラー

エラー内容

Failed to set session cookie. Maybe you are using HTTP instead of HTTPS to access phpMyAdmin.

PMA_ABSOLUTE_URIの設定変更(漏れ)が原因