Я установил Docker на экземпляре AWS EC2 и развернул контейнеры Nginx и 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
Вhttp://ec2-23-22-195-223.compute-1.amazonaws.com/index.html, отображается "Добро пожаловать в Nginx". Когда я захожу вhttp://ec2-23-22-195-223.compute-1.amazonaws.com/index.php, index.php загружается вместо того, чтобы отображаться в веб-браузере, и браузер отображает502 Неверный шлюз.
/etc/nginx/conf.d/default.conf в контейнере Nginx имеет 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 — это IP-адрес, привязанный к интерфейсу eth0 экземпляра 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
Контейнер PHP-FPM прослушивает порт 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
Я перезапускаю PHP-контейнер и проверяю, что он запущен и работает.
[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
Используя OpenSSL, я могу установить соединение из контейнера Nginx к контейнеру PHP-FPM, используя 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)
---
Или, используя curl из контейнера Nginx, я могу подключиться к 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
Когда я иду вhttp://ec2-23-22-195-223.compute-1.amazonaws.com/index.php, в журналах контейнера php не появляется никаких событий, как будто это говорит о том, что запрос на index.php не пересылается из контейнера Nginx в контейнер 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
Также стоит отметить, что когда я настраиваю аналогичный сервер Docker в своей домашней лаборатории, у меня этой проблемы нет. Страница index.php отлично загружается в моей домашней лаборатории.
Я не уверен, каков мой следующий шаг.
решение1
Ваш контейнер PHP-FPM
в php
docker настроен на прослушивание, 127.0.0.1
поэтому он не сможет отвечать на внешние запросы за пределами своего контейнера. Либо у вас есть другой файл конфигурации, кроме контейнера /usr/local/etc/php-fpm.d/www.conf
в php
контейнере, либо какая-то другая программа прослушивает порт 9000
в системе (например, php-fpm
установленная на самой хост-системе). Вы можете проверить прослушиваемый порт 9000
с помощью ss -nlp |grep :9000
. Также проверьте сопоставления портов docker.
Также, openssl
и curl
соединения с портом 9000
не имеют значения. Порт 9000
использует FastCGI
протокол, а не TLS
или HTTP
. Для проверки FastCGI
соединения вы можете использоватьcgi-fcgi
команда.