Estoy intentando que nginx-proxy funcione con php-fpm variante de la imagen oficial de php a través de fastcgi. Desafortunadamente, parece que no puedo hacerlo. Estoy seguro de que el problema es algo simple que no sé.

He seguido las instrucciones para nginx-proxy lo mejor que he podido y lo he reducido a una forma muy simple de recrear el problema. Aquí está mi archivo docker-compose.yml:

version: "3"

services:
  proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - DEFAULT_HOST=test.local

  fpm:
    image: php:fpm
    environment:
      - VIRTUAL_HOST=test.local
      - VIRTUAL_PROTO=fastcgi

Luego dejo caer un simple archivo index.php ejecutando:

docker container exec -it web_fpm_1 /bin/bash -c 'echo "<?php phpinfo(); ?>" > /var/www/html/index.php'

(Pone web_ al frente porque este proyecto está en un directorio llamado web/).

También modifico mi archivo hosts para apuntar test.local a 127.0.0.1, para poder probarlo. Sin embargo, cada intento de buscar test.local da como resultado una página en blanco.

Los registros para el contenedor web_proxy_1 no indican nada fuera de lo común, que yo sepa:

❯ docker container logs web_proxy_1
WARNING: /etc/nginx/dhparam/dhparam.pem was not found. A pre-generated dhparam.pem will be used for now while a new one
is being generated in the background.  Once the new dhparam.pem is in place, nginx will be reloaded.
forego     | starting dockergen.1 on port 5000
forego     | starting nginx.1 on port 5100
dockergen.1 | 2020/07/20 19:24:54 Generated '/etc/nginx/conf.d/default.conf' from 2 containers
dockergen.1 | 2020/07/20 19:24:54 Watching docker events
dockergen.1 | 2020/07/20 19:24:54 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload'
nginx.1    | test.local 172.18.0.1 - - [20/Jul/2020:19:25:12 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
nginx.1    | test.local 172.18.0.1 - - [20/Jul/2020:19:25:13 +0000] "GET /favicon.ico HTTP/1.1" 200 5 "http://test.local/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"

Los registros del contenedor web_fpm_1 muestran que no se envía nada excepto una respuesta 200:

❯ docker container logs web_fpm_1
[20-Jul-2020 19:24:54] NOTICE: fpm is running, pid 1
[20-Jul-2020 19:24:54] NOTICE: ready to handle connections
172.18.0.3 -  20/Jul/2020:19:25:12 +0000 "- " 200
172.18.0.3 -  20/Jul/2020:19:25:13 +0000 "- " 200

¿Qué estoy haciendo mal?

Por cierto, he hecho esta pregunta en el nginx-proxy repo, el nginx-proxy Google Group, y el php repo. No recibo respuesta o pasan la pelota.

8
Sturm 15 jul. 2020 a las 20:26

2 respuestas

La mejor respuesta

La configuración generada por defecto de nginx-proxy no funciona completamente.

Creo que algo está mal con la VIRTUAL_ROOT variable de entorno, porque la raíz del problema es que PHP obtiene una ruta incorrecta a través de SCRIPT_FILENAME (es por eso que no ve salida de PHP) y no hay try_files con el símbolo =404 (eso es por qué obtienes 200 con todo).

Tengo una configuración de trabajo preparada usando docker-compose en GitHub para demostrar que funcionaría con un SCRIPT_FILENAME existente en la configuración de nginx.

https://github.com/flowl/so6292053

He cambiado test.local a test.localhost.

Creo que para que funcione como debería, tendrías que usar una plantilla nginx para nginx-proxy, por lo que el default.conf generado funciona con php fpm y tiene incluido el parámetro fastcgi faltante.

Otro enfoque, aunque diferente, sería empaquetar PHP y un servidor web configurado manualmente (nginx) en un proyecto y tener el proxy nginx inverso automático en un proyecto independiente. Esto le costaría un proceso adicional en ejecución, pero le brinda más control y una implementación más sencilla.

Alternativamente, es posible que desee echar un vistazo a traefik, que hace esencialmente lo mismo que nginx-proxy.

2
Daniel W. 27 jul. 2020 a las 21:53

La respuesta de Daniel definitivamente está en el camino correcto. Utilizo la imagen php-fpm con nginx como mi pila principal para sitios php. Dicho esto, no uso la imagen acoplable nginx-proxy. En su lugar, uso nginx simple en la máquina host y configuro puertos para apuntar a backend php-fpm docker.

Tampoco estoy usando docker-compose. Como solo se trata de contenedores acoplables que ejecutan sitios únicos, no lo necesito. Aquí hay un ejemplo de comando docker run:

docker rm -f www.example.com || true
docker run -itd -p 9001:9000 -P \
        --name www.example.com \
        --volume /var/www/html/www.example.com:/var/www/html/www.example.com \
        --link mariadb:database.example.com \
        --restart="always" \
        --hostname="example.com" \
    --log-opt max-size=2m \
    --log-opt max-file=5 \
        mck7/php-fpm:7.4.x-wordpress

Y aquí hay un ejemplo de configuración nginx:

server {
  server_name example.com www.example.com;

  location ~ /.well-known {
    allow all;
  }

  location ~ /\.ht {
    deny all;
  }

  root /var/www/html/www.example.com/src;

  index index.php;

  location / {
    try_files $uri $uri/ /index.php?$args;
  }

  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
      return 404;
    }

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO       $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

    fastcgi_pass   127.0.0.1:9001;
    fastcgi_index  index.php;
  }
}

Algunas cosas sobre esta configuración son clave. El mapeo de puertos para el contenedor docker. En este ejemplo, asigno el puerto 9001 al 9000. El otro "problema" es que la raíz del contenedor debe ser una ubicación real en el host. No tengo idea de por qué este es el caso, pero por cualquier razón, el acoplador de ruta cree que está usando tiene que ser también la ruta en el host.

1
Dharman 21 jul. 2020 a las 13:14