2014-11-21 8 views
13

Ich möchte eine vollständig dockered Drupal installieren. Mein erster Schritt besteht darin, Container mit Nginx und php5-fpm zu bekommen, die beide auf Debian basieren. Ich bin auf CoreOS Alpha-KanalDocker: Nginx und php5-fpm Docker sprechen nicht

Meine Dockerfiles sind die folgenden (mit Digital Ozean.):

Nginx:

FROM debian 
MAINTAINER fvhemert 
RUN apt-get update && apt-get install -y nginx && echo "\ndaemon off;" >> /etc/nginx/nginx.conf 
CMD ["nginx"] 
EXPOSE 80 

Dieser Behälter bauen und läuft gut. Ich sehe die Standard-Nginx-Seite auf meiner Server-IP.

Php5-fpm:

FROM debian 
MAINTAINER fvhemert 
RUN apt-get update && apt-get install -y \ 
      php5-fpm \ 
      && sed 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf 
CMD ["php5-fpm"] 
EXPOSE 9000 

Dieser Behälter baut auch ohne Probleme und es hält beim Start ausgeführt wird.

Ich starte die php5-fpm Behälter zuerst mit:

docker run -d --name php5-fpm freek/php5-fpm:1 

Ad dann fange ich Nginx ,, mit php5-fpm verbunden:

docker run -d -p 80:80 --link php5-fpm:phpserver --name nginx freek/nginx-php:1 

Die Verknüpfung zu funktionieren scheint, eine gibt es Eintrag in/etc/hosts mit dem Namen phpserver. Beide Docker laufen:

[email protected] ~ $ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES 
fd1a9ae0f1dd  freek/nginx-php:4 "nginx"    38 minutes ago  Up 38 minutes  0.0.0.0:80->80/tcp nginx 
3bd12b3761b9  freek/php5-fpm:2 "php5-fpm"   38 minutes ago  Up 38 minutes  9000/tcp    php5-fpm 

Ich habe einige der Konfigurationsdateien angepasst. Für die Nginx Container bearbeitet I/etc/nginx/sites-enabled/default und geändert:

server { 
     #listen 80; ## listen for ipv4; this line is default and implied 
     #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 

     root /usr/share/nginx/www; 
     index index.html index.htm index.php; 

(ich die index.php hinzugefügt)

Und weiter:

location ~ \.php$ { 
       fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     #  # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini 
     # 
     #  # With php5-cgi alone: 
       fastcgi_pass phpserver:9000; 
     #  # With php5-fpm: 
     #  fastcgi_pass unix:/var/run/php5-fpm.sock; 
       fastcgi_index index.php; 
       include fastcgi_params; 
     } 

In die php5-fpm docker I geändert /etc/php5/fpm/php.ini:

cgi.fix_pathinfo=0 

php5-fpm läuft:

[21-Nov-2014 06:15:29] NOTICE: fpm is running, pid 1 
[21-Nov-2014 06:15:29] NOTICE: ready to handle connections 

ich auch index.html index.php geändert, es sieht aus wie dieser (/usr/share/nginx/www/index.php):

<html> 
<head> 
<title>Welcome to nginx!</title> 
</head> 
<body bgcolor="white" text="black"> 
<center><h1>Welcome to nginx!</h1></center> 

<?php 
phpinfo(); 
?> 

</body> 
</html> 

ich den 9000-Port gescannt haben aus Das Nginx-Andockfenster erscheint geschlossen. Keine gutes Zeichen natürlich:

[email protected]:/# nmap -p 9000 phpserver 

Starting Nmap 6.00 (http://nmap.org) at 2014-11-21 06:49 UTC 
Nmap scan report for phpserver (172.17.0.94) 
Host is up (0.00022s latency). 
PORT  STATE SERVICE 
9000/tcp closed cslistener 
MAC Address: 02:42:AC:11:00:5E (Unknown) 

Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds 

Die Nginx-Protokolle:

[email protected]:/# vim /var/log/nginx/error.log 
2014/11/20 14:43:46 [error] 13#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 194.171.252.110, server: localhost, request: "GET/HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "128.199.60.95" 
2014/11/21 06:15:51 [error] 9#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 145.15.244.119, server: localhost, request: "GET/HTTP/1.0", upstream: "fastcgi://172.17.0.94:9000", host: "128.199.60.95" 

Ja, das geht schief und ich halte einen 502 falschen Gateway Fehler bekommen, wenn meine Nginx Instanz durchsuchen.

Meine Frage ist: Was genau schief geht? Meine Vermutung ist, dass mir einige Einstellungen in den PHP-Konfigurationsdateien fehlen.

EDIT FÜR WEITERE DETAILS: Dies ist das Ergebnis (aus dem Inneren des php5-fpm Behälter nach apt-get install net-tools):

[email protected]:/# netstat -tapen
Active Internet connections
(servers and established) Proto Recv-Q Send-Q Local Address
Foreign Address State User Inode PID/Program name

Aus dem Inneren des Nginx Behälter:

[email protected]:/# netstat -tapen
Active Internet connections
(servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:*
LISTEN 0 1875387 -

EDIT2: Progression!

Im php5-fpm Containern, in der Datei:

/etc/php5/fpm/pool.d/www.conf 

ich von einem Socket-Namen, um das hört Argument geändert:

listen = 9000 

Nun, wenn ich auf meine Webseite gehen bekomme ich das Fehler: "Keine Eingabedatei angegeben."

Wahrscheinlich habe ich irgendwo falsch/falsch. Ich werde genauer hinsehen!

EDIT3:

So habe ich die Docker mit den oben genannten Änderungen wieder aufzubauen und es scheint, dass sie reden. Allerdings sagt mir meine Webseite: "Datei nicht gefunden." Ich bin mir ziemlich sicher, dass es mit dem Dokument zu tun hat, dass nginx zu php-fpm sent, aber ich habe keine Ahnung, wie es aussehen soll. Ich benutzte die Standardeinstellungen, wenn ich die Socket-Methode verwendete, die immer funktionierte. Jetzt funktioniert es nicht mehr. Was sollte in/etc/nginx/sites-enabled/default unter location ~ .php $ {?

+0

Hat es für Sie funktioniert, den Volumenbehälter zu trennen? – bdart

Antwort

13

Der Grund, warum es nicht funktioniert, ist, wie Sie selbst festgestellt haben, dass Nginx nur den Pfad der PHP-Datei an PHP-FPM sendet, nicht die Datei selbst (was ziemlich ineffizient wäre). Die Lösung besteht darin, einen dritten VOLUME-Container (nur Daten) zum Hosten der Dateien zu verwenden und ihn dann auf beiden Docker-Instanzen bereitzustellen.

FROM debian 
VOLUME /var/www 
CMD ['true'] 

Erstellen Sie die oben Dockerfile und eine Instanz erstellen (nennen wir es zum Beispiel: storage-www), führen Sie dann sowohl die nginx und die PHP-FPM-Container mit der Option:

--volumes-from storage-www 

Das wird funktionieren, wenn Sie beide Container auf demselben physischen Server ausführen. Sie können jedoch immer noch andere Server verwenden, wenn Sie diesen Nur-Daten-Container auf ein Netzwerk-Dateisystem wie GlusterFS stellen, das sehr effizient ist und über ein großes Netzwerk verteilt werden kann.

Hoffe, dass hilft.

aktualisieren:

ab 2015 der beste Weg, persistente Verbindungen zwischen den Behältern zu machen, ist docker-compose zu verwenden.

+0

Der Nginx-Container sagt mir, dass '/ var/www' nicht zugänglich ist, muss ich etwas dafür bereitstellen? – bdart

+1

@bdart Sie müssen/var/www zu einem anderen Verzeichnis auf Ihrem Docker-Host zuordnen, wenn Sie Ihren '' 'Storage-www''' Container erstellen – niieani

+0

Ich habe es getan. Ich habe erkannt, dass meine nginx.conf/var/www auf ihrem eigenen Container statt dem/var/www verwendet, das über das Volume verbunden ist. Vielleicht ist mein 'root/var/www;' das Problem? – bdart

1

Wenn Sie in Ihrem Container als

root @ fd1a9ae0f1dd sind:/# , überprüfen Sie die verwendeten Ports mit

netstat -tapen | grep ": 9000"

oder

netstat -lntpu | grep „: 9000“

oder die gleichen Befehle ohne die grep

+0

Dies ist das Ergebnis (aus dem php5-fpm Container, nachdem apt-get isntall net-tools): (Sorry, warum ist das so schlecht formatiert und wie kann ich das ändern?) 'root @ 3bd12b3761b9:/# netstat -tapen Aktive Internetverbindungen (Server und eingerichtet) Proto Recv-Q Send-Q Lokale Adresse Fremdadresse Status Benutzer Inode PID/Programmname tcp 0 0 172.17.0.94:58181 46.4.205.44:80 TIME_WAIT 0 0 - tcp 0 0 172.17.0.94:44741 140.112.8.139:80 TIME_WAIT 0 0 -' – Freek

+0

Das sieht aus wie der Container mit dem 'EXPOSE 80' Befehl, nicht der Container mit dem' EXPOSE 9000' Können Sie die Ports auf beiden überprüfen Behälter? – user2915097

+0

Siehe den ursprünglichen Beitrag für weitere Details, danke! – Freek

2

So habe ich alle Einstellungen getestet und keiner arbeitete zwischen Docker, während sie mit den gleichen Einstellungen funktionieren auf 1 Server (oder auch in einem Docker wahrscheinlich). Dann habe ich herausgefunden, dass php-fpm keine php-Dateien von nginx nimmt, es empfängt den Pfad, wenn es nicht dieselbe Datei in seinem eigenen Container findet, erzeugt es eine "Datei nicht gefunden". Sehen Sie hier für weitere Informationen: https://code.google.com/p/sna/wiki/NginxWithPHPFPM So löst sich die Frage aber leider nicht das Problem. Das ist ziemlich nervig für Leute, die Load Balancing mit mehreren php-fpm Servern durchführen wollen, sie müssten alles rsync oder so ähnlich. Ich hoffe, dass ich eines Tages eine bessere Lösung finden werde. Danke für die Antworten.

EDIT: Vielleicht kann ich das gleiche Volumen in beiden Containern montieren und es auf diese Weise arbeiten. Das wird jedoch keine Lösung sein, wenn mehrere Server verwendet werden.

+0

Hast du jemals etwas gefunden, das funktioniert? – bdart

+0

Das Hinzufügen eines weiteren Containers zum Stack hat diese Lösung in den Bereich "zu kompliziert" für das gebracht, was ich will und ich habe gerade begonnen, volle Server (digitale Ozeantröpfchen) zu benutzen. Ich wollte viele Drupal-Server betreiben, und ich fand, dass Drush auch all meine Anforderungen an die automatisierte Einrichtung erfüllt. – Freek

Verwandte Themen