Closed1

recv() failed (104: Connection reset by peer) while reading response header from upstream

Daichi TamakiDaichi Tamaki

nginx + php-fpm の構成を、docker-compose で別サービスに分けて作ろうとするとよくハマるやつ

nginx_1  | 172.27.0.1 - - [19/Sep/2022:04:19:32 +0000] "GET / HTTP/1.1" 502 157 "-" "curl/7.79.1" "-"
nginx_1  | 2022/09/19 04:19:32 [error] 8#8: *1 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.27.0.1, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://172.27.0.4:9000", host: "localhost"

www.conf (pool) の以下の設定を訝しみましょう。

listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1

公式ドキュメントを読む。

listen string
FastCGI リクエストを受け入れるアドレス。 'ip.add.re.ss:port', 'port', '/path/to/unix/socket' 形式の構文が使えます。 このオプションは、各プール単位で必須となります。

listen.allowed_clients string
接続を許可されている FastCGI クライアントの IPv4 または IPv6 アドレス一覧。オリジナル版 PHP FastCGI (5.2.2+) における環境変数 FCGI_WEB_SERVER_ADDRS と同じです。 tcp でリスンするソケットに対してのみ意味をなします。 書くアドレスはカンマ区切りで指定します。この値を空にしておくと、任意の ip アドレスからの接続を許可します。 デフォルト値: 任意の ip アドレスを許可。

https://www.php.net/manual/ja/install.fpm.configuration.php

サービスを分けると使用ネットワークの Subnet 内の IP が設定されるため、

$ docker-compose ps -q php | xargs docker inspect | jq '.[].NetworkSettings.Networks[].IPAddress'
"172.28.0.3"

$ docker network inspect bridge | jq '.[].IPAM.Config'
[
  {
    "Subnet": "172.17.0.0/16",
    "Gateway": "172.17.0.1"
  }
]

以下のようにしないと Connection reset by peer されちゃう。

listen = 9000 ; or listen = 0.0.0.0:9000
;listen.allowed_clients = 127.0.0.1

おまけ

$ docker-compose exec php cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

$ docker-compose exec php yum provides netstat
Loaded plugins: ovl, priorities
286 packages excluded due to repository priority protections
net-tools-2.0-0.22.20131004git.amzn2.x86_64 : Basic networking tools
Repo        : amzn2-core
Matched from:
Filename    : /bin/netstat

net-tools-2.0-0.22.20131004git.amzn2.0.2.x86_64 : Basic networking tools
Repo        : amzn2-core
Matched from:
Filename    : /bin/netstat

net-tools-2.0-0.22.20131004git.amzn2.0.2.x86_64 : Basic networking tools
Repo        : @amzn2-core
Matched from:
Filename    : /bin/netstat

net-tools-2.0-0.22.20131004git.amzn2.0.2.x86_64 : Basic networking tools
Repo        : @amzn2-core
Matched from:
Filename    : /usr/bin/netstat

$ docker-compose exec php bash -c 'yum install -y net-tools && netstat -na | grep 9000'
...
tcp        0      0 0.0.0.0:9000            0.0.0.0:*               LISTEN
このスクラップは2022/09/19にクローズされました