Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Question] Serving fpm-alpine image with nginx #253

Open
lonix1 opened this issue Oct 18, 2019 · 51 comments
Open

[Question] Serving fpm-alpine image with nginx #253

lonix1 opened this issue Oct 18, 2019 · 51 comments
Labels

Comments

@lonix1
Copy link

lonix1 commented Oct 18, 2019

I am trying to get the fpm-alpine image to work with nginx.

docker-compose.yml

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

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 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?

@williamdes
Copy link
Member

@lonix1 try port 9000 on host phpmyadmin for fastcgi_pass since you are sending the script to the cgi and not to the web server

If it does not work comment back here :)

@lonix1
Copy link
Author

lonix1 commented Oct 18, 2019

@williamdes Thanks - yes you are right it should be 9000! I edited it above.

However, it still does not work :-(

curl http://www.example.com/pma gives:

File not found.

The docker log shows:

"GET /pma/index.php" 404

@williamdes
Copy link
Member

maybe you should change /var/www/html to /usr/src/phpmyadmin

See: https://github.com/phpmyadmin/docker/blob/master/fpm-alpine/Dockerfile#L77

I assume you have data into the volume phpmyadmin_data

https://superuser.com/a/435969/609233
I would write the nginx config block like that

  location ~ \/pma {
    rewrite ^/pma(/.*)$ $1 last;
    fastcgi_pass $upstream;
    fastcgi_index index.php;
    include snippets/fastcgi-php.conf;
    # remove line below ?
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

You are maybe missing the rewrite part since the files are in the root folder and not in /pma

@lonix1
Copy link
Author

lonix1 commented Oct 18, 2019

When I do docker-compose up for the first time, it says

phpMyAdmin not found in /var/www/html - copying now...
Complete! phpMyAdmin has been successfully copied to /var/www/html

That's why I used that path. But even if I use /usr/src/phpmyadmin it fails with same error. I checked that there are files in there, looks okay.

I tried the new location block also. Same error (file not found).

Does that actually work for you?


I will carry on fiddling to get it working. Maybe we can then add it to the docs.

@williamdes
Copy link
Member

williamdes commented Oct 18, 2019

After hours (since my last post) I could not make a rewrite folder that worked.

Light version

resolver 127.0.0.11 valid=15s;
server {
    listen 80;
    server_name williamdes.local default_server;
    root /var/www/html/;
    index index.php index.html index.htm;
    set $upstream phpmyadmin:9000;

    location ~ \.php$ {
        try_files $uri = 404;
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $upstream;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
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
    environment:
      PMA_HOST: mariadb
    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:
      - "90:80"
    networks:
      - mynet
    depends_on:
      - mariadb
      - phpmyadmin

@williamdes
Copy link
Member

Using a proxy

resolver 127.0.0.11 valid=15s;
server {
    listen 80;
    server_name williamdes.local default_server;
    root /var/www/html/;
    index index.php index.html index.htm;
    set $upstream phpmyadmin:9000;

    location ^~ /pma {
        rewrite /pma/(.*) /$1 last;
        proxy_pass http://localhost:80;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect off;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $upstream;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

Using CGI

Thanks to: https://stackoverflow.com/a/29213330/5155484

resolver 127.0.0.11 valid=15s;
server {
    listen 80;
    server_name williamdes.local default_server;
    root /var/www/html/;
    index index.php index.html index.htm;
    set $upstream phpmyadmin:9000;

    location ^~ /pma {
        rewrite /pma/(.*) /$1 last;
        try_files $uri = 404;
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $upstream;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

    location ~ \.php$ {
        try_files $uri = 404;
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $upstream;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

@lonix1 the CGI version is what you want

@lonix1
Copy link
Author

lonix1 commented Oct 19, 2019

@williamdes wow thanks! I used the "Using CGI" section, and got it working finally, but on the wrong path:

curl http://www.example.com/pma gives 404
but
curl http://www.example.com/ gives the phpmyadmin login page


BTW, I assume your "Using a proxy" section is for the latest image, and "Using CGI" is for the fpm-alpine and fpm images?

@williamdes
Copy link
Member

I think you are correct on what you assume

@lonix1 can you paste your final configuration?

I made it work with the ^~ and position can be important from what Internet says

@lonix1
Copy link
Author

lonix1 commented Oct 20, 2019

Okay I got it to work, thanks to this!

Notes:

  • No rewriting necessary
  • I did not need to set PMA_ABSOLUTE_URI - not sure why?
resolver 127.0.0.11 valid=15s;

server {

  listen 80;
  server_name www.example.com example.com;
  set $upstream phpmyadmin:9000;

  location ^~ /phpmyadmin {
    alias /var/www/html/;
    index index.php;
    location ~ \.php$ {
      try_files $uri = 404;
      fastcgi_pass $upstream;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $request_filename;
    }
  }

}

This should be in the docs. If someone knows how to do that, please add @williamdes' code for latest image and my code for fpm-alpine and fpm images.

@lonix1
Copy link
Author

lonix1 commented Oct 20, 2019

@williamdes BTW thanks for taking the time to help me... Appreciated!

@williamdes
Copy link
Member

@lonix1 I think it is because all files need to know their base path?

@lonix1
Copy link
Author

lonix1 commented Oct 20, 2019

@williamdes Yes... so we need to correctly set SCRIPT_FILENAME.

@williamdes
Copy link
Member

@lonix1 please post the config when you have a working example ;)

@lonix1
Copy link
Author

lonix1 commented Oct 20, 2019

@williamdes This works for me:

docker-compose.yml

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
    environment:
      PMA_HOST: mariadb
     #PMA_ABSOLUTE_URI: http://www.example.com/phpmyadmin/
    volumes:
      - phpmyadmin_data:/var/www/html/
     #- ./config.user.inc.php:/etc/phpmyadmin/config.user.inc.php:ro
    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

resolver 127.0.0.11 valid=15s;

server {
  listen 80;
  server_name www.example.com example.com;
  set $upstream phpmyadmin:9000;

  location ^~ /phpmyadmin {
    alias /var/www/html/;
    index index.php;
    location ~ \.php$ {
      try_files      $uri = 404;
      include        fastcgi_params;
      fastcgi_split_path_info ^\/phpmyadmin\/(.+\.php)(.*)$;
      fastcgi_param  SCRIPT_FILENAME $fastcgi_script_name;
      fastcgi_pass   $upstream;
    }
  }

}

Of course, in production, nginx would not be in the same stack (but should be in the same docker network).

@williamdes
Copy link
Member

@lonix1 Thank you !

From what I understand removing $document_root solved the URI issue.

If you want to open a pull-request let me know, if not I will do it

@lonix1
Copy link
Author

lonix1 commented Oct 20, 2019

I'm not sure how to do that... what I mean is that maybe the documents site can have this info...

@williamdes williamdes self-assigned this Oct 20, 2019
@williamdes williamdes removed their assignment Dec 24, 2019
@Jason-2020
Copy link

Jason-2020 commented Dec 27, 2019

@lonix1 Does nginx server need to have phpmyadmin volume attached to it?
In my case I'd like to use host machine's nginx but don't want to share phpmyadmin docker's volume into host machine to actually use it as 'stateless' as possible.

@lonix1
Copy link
Author

lonix1 commented Dec 27, 2019

@Jason-2020 From what I remember the alpine image doesn't come with a webserver, that's why you need to use nginx.

If you want phpmyadmin to be completely isolated, then don't use the alpine image. The normal image comes with apache, I think.

@williamdes
Copy link
Member

@lonix1 yes, there is an apache version
I think you need to have the volume attached or you will get 404 errors if you do not bypass the file check on the nginx side before sending requests to the fpm server

@ThibaultVlacich
Copy link

ThibaultVlacich commented Feb 14, 2020

I'm trying to serve PHPMyAdmin on the root of a subdomain using Nginx, to avoid having two web-server running (I use Nginx for the rest of my application, so having Apache just for PMA is not really optimal...), but I cannot get it working.

I followed the conversation here, but all I get is a "404 not found", and this in the Nginx logs:

2020/02/14 21:34:49 [error] 15#15: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.18.0.1, server: phpmyadmin.example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://172.18.0.5:9000", host: "phpmyadmin.example.com"

Here's what I have for now for my Nginx config:

server {
    server_name phpmyadmin.example.com;
    root /var/www/html;
    index index.php index.html index.htm;

    location ~ \.php$ {
        try_files $uri = 404;

        fastcgi_pass phpmyadmin:9000;
        #fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        fastcgi_param HTTPS off;
    }

    error_log /var/log/nginx/phpmyadmin_error.log;
    access_log /var/log/nginx/phpmyadmin_access.log;
}

Any idea?

@williamdes
Copy link
Member

Hi @ThibaultVlacich
Maybe you should follow #253 (comment) and use fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Did this work ?

@ThibaultVlacich
Copy link

It... worked...

Swear I tried it already but I guess not. Thanks @williamdes.

@zengzhengrong
Copy link

zengzhengrong commented Apr 30, 2020

Okay I got it to work, thanks to this!

Notes:

  • No rewriting necessary
  • I did not need to set PMA_ABSOLUTE_URI - not sure why?
resolver 127.0.0.11 valid=15s;

server {

  listen 80;
  server_name www.example.com example.com;
  set $upstream phpmyadmin:9000;

  location ^~ /phpmyadmin {
    alias /var/www/html/;
    index index.php;
    location ~ \.php$ {
      try_files $uri = 404;
      fastcgi_pass $upstream;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $request_filename;
    }
  }

}

This should be in the docs. If someone knows how to do that, please add @williamdes' code for latest image and my code for fpm-alpine and fpm images.

I user this config ,www.example.com/phpmyadmin is work,but i add

    location / {
        uwsgi_pass  unix:/api/api.sock;        
        include     uwsgi_params;
    }

    location /phpmyadmin {
        alias /var/www/html/;
        index index.php;
        location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_pass $upstream;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

browser www.example.com will be download file , have any idea?

when fastcgi_param SCRIPT_FILENAME $request_filename; change to fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; it www.example.com/phpmyadmin does not work, i am not clear konw about fastcgi_param and variables does mean what

@williamdes
Copy link
Member

browser www.example.com will be download file , have any idea?

You did not configure correctly the .php file handler IMO

@zengzhengrong
Copy link

@williamdes
I guess probably is browser cause it ,
I use edge to browse www.example.com ,it can show me page correctly ,but chrome do not,always download the php file

@zengzhengrong
Copy link

zengzhengrong commented May 2, 2020

@williamdes
I test curl or wget ,it both correctly route to my api.sock and postman as good as well,only chrome do not

@williamdes
Copy link
Member

Very strange, could you send all the nginx config file?

@zengzhengrong
Copy link

zengzhengrong commented May 2, 2020

https://github.com/zengzhengrong/django-forum-backend/blob/master/nginx/conf.d/django.conf

resolver 127.0.0.11 valid=15s;

server {
    listen    80;
    charset     utf-8;
    client_max_body_size 75M;
    server_name     192.168.1.235;
    set $upstream phpmyadmin:9000;

    location /static {
        alias /api/static;
    }

    location /media {
        alias /api/media;
        expires 24h;
    }

    location /flower-internal/ {
        internal;
        rewrite ^/flower-internal/(.*)$ /$1 break;
        proxy_pass http://django-forum-backend:5555;
        proxy_set_header Host $host;
    }
    
    location / {
        uwsgi_pass  unix:/api/api.sock;        
        include     uwsgi_params;
    }

    location /phpmyadmin {
        alias /var/www/html/;
        index index.php;
        location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_pass $upstream;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

}

@williamdes
Copy link
Member

@zengzhengrong Could you copy the request from F12 > Network > The request (index.php) > Copy > as curl and post it here after trying it into a terminal ?

@zengzhengrong
Copy link

zengzhengrong commented May 2, 2020

The chrome response headers have a Content-Type: application/octet-stream

微信截图_20200503023331

chrome:

微信截图_20200503023845

edge:
微信截图_20200503023831

copy as curl in terminal:
微信截图_20200503024423

@williamdes
Copy link
Member

@zengzhengrong

I use edge to browse www.example.com ,it can show me page correctly ,but chrome do not,always download the php file

So the application/octet-stream sent to chrome is html or php code ?

@zengzhengrong
Copy link

I download and open with vscode:

<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
 * Main loader script
 *
 * @package PhpMyAdmin
 */
declare(strict_types=1);

use PhpMyAdmin\Controllers\HomeController;
use PhpMyAdmin\Core;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Response;
use PhpMyAdmin\Url;
use PhpMyAdmin\Util;

if (! defined('ROOT_PATH')) {
    define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);
}

global $server;

require_once ROOT_PATH . 'libraries/common.inc.php';

/**
 * pass variables to child pages
 */
$drops = [
    'lang',
    'server',
    'collation_connection',
    'db',
    'table',
];
foreach ($drops as $each_drop) {
    if (array_key_exists($each_drop, $_GET)) {
        unset($_GET[$each_drop]);
    }
}
unset($drops, $each_drop);

/**
 * Black list of all scripts to which front-end must submit data.
 * Such scripts must not be loaded on home page.
 */
$target_blacklist =  [
    'import.php',
    'export.php',
];

// If we have a valid target, let's load that script instead
if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && 0 !== strpos($_REQUEST['target'], "index")
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'], [], true)
) {
    include ROOT_PATH . $_REQUEST['target'];
    exit;
}

/** @var Response $response */
$response = $containerBuilder->get(Response::class);

/** @var DatabaseInterface $dbi */
$dbi = $containerBuilder->get(DatabaseInterface::class);

/** @var HomeController $controller */
$controller = $containerBuilder->get(HomeController::class);

if (isset($_REQUEST['ajax_request']) && ! empty($_REQUEST['access_time'])) {
    exit;
}

if (isset($_POST['set_theme'])) {
    $controller->setTheme([
        'set_theme' => $_POST['set_theme'],
    ]);

    header('Location: index.php' . Url::getCommonRaw());
} elseif (isset($_POST['collation_connection'])) {
    $controller->setCollationConnection([
        'collation_connection' => $_POST['collation_connection'],
    ]);

    header('Location: index.php' . Url::getCommonRaw());
} elseif (! empty($_REQUEST['db'])) {
    // See FAQ 1.34
    $page = null;
    if (! empty($_REQUEST['table'])) {
        $page = Util::getScriptNameForOption(
            $GLOBALS['cfg']['DefaultTabTable'],
            'table'
        );
    } else {
        $page = Util::getScriptNameForOption(
            $GLOBALS['cfg']['DefaultTabDatabase'],
            'database'
        );
    }
    include ROOT_PATH . $page;
} elseif ($response->isAjax() && ! empty($_REQUEST['recent_table'])) {
    $response->addJSON($controller->reloadRecentTablesList());
} elseif ($GLOBALS['PMA_Config']->isGitRevision()
    && isset($_REQUEST['git_revision'])
    && $response->isAjax()
) {
    $response->addHTML($controller->gitRevision());
} else {
    // Handles some variables that may have been sent by the calling script
    $GLOBALS['db'] = '';
    $GLOBALS['table'] = '';
    $show_query = '1';

    if ($server > 0) {
        include ROOT_PATH . 'libraries/server_common.inc.php';
    }

    $response->addHTML($controller->index());
}

@devsaumya
Copy link

devsaumya commented May 9, 2020

version: '3.6'
services:
    web:
       image: nginx:latest
       container_name: nginx
       restart: unless-stopped
       ports:
            - "8080:80"
       volumes:
            - ./public_html:/public_html
            - ./conf.d:/etc/nginx/conf.d
            -  /etc/localtime:/etc/localtime
            - ./logs/nginx-error.log:/var/log/nginx/error.log
            - ./logs/nginx-access.log:/var/log/nginx/access.log
       networks:
            - nginxphp
    php:
       image: php:fpm
       container_name: php-fpm
       restart: unless-stopped
       volumes:
            - ./public_html:/public_html
       expose:
            - 9000
       networks:
            - nginxphp
    mySql:
        image: mysql/mysql-server:latest
        container_name: mysql
        restart: unless-stopped
        restart: always
        environment:
            - MYSQL_DATABASE= 'root'
            - MYSQL_USER=root
            - MYSQL_ROOT_PASSWORD=password
            - MYSQL_PASSWORD=password
        ports:
            - "3306:3306"
        networks:
            - nginxphp
    phpmyadmin:
        image: phpmyadmin/phpmyadmin:fpm-alpine
        container_name: phpmyadmin
        restart: always
        environment:
               PMA_HOST: mySql
        ports:
            - 8081:80
        volumes:
            - /sessions
            - ~/docker/phpmyadmin/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
            - /custom/phpmyadmin/theme/:/www/themes/theme/
        networks:
            - nginxphp
        depends_on:
            - mySql
networks:
     nginxphp:

and config file

resolver 127.0.0.11 valid=15s;
server {
        listen 80;
	    server_name _;
        root /public_html;
        location / {
            index index.php index.html;
        }
        location ~* \.php$ {
            fastcgi_pass    php:9000;
            fastcgi_index   index.php;
            include         fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
        location ^~ /phpmyadmin {
            alias /var/www/html/;
            index index.php;
            location ~ \.php$ {
            try_files      $uri = 404;
            include        fastcgi_params;
            fastcgi_split_path_info ^\/phpmyadmin\/(.+\.php)(.*)$;
            fastcgi_param  SCRIPT_FILENAME $fastcgi_script_name;
            fastcgi_pass   $upstream;
            }
        }    
}

can anyone help where I am going wrong, Nginx and MySQL and PHP:fpm is serving info.php but PHPMyAdmin/PHPMyAdmin:fpm-alpine is not working the PHPMyAdmin container is stopped standard_init_linux.go:211: exec user process caused "exec format error" and IP:8081/phpmyadmin is 404.

@williamdes
Copy link
Member

@DevSaumyadip I think fastcgi_split_path_info is either invalid or useless
#253 (comment)

@pzystorm
Copy link

pzystorm commented Aug 30, 2020

I also have some trouble with the phpmyadmin:fpm-alpine image. my docker-compose.yml is this:

version: "3.7"

networks:
  pma_net:

services:

  pma_php:
    image: phpmyadmin/phpmyadmin:fpm-alpine
    container_name: pma_php
    volumes:
      - ./phpmyadmin/:/var/www/html/
      - ./sessions/:/sessions/
    networks:
      - pma_net

First, I want t have a working phpmyadmin, then I want to continue with nginx and mysql.
But, I have already trouble with phpmyadmin. This image seems not to install any phpmyadmin php stuff.
After
/usr/local/bin/docker-compose up -d and
/usr/local/bin/docker-compose exec pma_php /bin/bash
I look into the folder /var/www/html and it is completely empty.
There is some /usr/src/php.tar.xz but has not been extracted.

For me it seems, the Dockerfile (https://github.com/phpmyadmin/docker/blob/master/fpm-alpine/Dockerfile) is not executed at all.

Can someone give some ideas on that?

FYI, output of /usr/local/bin/docker-compose up is this

Pulling phpmyadmin (phpmyadmin/phpmyadmin:fpm-alpine)...
fpm-alpine: Pulling from phpmyadmin/phpmyadmin
df20fa9351a1: Already exists
b358d6dbbdff: Already exists
0232d962484c: Already exists
0c1d3ac04d2a: Already exists
21e2be1d2e71: Pull complete
a715280c3b40: Pull complete
4fa736fe3036: Pull complete
4808dd45a24b: Pull complete
591d728477bc: Pull complete
5c38ac758dc8: Pull complete
a71b4a25891a: Pull complete
de76418f19c8: Pull complete
c65c697332bd: Pull complete
f0c6a339d37c: Pull complete
ac061b372d71: Pull complete
ee55b41a276b: Pull complete
Digest: sha256:b83b55bdef2c17d9eb18c697ddb0dd309f61a9e3fecc700ac8c5d861b1fcd2c2
Status: Downloaded newer image for phpmyadmin/phpmyadmin:fpm-alpine
Creating phpmyadmin ... done
Attaching to phpmyadmin
phpmyadmin    | [30-Aug-2020 16:04:16] NOTICE: fpm is running, pid 1
phpmyadmin    | [30-Aug-2020 16:04:16] NOTICE: ready to handle connections

@pzystorm
Copy link

pzystorm commented Sep 1, 2020

Argh... the problematic line is:

    volumes:
      - ./phpmyadmin/:/var/www/html/

without that line, phpmyadmin is being extracted and inside /var/www/html/
So, it seems, the mount of that directory is later than the Dockerfile RUN scripts are executed and downloading and extracting phpmyadmin.
Is there any solution for that?

@williamdes
Copy link
Member

Maybe changing the nginx config block?
Why do you want to have a volume?

@pzystorm
Copy link

pzystorm commented Sep 2, 2020

Maybe changing the nginx config block?
Why do you want to have a volume?

a seperate nginx container and this phpmyadmin-fpm container need to share the document root with the phmyadmin contents, otherwise it will not work. fpm can only serve php files, so nginx need to handle css/js/html files (all other stuff)

@williamdes
Copy link
Member

I would suggest you to have a look to the configuration of @woosungchoi #299 (comment)

@pzystorm
Copy link

pzystorm commented Sep 2, 2020

it's the same. because of the volume (which is mounted when starting and not when building), the folder /var/www/html is empty at first startup

    volumes:
      - phpmyadmin:/var/www/html

The container itself is ok. So the only thing to do is to rerun the steps from the Dockerfile:
https://github.com/phpmyadmin/docker/blob/master/fpm-alpine/Dockerfile#L78-L101

@williamdes
Copy link
Member

I understand, you are talking about #284 (comment) on #285

@pzystorm
Copy link

pzystorm commented Oct 17, 2020

Please have a look f.ex. at the nextcloud project and get some ideas there.
They are doing all the magic inside the docker-entrypoint.sh file: First extracting the source files to /usr/src/nextcloud and then doing some rsync to /var/www/html
https://github.com/nextcloud/docker/blob/master/docker-entrypoint.sh

You could do the same.
There is no need to do all the magic inside the Dockerfile :)

@williamdes
Copy link
Member

Hi @pzystorm
Could you open a pull-request here so we can discuss and review the change you need please?

@osteel
Copy link

osteel commented Oct 23, 2020

@pzystorm do you also have an Nginx service in your docker-compose.yml file, that is using the same phpmyadmin volume?

If that is the case, it's possible that the Nginx container is the first to start, initialising the volume as an empty folder. If you make sure the phpMyAdmin container starts first with depends_on, that might fix your issue:

version: "3.7"

networks:
  pma_net:

services:

  nginx:
    ...
    volumes:
      - ./phpmyadmin/:...
    ...
    depends_on:
      - pma_php

  pma_php:
    image: phpmyadmin/phpmyadmin:fpm-alpine
    container_name: pma_php
    volumes:
      - ./phpmyadmin/:/var/www/html/
      - ./sessions/:/sessions/
    networks:
      - pma_net

@capitalfuse
Copy link

Working correctly phpmyadmin-fpm container with nginx container, if volumes sections of these are set to "phpmyadmin: /var/www/html" (NOT ./phpmyadmin: /var/www/html). But in advance, need to create the external volume by the following command: "$ docker volume create --name=phpmyadmin".

@SergeShkurko
Copy link

Site located at /* and phpmyadmin located at /phpmyadmin
phpMyAdmin location /var/www/html/ reqired
other site can be located at /var/www/site_name

I resolve problem with same configs:

version: '3.9'

volumes:
  phpmyadmin_data:

services:
  web:
    image: nginx:alpine
    container_name: 'hostinpl-web'
    ports:
      - '${HOST_MACHINE_UNSECURE_HOST_PORT}:80'
      - '${HOST_MACHINE_SECURE_HOST_PORT}:443'
    working_dir: /var/www/
    volumes:
      - phpmyadmin_data:/var/www/html/ # target pma location at html dir required!
      - ./:/var/www/panel/ # another site should be located in /var/www
      - ${PHP_STORAGE_DIR-./docker/data/php}:/var/www/storage
      - ./docker/config/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ${NGINX_CONFIG-./docker/config/nginx/default.conf}:/etc/nginx/conf.d/default.conf:ro
      - ${NGINX_LOG_DIR-./docker/logs/nginx}:/var/log/nginx/
    depends_on:
      - php
      - phpmyadmin
  php:
    build: 
      context: .
      dockerfile: ./docker/bin/php/Dockerfile # php:7.4.14-fpm
    container_name: 'hostinpl-php'
    working_dir: /var/www/panel/
    depends_on:
      - database
    volumes: 
      - ./:/var/www/panel/ # another site location
      - /var/www/panel/vendor/
      - ${PHP_STORAGE_DIR-./docker/data/php}:/var/www/storage
      - ${PHP_INI-./docker/config/php/php.ini}:/usr/local/etc/php/php.ini
      - ${PHP_LOG_DIR-./docker/logs/php}:/var/log/php
  database:
    image: mariadb:10.3
    command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8 --collation-server=utf8_general_ci
    container_name: 'hostinpl-database'
    ports:
      - '127.0.0.1:${HOST_MACHINE_MYSQL_PORT}:3306'
    volumes: 
      - ${MYSQL_DATA_DIR-./docker/data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./docker/logs/mysql}:/var/log/mysql
      - ${MYSQL_DUMP-./docker/dump.sql}:/docker-entrypoint-initdb.d/dump.sql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:fpm-alpine
    container_name: 'hostinpl-phpmyadmin'
    depends_on:
      - database
    environment:
      PMA_HOST: database
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    volumes: 
      - phpmyadmin_data:/var/www/html/ # target pma location at html dir required!
      - /sessions
      - ${PHP_INI-./docker/config/php/php.ini}:/usr/local/etc/php/conf.d/php-phpmyadmin.ini

default.conf

server {
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/;

    location ^~ /phpmyadmin/ {
        gzip_static on;
        alias /var/www/html/;
        index index.php;

        location ~ \.php$ {
            try_files $uri = 404;
            fastcgi_pass phpmyadmin:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

    location / {
        gzip_static on;
        root /var/www/panel/public/;
        index index.php;
	try_files $uri $uri/ /index.php$is_args$args; 

        location ~ \.php$ {
            fastcgi_pass php:9000;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

    location /storage {
        alias /var/www/storage/;
    }
}

@gitown
Copy link

gitown commented Sep 15, 2021

when I run my docker compose file I'm getting this weird rendering of phpmyadmin:fpm-alpine, I tried different web browsers and clearing the cache but the issue is the same:
image

Here is my docker-compose.yml:

version: "3.9"

services:
  aspnetcoreapp:
    container_name: aspnetcoreapp
    build:
      context: ./aspnetcoreapp
      dockerfile: Dockerfile
    expose:
      - "5080"
    restart: always
    depends_on:
      - mysql
    networks:
      - mynet

  nginx:
    container_name: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    volumes:
      - ./src:/var/www/php:ro
      - phpmyadmin_data:/var/www/html/:ro
    restart: always
    ports:
      - "60000:8282"
      - "60001:8383"
    depends_on:
      - aspnetcoreapp
      - phpmyadmin
      - mysql
    networks:
      - mynet

  mysql:
    container_name: mysql
    image: mysql:8.0.26
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootPass
      MYSQL_DATABASE: demoHello
    volumes:
      - sql_data:/var/lib/mysql
    ports:
      - 42333:3306
    networks:
      - mynet

  phpmyadmin:
    container_name: phpmyadmin
    image: phpmyadmin/phpmyadmin:fpm-alpine
    restart: always
    environment:
      PMA_USER: root
      PMA_PASSWORD: rootPass
      PMA_HOST: mysql
      MYSQL_ROOT_PASSWORD: rootPass
    expose:
      - "9000"
    depends_on:
      - mysql
    volumes:
      - phpmyadmin_data:/var/www/html/
    networks:
      - mynet

volumes:
  sql_data:
  phpmyadmin_data:

networks:
  mynet:
    driver: bridge

And my Nginx Dockerfile:

FROM nginx:1.21-alpine AS base

ENV TERM xterm
RUN apk update && apk add vim

WORKDIR /
COPY nginx.conf /etc/nginx/nginx.conf

And finally my nginx.conf:

worker_processes 5;

events { worker_connections 1024; }

http {
    sendfile on;

    upstream docker_aspnetcoreapp {
        server aspnetcoreapp:5080;
    }

    server {
        listen 8282;
        # server_name www.domain.com;
        location / {
            proxy_pass http://docker_aspnetcoreapp;
        }
    }

    resolver 127.0.0.11 valid=15s;
    
    server {
        listen 8383;
        #server_name williamdes.local default_server;
        root /var/www/html/;
        index index.php index.html index.htm;
        set $upstream phpmyadmin:9000;

        location ^~ /pma {
            rewrite /pma/(.*) /$1 last;
            try_files $uri = 404;
            fastcgi_pass $upstream;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }

        location ~ \.php$ {
            try_files $uri = 404;
            fastcgi_pass $upstream;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }
}

Any idea what's causing this issue?

@williamdes
Copy link
Member

Any idea what's causing this issue?

Since you are using the config I made, it should work. It could be the contents of the volume.
Could you check the contents of the volume ? js/dist folder should exist and each theme should have css files in the css folder

@gitown
Copy link

gitown commented Sep 18, 2021

Any idea what's causing this issue?

Since you are using the config I made, it should work. It could be the contents of the volume.
Could you check the contents of the volume ? js/dist folder should exist and each theme should have css files in the css folder

Hi William,
I found how to fix this, I just have to add this line to the http block in the nginx.conf file:
include /etc/nginx/mime.types;

@williamdes
Copy link
Member

Any idea what's causing this issue?

Since you are using the config I made, it should work. It could be the contents of the volume.
Could you check the contents of the volume ? js/dist folder should exist and each theme should have css files in the css folder

Hi William,
I found how to fix this, I just have to add this line to the http block in the nginx.conf file:
include /etc/nginx/mime.types;

Thank you so much for letting me know and anyone searching about this !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests