web-dev-qa-db-fra.com

Docker-compose Nginx fichier php-fpm introuvable

J'ai une simple config docker-compose avec php-fpm et nginx, et je ne vois aucun fichier php. Quand je vais à localhost, il affiche le fichier non trouvé.

J'ai essayé tout ce que je pouvais trouver sur le net, mais tout ce que j'ai essayé a échoué. Cela fonctionne très bien pour le HTML, mais pas pour les fichiers php. Semble être un problème de chemin, ou quelque chose comme ça.

Je tombe sur cette erreur quand je docker-compose logs:

project3-php_1     | 172.17.0.5 -  29/Mar/2016:13:29:12 +0000 "GET /index.php" 404
project3-front_1   | 172.17.0.1 - - [29/Mar/2016:13:29:12 +0000] "GET / HTTP/1.1" 404 27 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"
project3-front_1   | 2016/03/29 13:29:12 [error] 8#8: *3 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.17.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://172.17.0.2:9000", Host: "localhost"

Voici mon docker-compose:

project3-front:
    image: nginx
    ports:
      - "80:80"
    links:
      - "project3-php:project3-php"
    volumes:
      - ".:/home/docker"
      - "./nginxdir/default.conf:/etc/nginx/conf.d/default.conf"
      - "./html:/usr/share/nginx/html"

  project3-php:
      build: phpdir
      volumes:
        - ".:/home/docker:rw"
        - "./html:/var/www/html"
      ports:
        - "9000:9000"
      working_dir: "/home/docker"

Ensuite, mon fichier docker pour php:

FROM php:5.6-fpm
EXPOSE 9000

mon default.conf pour nginx:

server {
  listen 80;
  server_name localhost;
  index index.php index.html;

  error_log  /var/log/nginx/error.log  warn;
  access_log /var/log/nginx/access.log;
  root /usr/share/nginx/html;

  location ~ \.php$ {
      fastcgi_pass project3-php:9000;
      fastcgi_index index.php;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

pwd du dossier principal est:

/media/revenge/share/PROJECTS/docker_images/php7-nginx

La hiérarchie des fichiers est la suivante:

├── docker-compose.yml
├── html
│   ├── index.php
├── nginxdir
│   ├── default.conf
├── phpdir
│   ├── dockerfile
│   └── php.ini

Le dossier entier est chmod 777

Toute idée serait grandement appréciée. Je suis sûr qu'il y a quelque chose que je n'ai pas eu. Merci d'avance.

9
mik

Voici comment pouvez-vous trouver le problème

  1. Activez le mode de débogage nginx avec command personnalisé, par exemple:

docker-compose.yml

web:
    image: nginx
    volumes:
        - "~/www/project:/var/www"
        - "~/www/project/vhost.conf:/etc/nginx/conf.d/site.conf"
    # Add this row:
    command: [nginx-debug, '-g', 'daemon off;']
  1. Editez votre fichier "site.conf" (dans cet exemple, c'est le fichier ~/www/project/vhost.conf) Activez le mode débogage avec le error_log (ajoutez le mot "debug" à la fin):
error_log "/var/log/nginx/error.log" debug;
  1. (Re) démarrez le conteneur "web":
docker-compose stop web
docker-compose up -d web
  1. Testez les conteneurs, tous les conteneurs fonctionnent-ils?
docker-compose ps
  1. Test en navigateur
  2. "Connecter" et visualiser ou télécharger ( http://blog.dcycle.com/blog/ae67284c/docker-compose-cp ) et afficher le fichier /var/log/nginx/error.log.

Le problème dans la plupart des cas

Vous n'avez pas encore défini ou vous utilisez une structure de répertoires différente dans "web" et "php-fpm". Si vous souhaitez utiliser une structure différente de celle que vous avez définie, définissez la "structure fpm" à l'emplacement fastcgi_param SCRIPT_FILENAME, comme suit:

docker-compose.yml

phpfpm:
    image: php:fpm
    volumes:
        - "~/www/project:/var/www/html/user/project"

"site.conf"

fastcgi_param SCRIPT_FILENAME /var/www/html/user/project$fastcgi_script_name;
6
Krisztián Ferenczi

Enfin trouvé le:

Il me manquait cette ligne dans le volume de la section PHP de docker-compose:

"./html:/usr/share/nginx/html"

voici à quoi devrait ressembler le docker-compose:

project3-front:
    image: nginx
    ports:
        - "80:80"
    links:
        - "project3-php:project3-php"
    volumes:
        - ".:/home/docker"
        - "./nginxdir/default.conf:/etc/nginx/conf.d/default.conf"
        - "./html:/usr/share/nginx/html"
project3-php:
    build: phpdir
    volumes:
        - ".:/home/docker:rw"
        - "./html:/var/www/html"
    ports:
        - "9000:9000"
    working_dir: "/home/docker"

La racine absolue (ici "/ usr/share/nginx/html") du fichier nginx default.conf devait également être définie dans la partie php de docker-compose (elle était sous nginx auparavant)

C'est un soulagement ;)

3
mik

Dans mon cas, les volumes: de php et nginx pointaient dans le bon répertoire (et donc le même). Mais dans ma configuration nginx, il y avait un NGINX_SERVER_ROOT: indiquant le mauvais sens. 

Veillez donc à bien vérifier tous les volumes et les paramètres du répertoire racine. Certains sont faciles à négliger.

0
firfin

J'ai eu le même problème mais cela n'a pas été résolu par aucune de ces réponses ici:

Hier un résultat de Docker Update in - qui a été installé. Le problème en fonction de cette mise à jour est que le réseau (vEthernet (DockerNAT))} _ a été modifié. De cette façon, mon pare-feu (dans mon cas, Kaspersky) a réinitialisé mon pare-feu de réseau sur "public" au lieu de "fiable". 

J'ai compris cela en ouvrant " Docker -> Paramètres -> Périphériques partagés ". Au premier regard, tout semble aller bien. Il y avait une "coche" sur chaque appareil que je devais partager. Ensuite, j'ai essayé de désactiver et d'activer à nouveau mes périphériques partagés. En activant à nouveau mon périphérique partagé, l'erreur par défaut "Un pare-feu bloque le partage de fichiers entre Windows et les conteneurs. Voir la documentation pour plus d'informations." est venu. -> PARFAIT !! . Le périphérique partagé ne peut plus accéder aux fichiers, mais Docker persiste dans l'état où tout va bien.

Je pourrais donc le réparer en:

  • Définissez le réseau (vEthernet (DockerNAT))} comme approuvé de nouveau dans les paramètres "Pare-feu - Réseau" de Kaspersky.
  • Redémarrez mon conteneur Docker en utilisant docker-compose up et tout se passe comme un charme. Mes fichiers pourraient être consultés à nouveau. 
0
lin