nginx et php-fpm dans Docker

Je suis en train de désamorcer mon stream de travail serveur web / php.

Mais comme je suis sous Windows, je dois utiliser une machine virtuelle. J’ai choisi boot2docker qui est un Tiny Core Linux exécuté dans Virtualbox et adapté pour Docker.

J’ai sélectionné trois conteneurs:

  • nginx : le conteneur officiel nginx;
  • jprjr / php-fpm : un conteneur php-fpm;
  • mysql : pour les bases de données.

Dans boot2docker, /www/ contient mes projets web et conf/ , qui a l’arborescence suivante:

 conf │ ├───fig │ fig.yml │ └───nginx nginx.conf servers-global.conf servers.conf 

Comme docker-compose n’est pas disponible pour boot2docker, je dois utiliser fig pour tout automatiser. Voici mon fig.xml :

 mysql: image: mysql environment: - MYSQL_ROOT_PASSWORD=root ports: - 3306:3306 php: image: jprjr/php-fpm links: - mysql:mysql volumes: - /www:/srv/http:ro ports: - 9000:9000 nginx: image: nginx links: - php:php volumes: - /www:/www:ro ports: - 80:80 command: nginx -c /www/conf/nginx/nginx.conf 

Voici mon nginx.conf :

 daemon off; user nginx; worker_processes 1; error_log /var/log/nginx/error.log debug; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile off; keepalive_timeout 65; index index.php index.html index.htm; include /www/conf/nginx/servers.conf; autoindex on; } 

Et les servers.conf :

 server { server_name lab.dev; root /www/lab/; include /www/conf/nginx/servers-global.conf; } # Some other servers (vhosts) 

Et le servers-global.conf :

 listen 80; location ~* \.php$ { fastcgi_index index.php; fastcgi_pass php:9000; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name; } 

Donc, le problème maintenant (désolé pour toute cette configuration, je crois qu’il était nécessaire d’expliquer clairement le problème): Si lab.dev à lab.dev , pas de problème (ce qui montre que l’hôte est créé sous Windows) mais si j’essaie d’accéder à lab.dev/test_autoload/ , j’ai un File not found. . Je sais que cela vient de ce que php-fpm ne peut pas accéder aux fichiers et que les journaux nginx le confirment:

 nginx_1 | 2015/05/28 14:56:02 [error] 5#5: *3 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 192.168.59.3, server: lab.dev, request: "GET /test_autoload/ HTTP/1.1", upstream: "fastcgi://172.17.0.120:9000", host: "lab.dev", referrer: "http://lab.dev/" 

Je sais qu’il y a un index.php dans lab/test_autoload/ dans les deux conteneurs, j’ai vérifié. Dans nginx , il se trouve dans /www/lab/test_autoload/index.php et /srv/http/lab/test_autoload/index.php dans php .

Je crois que le problème vient de root et / ou fastcgi_param SCRIPT_FILENAME , mais je ne sais pas comment le résoudre.

J’ai essayé beaucoup de choses, telles que la modification de la root s, en utilisant une règle de rewrite , en ajoutant / supprimant certains / s, etc., mais rien n’a changé.

Encore une fois, désolé pour toute cette configuration, mais je pense qu’il était nécessaire de décrire l’environnement dans lequel je me trouve.

    J’ai finalement trouvé la réponse.

    La variable $fastcgi_script_name n’a pas pris en compte la racine (logique, car elle aurait inclus www/ autrement. Cela signifie qu’un fichier global ne peut pas fonctionner. Un exemple:

     # "generated" vhost server { server_name lab.dev; root /www/lab/; listen 80; location ~* \.php$ { fastcgi_index index.php; fastcgi_pass php:9000; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name; # I need to add /lab after /srv/http because it requests PHP to look at the root of the web files, not in the lab/ folder # fastcgi_param SCRIPT_FILENAME /srv/http/lab$fastcgi_script_name; } } 

    Cela signifiait que je ne pouvais pas écrire au lab/ à un seul endroit, j’avais besoin d’écrire à deux endroits différents (root et fastcgi_param), alors j’ai décidé d’écrire un petit script PHP qui utilisait un .json et le transformait en servers.conf Fichier servers.conf . Si quelqu’un veut y jeter un coup d’œil, demandez-le, ce sera un plaisir de le partager.

    Il y a une erreur ici:

     fastcgi_param SCRIPT_FILENAME /srv/http/$fastcgi_script_name; 

    La bonne ligne est:

     fastcgi_param SCRIPT_FILENAME /srv/http$fastcgi_script_name; 

    Ce n’est pas la même chose.

    Votre nginx.conf est complètement vide, où est le démon désactivé; l’utilisateur nginx line, worker_processes, etc. nginx a besoin d’un fichier de configuration avant d’exécuter http.

    Dans http conf, la même chose, il manque les types mime, default_type, la configuration des journaux sendfile at on pour boot2docker.

    Votre problème n’est clairement pas un problème avec Docker, mais avec la configuration nginx. Avez-vous testé votre application avec Docker en cours d’exécution avant d’utiliser fig? A fonctionné?