upstream prematurely closed connection while reading response header from upstreamエラー対策
upstream prematurely closed connection while reading response header from upstreamというエラーログがありました。結論からいうとこのエラーログを調べれば調べるほど解決しない可能性もあるので、お勧めしません。エラー文見て気づく方多いと思いますが、リバースプロキシによる502エラーです
環境
今回は以下の環境で起きた内容となります
- OS:CentOS7
- nginx+apache
- phpenv
- php:8.0.12
- php:7.4.13
- WordPRess:5系
リバースプロキシ
nginxで受け取り、Apacheに受け渡すという方法をとってました。ポートは以下のようになってます
- nginx:80番、443番
- apache:8080番、443番
ApacheはPHPと紐付いてます。nginxでよく使われるphp-fpmは使ってません。nginxはあくまで受け渡すだけというのでロードバランサーみたいな立ち位置と思ってください。
phpenv
今回は元々持っている検証環境があります。PHP7.4.13で動いている状態で、PHP8が動くか確認したくてphpenvで8を入れてみようとなりました。それが悪夢の始まりでした。
PHP8は問題なくインストール可能
phpenvでphpのインストールはエラーもなく問題なくできました。もしエラーが出たという方はphpenvでPHP8をインストールするときのエラー一覧を見てください
いきなり500エラーとなる
インストール後、Apacheとnginxを再起動したら突然502エラーとなりました。
nginx側のエラーログ
upstream prematurely closed connection while reading response header from upstream
nginx側のエラーログとなります。簡単にいうとリバースプロキシが失敗していると言うことになります。
リバースプロキシが本当に失敗しているのか?
検証環境では今まで問題なく動いてました。phpenvをインストールしただけでnginx側は何も設定をかえていません。そこでまずは本当に失敗しているのかを確認します
- htmlファイル:リバースプロキシ成功
- phpファイル:リバースプロキシ失敗
HTMLとPHPファイルを置いてみました。WordPressで突然の502だったので、WordPressの問題もあるため、新しくPHPを用意しました。用意した内容は以下です
<? phpinfo(); ?>
結論:リバースプロキシは問題ない
- HTML:表示される
- PHP:502エラー
HTMLファイルは問題なく表示されました。PHPが502エラーとなりました。リバースプロキシの設定の問題ではなさそうです。どうやらこれはApache+PHP側に問題があるのではないかと思いました。ただ、実はPHPの転送が失敗しているという可能性もあります。
そこで、8080番ポートを開放して、外部からアクセスを可能にしてみました
と用意をしてそれぞれアクセスしてみました。結論としてはHTMLは表示されて、PHPはエラーとなりました。やはりリバースプロキシの問題ではなさそうです
Apacheのログを調べる
nginxではないかもしれないので、Apacheのログを調べてみたいと思います。
[Thu Jan 27 16:15:20.474457 2022] [core:notice] [pid 29616] AH00052: child pid 29620 exit signal Segmentation fault (11) [Thu Jan 27 16:15:20.474510 2022] [core:notice] [pid 29616] AH00052: child pid 29622 exit signal Segmentation fault (11) [Thu Jan 27 16:15:22.478482 2022] [core:notice] [pid 29616] AH00052: child pid 29623 exit signal Segmentation fault (11) [Thu Jan 27 16:15:24.481756 2022] [core:notice] [pid 29616] AH00052: child pid 29621 exit signal Segmentation fault (11) [Thu Jan 27 15:02:11.357233 2022] [core:notice] [pid 1635] AH00052: child pid 2076 exit signal Segmentation fault (11)
child pid 29621 exit signal Segmentation fault (11)という謎のエラーがでてきます今度はこの検索ワードで調べると
- インフラエンジニアがSegmentation fault をなんとか治してみる
- メモリの割り当てに失敗し、プロセスを中止しました。
- 【PHP】Segmentation fault 原因不明のエラーをデバッグする方法
とでてきます。これらはやってみましたが、結論今回の事とは関係なかったかなと思います
このエラーログの手前にこんなエラーログがいました
======= Memory map: ======== 56051047b000-5605104f5000 r-xp 00000000 fd:04 11503 /usr/sbin/httpd 5605106f4000-5605106f7000 r--p 00079000 fd:04 11503 /usr/sbin/httpd 5605106f7000-5605106f9000 rw-p 0007c000 fd:04 11503 /usr/sbin/httpd 5605106f9000-5605106fc000 rw-p 00000000 00:00 0 5605123d3000-56051284b000 rw-p 00000000 00:00 0 [heap] 7fda60175000-7fda601ee000 r-xp 00000000 fd:04 1778754 /usr/local/phpenv/versions/7.4.11/lib/php/extensions/no-debug-non-zts-20190902/opcache.so 7fda601ee000-7fda603ed000 ---p 00079000 fd:04 1778754 /usr/local/phpenv/versions/7.4.11/lib/php/extensions/no-debug-non-zts-20190902/opcache.so 7fda603ed000-7fda603f6000 r--p 00078000 fd:04 1778754 /usr/local/phpenv/versions/7.4.11/lib/php/extensions/no-debug-non-zts-20190902/opcache.so 7fda603f6000-7fda603f7000 rw-p 00081000 fd:04 1778754 /usr/local/phpenv/versions/7.4.11/lib/php/extensions/no-debug-non-zts-20190902/opcache.so 7fda603f7000-7fda60400000 rw-p 00000000 00:00 0 7fda60650000-7fda60656000 r-xp 00000000 fd:04 5020 /usr/lib64/libnss_dns-2.17.so 7fda60656000-7fda60855000 ---p 00006000 fd:04 5020 /usr/lib64/libnss_dns-2.17.so 7fda60855000-7fda60856000 r--p 00005000 fd:04 5020 /usr/lib64/libnss_dns-2.17.so 7fda60856000-7fda60857000 rw-p 00006000 fd:04 5020 /usr/lib64/libnss_dns-2.17.so 7fda60857000-7fda60863000 r-xp 00000000 fd:04 5022 /usr/lib64/libnss_files-2.17.so 7fda60863000-7fda60a62000 ---p 0000c000 fd:04 5022 /usr/lib64/libnss_files-2.17.so 7fda60a62000-7fda60a63000 r--p 0000b000 fd:04 5022 /usr/lib64/libnss_files-2.17.so 7fda60a63000-7fda60a64000 rw-p 0000c000 fd:04 5022 /usr/lib64/libnss_files-2.17.so 以下略
普段エラーログを見る機会は多くないですが。今回は↑のような普段みないログが出力されてました最初は気づかなかったのですがよーくみるとphpenv周りかなと思います。
メモリ関係でエラーログが出力されてます
Apacheを消して再度インストール
ApacheとPHPのあたりで500エラーになっているみたいです。そこでApacheを消して再度インストールします。これで起動すると思います
個人支援・寄付について
サイトラボでは個人支援・寄付を受けております。ご協力いただける方はお願いいたします。当サイトではビットコインで受け付けております。
- ビットコイン:3LHnADwZwUbic2L45EnVJEykiG6KfbqrwS