it-swarm.com.de

Docker-Compose-Nginx-PHP-fpm-Datei nicht gefunden

Ich habe eine einfache Docker-Compose-Konfiguration mit PHP-Fpm und Nginx, und ich kann keine PHP-Datei sehen. Wenn ich zu localhost gehe, wird File Not Found angezeigt.

Ich habe alles versucht, was ich im Internet finden konnte, aber alles, was ich versucht habe, ist fehlgeschlagen. Es funktioniert gut für HTML, aber nicht für PHP-Dateien. Scheint ein Pfadproblem zu sein oder so ähnlich.

Ich stoße auf diesen Fehler, wenn ich 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"

Hier ist mein 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"

Dann meine Andockdatei für PHP:

FROM php:5.6-fpm
EXPOSE 9000

meine default.conf für 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 des Hauptordners ist:

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

Die Dateihierarchie lautet:

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

Der gesamte Ordner ist chmod 777

Jede Idee wäre sehr dankbar. Ich bin mir sicher, dass es etwas gibt, was ich nicht verstanden habe. Danke im Voraus.

9
mik

So finden Sie das Problem

  1. Schalten Sie den Nginx-Debug-Modus mit benutzerdefinierten commandein, z.

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. Bearbeiten Sie Ihre "site.conf" -Datei (in diesem Beispiel ist es die ~/www/project/vhost.conf-Datei). Schalten Sie den Debug-Modus über den error_log ein (fügen Sie am Ende "debug" -Wort hinzu):
error_log "/var/log/nginx/error.log" debug;
  1. Starten Sie den "Web" -Container erneut:
docker-compose stop web
docker-compose up -d web
  1. Testen Sie die Container, laufen alle Container?
docker-compose ps
  1. Testen Sie im Browser
  2. "Verbinden" und Anzeigen oder Herunterladen ( http://blog.dcycle.com/blog/ae67284c/docker-compose-cp ) und Anzeigen der /var/log/nginx/error.log-Datei.

Das Problem in den meisten Fällen

Sie haben noch keine Einstellungen vorgenommen oder verwenden eine andere Verzeichnisstruktur in "web" und "php-fpm". Wenn Sie eine andere Struktur verwenden möchten, müssen Sie die "fpm-Struktur" an der Stelle fastcgi_param SCRIPT_FILENAME wie folgt festlegen:

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

Endlich gefunden:

Ich habe diese Zeile in der Ausgabe von PHP von docker-compose vermisst:

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

so sollte der Docker-Compose aussehen:

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"

Die absolute Wurzel (hier "/ usr/share/nginx/html") in der Datei nginx default.conf musste auch im PHP-Teil von docker-compose gesetzt werden (war vorher nur unter nginx)

Das ist eine Erleichterung ;)

3
mik

In meinem Fall verweisen die Volumes: von PHP und Nginx auf das richtige (und damit das gleiche) Verzeichnis. Aber in meiner Nginx-Konfiguration gab es einen NGINX_SERVER_ROOT: Der falsche Weg. 

Stellen Sie daher sicher, dass Sie alle Volumes und Einstellungen des Stammverzeichnisses noch einmal überprüfen. Einige sind leicht zu übersehen.

0
firfin

Ich hatte das gleiche Problem, aber diese Antwort wurde hier nicht gelöst:

Gestern Ein Docker Update trifft in - das installiert wurde. Das Problem, das von diesem Update abhängt, ist, dass das (vEthernet (DockerNAT)) Network geändert wurde. Auf diese Weise setzt meine Firewall (in meinem Fall Kaspersky) meine Netzwerk-Firewall auf "öffentlich" statt auf "vertrauenswürdig" zurück. 

Ich habe dies durch Öffnen von " Docker -> Einstellungen -> Shared Devices " herausgefunden. Auf den ersten Blick scheint alles in Ordnung zu sein. Es gab ein "Häkchen" auf jedem Gerät, das ich teilen muss. Als Nächstes versuchte ich, meine freigegebenen Geräte erneut zu deaktivieren und zu aktivieren. Aktivieren Sie mein freigegebenes Gerät erneut mit dem Standardfehler "Eine Firewall blockiert die gemeinsame Nutzung von Dateien zwischen Windows und den Containern. Weitere Informationen finden Sie in der Dokumentation." ergab sich. -> PERFEKT !! . Das freigegebene Gerät kann nicht mehr auf die Dateien zugreifen, Docker bleibt jedoch in dem Zustand, in dem alles in Ordnung ist.

So konnte ich es beheben durch:

  • Stellen Sie (vEthernet (DockerNAT)) Network wieder als vertrauenswürdig in den Einstellungen von Kaspersky "Firewall - Network" ein.
  • Ich habe meinen Docker-Container mit docker-compose up neu gestartet und läuft wie ein Zauber. Auf meine Dateien konnte erneut zugegriffen werden. 
0
lin