Docker: les dockers Nginx et php5-fpm ne parlent pas
J'aimerais prendre une dockerized Drupal installer. Ma première étape est d'obtenir des récipients en cours d'exécution avec Nginx et php5-fpm, à la fois basées sur Debian. Je suis sur CoreOS canal alpha (à l'aide de Digital Ocean.)
Mon Dockerfiles sont les suivantes:
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
Ce conteneur construire et fonctionne bien. Je vois la valeur par défaut de Nginx page sur mon serveur 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
Ce conteneur construit aussi avec pas de problèmes et qu'il continue de fonctionner lorsqu'il est démarré.
Je commence le php5-fpm conteneur d'abord avec:
docker run -d --name php5-fpm freek/php5-fpm:1
Ad puis j'ai commencer à Nginx, lié à php5-fpm:
docker run -d -p 80:80 --link php5-fpm:phpserver --name nginx freek/nginx-php:1
Le lien semble fonctionner, il y a une entrée dans /etc/hosts avec le nom phpserver. Les deux dockers exécuter:
core@dockertest ~ $ 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
J'ai ajusté certains des fichiers de configuration. Pour la Nginx conteneur j'ai édité le fichier /etc/nginx/sites-enabled/default et a changé:
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;
(J'ai ajouté le index.php)
Et plus loin:
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;
}
Dans le php5-fpm docker j'ai modifié /etc/php5/fpm/php.ini:
cgi.fix_pathinfo=0
php5-fpm pistes:
[21-Nov-2014 06:15:29] NOTICE: fpm is running, pid 1
[21-Nov-2014 06:15:29] NOTICE: ready to handle connections
J'ai aussi changé index.html pour index.php il ressemble à ceci (/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>
J'ai scanné les 9000 port de la Nginx docker, il apparaît comme fermé. Pas bon signe, bien sûr:
root@fd1a9ae0f1dd:/# 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
Les logs Nginx:
root@fd1a9ae0f1dd:/# 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"
Oui, que se passe mal et je reçois une erreur 502 bad gateway lors de la navigation de mon Nginx instance.
Ma question est: qu'est-Ce qui va mal? Ma conjecture est que je suis pas certains paramètre dans la config php les fichiers.
MODIFIER POUR PLUS DE DÉTAILS:
C'est le résultat (de l'intérieur du php5-fpm conteneur, après apt-get install net-tools):
root@3bd12b3761b9:/# netstat -tapen
Active les connexions Internet
(serveurs et établies) Proto Recv-Q Send-Q Adresse Locale
Adresse à l'étranger de l'État de l'Utilisateur de l'Inode PID/Program name
De l'intérieur de la Nginx conteneur:
root@fd1a9ae0f1dd:/# netstat -tapen
Active les connexions Internet
(serveurs et établies) Proto Recv-Q Send-Q Adresse Locale Adresse à l'Étranger de l'État de l'Utilisateur de l'Inode PID/Program
name tcp 0 0 0.0.0.0:80 0.0.0.0:*
ÉCOUTEZ 0 1875387 -
EDIT2:
La Progression!
Dans le php5-fpm conteneur, dans le fichier:
/etc/php5/fpm/pool.d/www.conf
J'ai changé l'écouter argument de certains socket nom:
listen = 9000
Maintenant quand je vais sur ma page j'obtiens l'erreur:
"No input file specified."
J'ai probablement de fuite /de mal quelque part. Je vais regarder de plus près!
EDIT3:
J'ai donc reconstruire les dockers-dessus des altérations et il semble qu'ils sont en train de parler. Cependant, ma page me dit: "fichier introuvable".
Je suis sûr que cela a à faire avec le document que nginx est envoyé à php-fpm, mais je n'ai aucune idée de comment il devrait ressembler. J'ai utilisé les valeurs par défaut lors de l'utilisation de la méthode de prise de, qui a toujours travaillé. Maintenant il ne fonctionne plus. Ce qui devrait être dans /etc/nginx/sites-enabled/default sous emplacement ~ .php$ { ?
source d'informationauteur Freek
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle cela ne fonctionne pas est, comme vous l'avez découvert vous-même, que nginx envoie uniquement le chemin d'accès du fichier PHP pour PHP-FPM, pas le fichier lui-même (ce qui serait tout à fait inefficace). La solution est d'utiliser un tiers, de données uniquement le VOLUME du conteneur pour héberger les fichiers, puis montez sur les deux docker instances.
Construire au-dessus de la Dockerfile et de créer une instance (que l'on appellera par exemple: stockage-www), puis exécutez la nginx et PHP-FPM conteneurs avec l'option:
Que de travailler si vous exécutez les deux conteneurs sur le même serveur physique.
Mais vous avez encore peut utiliser différents serveurs, si vous mettez des données-seulement un conteneur sur un réseau de système de fichiers, tels que GlusterFS, qui est très efficace et peut être distribué sur un réseau à grande échelle.
Espère que ça aide.
Mise à jour:
À partir de 2015, la meilleure façon de rendre persistantes les liens entre les conteneurs est d'utiliser docker-composer.
Donc, j'ai testé tous les réglages et aucune n'a fonctionné entre les dockers alors qu'ils ont fait de travailler avec les mêmes paramètres sur 1 serveur (ou également dans un docker sans doute). Puis j'ai découvert que php-fpm n'est pas en prenant les fichiers php de nginx, il reçoit le chemin, s'il ne peut trouver le même fichier dans son propre conteneur, il génère un "fichier non trouvé". Voir ici pour plus d'informations: https://code.google.com/p/sna/wiki/NginxWithPHPFPM de Sorte que résout la question, mais pas le problème, malheureusement. Ce qui est assez ennuyeux pour les gens qui veulent faire de l'équilibrage de charge avec plusieurs php-fpm serveurs, ils auraient à rsync tout ou quelque chose comme ça. J'espère qu'un jour je vais trouver une meilleure solution. Merci pour les réponses.
EDIT: peut-être que je peux monter le même volume dans les deux récipients et le faire fonctionner de cette façon. Ce ne sera pas une solution lors de l'utilisation de plusieurs serveurs.
Lorsque vous êtes dans votre conteneur
root@fd1a9ae0f1dd:/#
vérifiez les ports utilisés avec
netstat -tapen | grep ":9000 "
ou
netstat -lntpu | grep ":9000 "
ou les mêmes commandes sans le grep