Instalé Docker en una instancia AWS EC2 e implementé contenedores Nginx y PHP-FPM.
[ec2-user@ip-172-31-80-56 ~]$ sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
e8cb988f47ff jeremycanfield/php:latest "docker-php-entrypoi…" 12 days ago Up 12
days 0.0.0.0:9000->9000/tcp php
8ac5a82f84f2 jeremycanfield/nginx:latest "/docker-entrypoint.…" 2 weeks ago Up 2
weeks 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:18080-18085->18080-18085/tcp nginx
Enhttp://ec2-23-22-195-223.compute-1.amazonaws.com/index.html, Se muestra "Bienvenido a Nginx". Cuando voy ahttp://ec2-23-22-195-223.compute-1.amazonaws.com/index.php, index.php se descarga en lugar de mostrarse en el navegador web y el navegador muestra502 Puerta de enlace no válida.
/etc/nginx/conf.d/default.conf en el contenedor Nginx tiene fastcgi_pass 172.31.29.217:9000
.
server {
server_name localhost;
index index.php;
listen 80;
root /var/www/www;
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 172.31.29.217:9000;
include fastcgi_params;
}
}
172.31.29.217 es la dirección IP vinculada a la interfaz eth0 de la instancia EC2.
[ec2-user@ip-172-31-29-217 ~]$ ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default
qlen 1000
link/ether 0a:4a:bb:2e:e2:41 brd ff:ff:ff:ff:ff:ff
inet 172.31.29.217/20 brd 172.31.31.255 scope global dynamic eth0
valid_lft 3207sec preferred_lft 3207sec
inet6 fe80::84a:bbff:fe2e:e241/64 scope link
valid_lft forever preferred_lft forever
El contenedor PHP-FPM escucha en el puerto 9000.
[ec2-user@ip-172-31-29-217 ~]$ sudo docker exec php grep ^listen /usr/local/etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000
Reinicio el contenedor PHP y verifico que esté funcionando.
[ec2-user@ip-172-31-29-217 ~]$ sudo docker restart php
[ec2-user@ip-172-31-29-217 ~]$ sudo docker logs php
[09-Dec-2022 22:08:10] NOTICE: fpm is running, pid 1
[09-Dec-2022 22:08:10] NOTICE: ready to handle connections
Usando OpenSSL, puedo establecer una conexión desde el contenedor Nginx al contenedor PHP-FPM usando 172.31.29.217:9000.
[ec2-user@ip-172-31-29-217 ~]$ sudo docker exec nginx openssl s_client -connect 172.31.29.217:9000
write:errno=0
CONNECTED(00000003)
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 283 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
O usando curl desde el contenedor Nginx, puedo conectarme a 172.31.29.217:9000.
[ec2-user@ip-172-31-29-217 ~]$ sudo docker exec nginx curl --silent 172.31.29.217:9000 -v
* Trying 172.31.29.217:9000...
* Connected to 172.31.29.217 (172.31.29.217) port 9000 (#0)
> GET / HTTP/1.1
> Host: 172.31.29.217:9000
> User-Agent: curl/7.74.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host 172.31.29.217 left intact
Cuando voy ahttp://ec2-23-22-195-223.compute-1.amazonaws.com/index.php, no aparece ningún evento en los registros del contenedor php, casi como si sugiriera que la solicitud de index.php no se reenvía desde el contenedor Nginx al contenedor PHP.
[ec2-user@ip-172-31-29-217 ~]$ sudo docker logs php --tail=2
[09-Dec-2022 22:08:10] NOTICE: fpm is running, pid 1
[09-Dec-2022 22:08:10] NOTICE: ready to handle connections
También cabe destacar que cuando configuro un servidor Docker similar en mi laboratorio en casa, no tengo este problema. La página index.php se carga perfectamente en mi laboratorio en casa.
No estoy seguro de cuál será mi próximo paso.
Respuesta1
Su contenedor PHP-FPM
Docker php
está configurado para escuchar, 127.0.0.1
por lo que no podrá responder a solicitudes externas fuera de su contenedor. O tiene otro archivo de configuración además /usr/local/etc/php-fpm.d/www.conf
del php
contenedor o algún otro programa está escuchando el puerto 9000
en el sistema (por ejemplo, php-fpm
instalado en el propio sistema host). Puedes comprobar el puerto de escucha 9000
con ss -nlp |grep :9000
. También verifique las asignaciones de puertos de la ventana acoplable.
Además, openssl
las curl
conexiones al puerto 9000
son irrelevantes. El puerto 9000
utiliza FastCGI
protocolo, no TLS
o HTTP
. Para probar FastCGI
la conexión puedes usarcgi-fcgi
dominio.