ラボ > PHP:通信絡み、サーバ

「Provisional headers are shown」「324:ERR_EMPTY_RESPONSE」が出てきた

ある日、Webページが開かなくなった(ERR_EMPTY_RESPONSE)。Chromeは「Provisional headers are shown」と言っている。

作成日:2018-07-18, 更新日:2018-07-18

経緯

・PHPのcUrlで別サーバからデータを取得していた
・ある日、Webページが開かなくなった。
・ChromeのデベロッパーツールのNetworkを見ると「Provisional headers are shown」と言われていた。
・思い当たるふしが無いので、サーバ側で何か変更したのか確認→「fluentd」をインストするために何かをアップデートしたとか。
・調べるとcurl_exec()で落ちている→404やタイムアウトのときでも何かしら結果を返してくれるけど・・・なぜか落ちる。

Provisional headers are shown

こいつは・・・何? コイツが出てくる可能性

A.ajaxで別ドメインを指定(関連:クロスドメイン、jsonp)
B.キャッシュを使っていて通信を行っていない
・・・あたりが原因らしい。

今回は、クロスドメインではあるけどajaxを使っていないので「A」は関係なし。
※仮に「A」の場合の対策は、「先方(ajaxが指定しているURL)で受け入れ体制を取ってもらう」 or 「ajaxでjsonpを使う」感じ。

ひとまず、保留。先にプログラムがドコで落ちているか調査

curl_exec()で落ちている

画面が白くなるなら分かるけど・・・下記のようなエラー画面が出てくる。

どこで処理が落ちているのかを調べていくと「curl_exec()」で落ちていた。
※tyr-catch()で囲ってやってもcatchされずに落ちる。

404やタイムアウトでも何かしらの結果があるのに、なぜか落ちる。
→原因は、調べても分からない。

ブラウザに表示される画面にある「ERR_EMPTY_RESPONSE」を調べると「324」らしい。
「http error 324」とかで調べると2011年あたりのChromeの問題というのが多いが・・・今は2018年。多分、Chromeは関係ないと思う

後出し情報

なにげにlibcurlとcurlもアップデートしてたらしい。詳細は不明。

B.キャッシュを使っていて通信を行っていない

「324:ERR_EMPTY_RESPONSE」はひとまず置いて、先にキャッシュのほうをチェック。

この「キャッシュを使っていて通信を行っていない」ってヤツがさらに二つある。
B-1.ブラウザ側で対応
B-2.サーバ側で対応

B-1.ブラウザ側で対応

「ブラウザのキャッシュをクリア」すれば良いとか。

Chromeの場合
・デベロッパーツール→「Network」
・「Disable cache」にチェックを入れる

私の場合はチェックをいれても変化はなかった

B-2.サーバ側で対応

サーバ側でキャッシュを使うようにしていると思われるけど・・・よく分からない。
とりあえず「インターネットsecuirtyがあれば削除または無効」にする必要があるとか。

ひとまず詳しく調査しなおなす。

サーバ側

現状、分かっているのは・・・
・ajaxは使っていないので、関係ない
・他のブラウザでも同じだからブラウザ(Chrome)固有の問題ではない
・プログラムの修正は行っていないのにある日を境にエラーになった
・サーバ側の変更は管轄外なので知らない(何かをアップデートしたらしい・・・)

ひとまずapacheのエラーログの確認

▼何回も出てきているヤツがいた

/usr/sbin/httpd: symbol lookup error: /usr/lib64/libnsssysinit.so: undefined symbol: PR_GetEnvSecure

▼解決方法

httpdを「restart」じゃなく「stop」させてから「start」させる

※コイツらが原因で「Provisional headers are shown」「324:ERR_EMPTY_RESPONSE」が出てきた・・・と思われる。

http status 324: ERR_EMPTY_RESPONSE

「ERR_EMPTY_RESPONSE」が「レスポンスが空っていうエラー」っていうのは直訳すれば分かるけど、もうちょっと詳細が知りたい。

・・・ということで、「http status 324: ERR_EMPTY_RESPONSE」について少し調べてみた。

現状

下記のような状況になっている

A.cUrlを実行しようとしている「サーバ:A」がある。
B.cUrlで「サーバ:B」にアクセス:成功
C.cUrlで「サーバ:C」にアクセス:失敗(324: ERR_EMPTY_RESPONSE)

考えられる要因

・「サーバ:C」が信用のおけないセキュリティを使用している
・「サーバ:A」として「サーバ:C」へのアクセス禁止を行う

ココでは「サーバ:A」としているが、「ブラウザ」という場合もある。
→Chromeはこの手のエラーになるコトが多いとか。「セキュリティがしっかりしている」という意味ではありがたい。

対策

対策は2つ、問題が一つある。

▼対策
・「サーバ:A」で規制を緩める
・「サーバ:C」で信用のおけるセキュリティにしてもらう

「サーバ:A」で規制を緩めるってのは基本、無し。
※「ブラウザ」の場合は「全利用者に対応」してもらう必要があるので、コレも無し。

「サーバ:C」で信用のおけるセキュリティにしてもらうってのは・・・「サーバ:C」側の管理者に丸投げするので、ココから先は未調査。

▼問題
・「サーバ:A」で別のエラーがでている
※エラーログを確認したり、何かをアップデートしたけど「restart」していない、「end→start」じゃなく「restart」した・・・とか思い当たるトコを必要に応じて調査・対応。

めも・まとめ

今回、エラーの要因が複数考えられ、絞り込めなかったので・・・キーワードだけ抜け出しておく
※次回の調査時の足掛かりにするキーワードたち

・Chrome
・Provisional headers are shown
・324:ERR_EMPTY_RESPONSE
・ajax、jsonp、クロスドメイン
・セキュア(secuirty)
・apacheのエラーログ
・キャッシュ(ブラウザ側、サーバ側)
・cUrl