質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

5234閲覧

Docker (Stable Nginx + CentOS8 PHP-FPM) で 104: Connection reset by peer の解決法

IkumiMashiba

総合スコア76

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2020/05/08 07:38

現象 502 Bad Gateway

Dockerで、2つのコンテナを用意しました

  1. nginx:stable
  2. CentOS8にRemi repoのPHP-FPM7.3を入れたもの

docker-compose up -d --build でコンテナを起動し
ブラウザからアクセスすると 502 Bad Gateway となります。

docker-compose logs で以下のlogが表示されます。

recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.96.1, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "fastcgi://192.168.96.2:9000", host: "localhost", referrer: "http://localhost/"

PHP-FPMから返事がうまく返って来ない。
何かお気づきの点がありましたら、ご指摘ください。

環境

HostPC Win10Pro
Docker desktop 2.2.0.5 stable

ファイル
[dir]
|- docker-compose.yml
|- Dockerfile
|- default.conf
`- index.php


  • docker-compose.yml

yaml

1version: '3' 2services: 3 nginx: 4 container_name: test-web 5 image: nginx:stable 6 volumes: 7 - ./default.conf:/etc/nginx/conf.d/default.conf:ro 8 - ./:/var/www/html 9 ports: 10 - "80:80" 11 environment: 12 TZ: JST-9 13 depends_on: 14 - php-fpm 15 16 php-fpm: 17 container_name: test-fpm 18 image: test-fpm 19 build: 20 context: ./ 21 dockerfile: Dockerfile 22 volumes: 23 - ./:/var/www/html
  • Dockerfile

Dockerfile

1FROM centos:8 2 3RUN dnf -y install epel-release && \ 4 dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm && \ 5 cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ 6 dnf module reset php && \ 7 dnf -y module install php:remi-7.3 && \ 8 dnf -y install php-fpm && \ 9 mkdir /run/php-fpm && \ 10 touch /run/php-fpm/php-fpm.pid && \ 11 sed -i -e "s|user = apache|user = nginx|" /etc/php-fpm.d/www.conf && \ 12 sed -i -e "s|group = apache|group = nginx|" /etc/php-fpm.d/www.conf && \ 13 sed -i -e "s|listen = /run/php-fpm/www.sock|listen = test-fpm:9000|" /etc/php-fpm.d/www.conf && \ 14 dnf -y update && \ 15 dnf clean all 16 17CMD ["/usr/sbin/php-fpm", "-F"]
  • default.conf

conf

1server { 2 listen 80; 3 root /var/www/html/; 4 index index.html index.htm index.php; 5 6 access_log /var/log/nginx/access.log; 7 error_log /var/log/nginx/error.log; 8 9 location / { 10 try_files $uri $uri/ /index.php$is_args$query_string; 11 } 12 location ~ .php$ { 13 fastcgi_split_path_info ^(.+.php)(/.+)$; 14 fastcgi_pass test-fpm:9000; 15 fastcgi_index index.php; 16 include fastcgi_params; 17 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 18 fastcgi_param PATH_INFO $fastcgi_path_info; 19 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 20 } 21}
  • index.php

php

1<?php echo phpinfo(); ?>

他に試したこと

標準的な、nginx:stable + php:7-fpm

当然これは問題なく動作しますが、前述の問題点が見つけられなくて詰まっています。

  • docker-compose.yml

yaml

1version: '3' 2services: 3 nginx: 4 container_name: std-web 5 image: nginx:stable 6 volumes: 7 - ./default.conf:/etc/nginx/conf.d/default.conf:ro 8 - ./:/var/www/html 9 ports: 10 - "80:80" 11 environment: 12 TZ: JST-9 13 depends_on: 14 - php-fpm 15 16 php-fpm: 17 container_name: std-php 18 image: php:7-fpm 19 volumes: 20 - ./:/var/www/html

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論から言いますと、php-fpm が 127.0.0.1 から以外のアクセスを許可していないことが原因です。
rpm では、マイクロサービスのコンテナにインストールされることを想定しておらず、nginx と同じOSにインストールされる前提なので、デフォルトはそうなっているのでしょう。

当方の再現環境では、Dockerfile の sed -i の並びに以下の行を加えて、制限の設定をコメントアウトすることで動きました。

sed -i -e "s|listen.allowed_clients = 127.0.0.1|;listen.allowed_clients = 127.0.0.1|" /etc/php-fpm.d/www.conf && \

以下はぐちですが、今後のデバッグにも役に立つかもしれないので、参考にしてください。
「結論から言いますと」と書いたのは、再現させてから原因を突き止めるまでに苦労したからです。デフォルトのphp-fpm の設定ではワーカで発生したエラーはログファイル(/var/log/php-fpm/error.log)に出ないからです。設定ファイルを修正して

sed -i -e "s|;catch_workers_output = yes|catch_workers_output = yes|" /etc/php-fpm.d/www.conf && \

とすると、ワーカーのエラーもログファイルにでるようになり、

[09-May-2020 13:08:01] WARNING: [pool www] child 10 said into stderr: "ERROR: Connection disallowed: IP address '172.22.0.3' has been dropped."

というエラーが出て原因がわかった次第です。

投稿2020/05/09 04:32

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IkumiMashiba

2020/05/09 10:44 編集

回答ありがとうございます。 私のphp-fpm に関する知識が不足していて解決に至らなかったのが原因ですね。 確かに、php:7-fpm から生成されたコンテナ内を確認すると ``` ;listen.allowed_clients = 127.0.0.1 ``` となっていました。 そういえば悩んでいる時に、適当に、この2つを試したりしたのですが、やはり駄目でした。 ``` listen.allowed_clients = 0.0.0.0 listen.allowed_clients = test-web ``` ワーカーログについてもありがとうございます。 早速、これもsed行に追加します!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問