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

**URL:** https://forum.ficusonline.com/t/topic/337
**Category:** Server
**Created:** [2019 年 11 月 19 日午前 5:50 UTC](https://forum.ficusonline.com/t/topic/337 "2019-11-19T05:50:27Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2019 年 11 月 19 日午前 5:50 UTC](https://forum.ficusonline.com/t/topic/337/1 "2019-11-19T05:50:27Z")

</div>

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

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

 ![docker-compose-nginx](https://forum.ficusonline.com/uploads/default/original/1X/c8253942d77a5e03bc635b281eebdfa4be674c5c.png)

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

```auto
$ docker network create nginx-proxy

```

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

> **[GitHub - nginx-proxy/nginx-proxy: Automated nginx proxy for Docker containers using...](https://github.com/nginx-proxy/nginx-proxy)**
>
> Automated nginx proxy for Docker containers using docker-gen

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

> **[GitHub - nginx-proxy/acme-companion: Automated ACME SSL certificate generation for...](https://github.com/nginx-proxy/acme-companion)**
>
> Automated ACME SSL certificate generation for nginx-proxy

- **NGINX FastCGI Configuration Example**  
[F5 NGINX Product Documentation](https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/)

- **NGINX**  
[nginx - Official Image | Docker Hub](https://hub.docker.com/_/nginx)

- **PHP**  
[php - Official Image | Docker Hub](https://hub.docker.com/_/php)

- **Mariadb**  
[mariadb - Official Image | Docker Hub](https://hub.docker.com/_/mariadb)

### Docker-Composeファイルの作成

**docker-compose.yml**

```auto
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** をインストールします。

```auto
$ 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インフォメーション

```auto
$ docker exec php-fpm php -i

```

PHPモジュール確認

```auto
$ docker exec php-fpm php -m

```

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

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

```

### NGINX設定

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

```auto
$ docker exec -ti nginx nano /etc/nginx/conf.d/default.conf

```

```auto
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各コンテナを再起動します。

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

```

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

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2019 年 11 月 20 日午前 9:50 UTC](https://forum.ficusonline.com/t/topic/337/2 "2019-11-20T09:50:52Z")

</div>

### phpmyadminコンテナ追加

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

> **[GitHub - phpmyadmin/docker: Docker container for phpMyAdmin](https://github.com/phpmyadmin/docker)**
>
> Docker container for phpMyAdmin

**Docker Hub phpmyadmin**

> **[phpmyadmin/phpmyadmin - Docker Image](https://hub.docker.com/r/phpmyadmin/phpmyadmin)**

**phpmyadmin:fpm-alpineを利用**

> <https://github.com/phpmyadmin/docker/issues/253>
>
> I am trying to get the \`fpm-alpine\` image to work with nginx.
> 
> \`docker-compose….yml\`
> \`\`\`\`yaml
> version: "3.7"
> 
> networks:
> mynet:
> 
> volumes:
> mariadb\_data:
> phpmyadmin\_data:
> 
> services:
> 
> mariadb:
> image: mariadb:10.4.8-bionic
> environment:
> MYSQL\_DATABASE: mydb
> MYSQL\_ROOT\_PASSWORD: password
> MYSQL\_USER: admin
> MYSQL\_PASSWORD: password
> volumes:
> - mariadb\_data:/var/lib/mysql/
> networks:
> - mynet
> 
> phpmyadmin:
> image: phpmyadmin/phpmyadmin:fpm-alpine
> volumes:
> - phpmyadmin\_data:/var/www/html/
> networks:
> - mynet
> depends\_on:
> - mariadb
> 
> nginx:
> image: nginx:1.17.4-alpine
> volumes:
> - ./default.conf:/etc/nginx/conf.d/default.conf:ro
> - phpmyadmin\_data:/var/www/html/:ro
> ports:
> - "80:80"
> networks:
> - mynet
> depends\_on:
> - mariadb
> - phpmyadmin
> \`\`\`\`
> 
> \`default.conf\`
> \`\`\`\`nginx
> resolver 127.0.0.11 valid=15s;
> 
> server {
> 
> listen 80;
> server\_name www.example.com;
> 
> root /var/www/html/;
> index index.php index.html index.htm;
> 
> set $upstream phpmyadmin:9000;
> 
> location ~ \\/pma {
> fastcgi\_pass $upstream;
> fastcgi\_index index.php;
> fastcgi\_split\_path\_info ^(.+\\.php)(/.\*)$;
> include fastcgi\_params;
> fastcgi\_param SCRIPT\_FILENAME $document\_root$fastcgi\_script\_name;
> fastcgi\_param PATH\_INFO $fastcgi\_path\_info;
> }
> }
> \`\`\`\`
> 
> Then: \`docker-compose up\`.
> 
> When I access \`http://www.example.com/pma\` I get
> \> 502 Bad Gateway
> 
> I also tried to get it working using a port instead of path, i.e. \`http://www.example.com:8080\` instead of \`http://www.example.com/pma\`.
> 
> \[The docs\](https://docs.phpmyadmin.net/en/latest/setup.html#docker-examples) show examples using traefik and haproxy, \*but not for nginx\*.
> 
> Can someone spot the error in my setup, or does someone have a working example to share?

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

```auto
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**

```auto
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のサブディレクトリの設定は以下のサイトを参考にしています。

> **[PHP Apps in a Subdirectory in Nginx](https://serversforhackers.com/c/nginx-php-in-subdirectory)**
>
> We see how to properly configure Nginx to nest a PHP application in a sub-directory.

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

```auto
# chown -R 755 ../html

```

### NOTE)

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

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

> <https://github.com/phpmyadmin/docker/blob/master/fpm-alpine/config.inc.php>

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2019 年 11 月 28 日午前 1:57 UTC](https://forum.ficusonline.com/t/topic/337/3 "2019-11-28T01:57:57Z")

</div>

### 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';`を追加

```auto
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;
    }

```

**参考**

> **[Setting HTTPS $\_SERVER variables in PHP-FPM with Nginx](https://ma.ttias.be/setting-https-server-variables-in-php-fpm-with-nginx/)**
>
> A typical Nginx setup uses fastcgi\_pass directives to pass the request to the PHP-FPM daemon. If you would be running an Apache setup, Apache would automatically set the HTTPS server variable, that PHP code can check via $\_SERVER\['HTTPS'\] to...

> <https://stackoverflow.com/questions/4848438/fastcgi-application-behind-nginx-is-unable-to-detect-that-https-secure-connectio>

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2020 年 6 月 10 日午前 8:41 UTC](https://forum.ficusonline.com/t/topic/337/4 "2020-06-10T08:41:33Z")

</div>

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

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

```auto
post_max_size = 20M
upload_max_filesize = 10M

```

を追加。post\_max\_size\>upload\_max\_filesizeとすること。

### phpMyAdmin Error 504 Gateway Timeout Reloaded

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

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

```

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2021 年 1 月 21 日午前 5:55 UTC](https://forum.ficusonline.com/t/topic/337/5 "2021-01-21T05:55:29Z")

</div>

### ログイン時のエラー

**エラー内容**

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

**PMA\_ABSOLUTE\_URI** の設定変更（漏れ）が原因

- PMA\_ABSOLUTE\_URI=[http://127.0.0.1/phpmyadmin](http://127.0.0.1/phpmyadmin)
