Nginx 컨테이너에서 AWS 및 Docker의 PHP 컨테이너로 index.php를 가져올 수 없습니다.

Nginx 컨테이너에서 AWS 및 Docker의 PHP 컨테이너로 index.php를 가져올 수 없습니다.

AWS EC2 인스턴스에 Docker를 설치하고 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 나쁜 게이트웨이.

Nginx 컨테이너의 /etc/nginx/conf.d/default.conf에는 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은 EC2 인스턴스의 eth0 인터페이스에 바인딩된 IP 주소입니다.

[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을 사용하면 172.31.29.217:9000을 사용하여 Nginx 컨테이너에서 PHP-FPM 컨테이너로 연결할 수 있습니다.

[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)
---

또는 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, index.php에 대한 요청이 Nginx 컨테이너에서 PHP 컨테이너로 전달되지 않음을 암시하는 것처럼 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-FPMDocker 내부 컨테이너 php는 수신 대기하도록 구성되어 있으므로 127.0.0.1컨테이너 외부의 외부 요청에 응답할 수 없습니다. /usr/local/etc/php-fpm.d/www.conf컨테이너 외에 다른 구성 파일이 있거나 php다른 프로그램이 9000시스템의 포트를 수신하고 있습니다(예: php-fpm호스트 시스템 자체에 설치됨). 9000으로 청취 포트를 확인할 수 있습니다 ss -nlp |grep :9000. 또한 Docker 포트 매핑을 확인하십시오.

또한 포트 연결은 openssl관련 이 없습니다. 포트는 또는 가 아닌 프로토콜을 사용합니다 . 연결을 테스트하려면 다음을 사용할 수 있습니다.curl90009000FastCGITLSHTTPFastCGIcgi-fcgi명령.

관련 정보