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

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

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

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

6428閲覧

特定のプログラムで504エラーが発生すると、サイト全体が504エラーとなる

shimizu

総合スコア28

PHP

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

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

1グッド

1クリップ

投稿2018/10/15 02:32

発生している問題

Nginx(1.10) + PHP-FPM(7.0) + MariaDB(10.0) + CodeIgniter(3.1.9) でサイトを構築しています。

以下のプログラムを実行すると、504 Gateway Time-out が発生します。

PHP

1while(true){ 2 sleep(30); 3}

NginxやPHP-FPMにタイムアウトを設定しているため、このエラー自体は通常の動きだと思うのですが、1箇所で504エラーが発生すると、同サイトへのすべてのアクセスが504エラーとなるため、対応方法を知りたいと考えています。
ヒントになりそうな情報などでもよいので、ご存知の方がいらっしゃれば教えていただきたいです。よろしくお願いいたします。

わかっていること

PHP-FPM・MariaDB を再起動すると回復する

すべてのアクセスが504エラーとなったときに PHP-FPM もしくは MariaDB を再起動すると回復します。(Nginxは再起動しても回復しませんでした。)

DBプロセスをkillすると回復する

問題のプログラムを実行時にDBプロセスを確認すると、以下プロセスの11299 が開始され、プロセスが残り続けます。それ以降のアクセスは 11303 のようにロック状態となります。11299 をkillすると、回復します。

MariaDB

1MariaDB [(none)]> show processlist; 2+-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+ 3| Id | User | Host | db | Command | Time | State | Info | Progress | 4+-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+ 5| 11282 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 | 6| 11299 | UserName | localhost | DatabaseName | Sleep | 81 | | NULL | 0.000 | 7| 11303 | UserName | localhost | DatabaseName | Query | 71 | User lock | SELECT GET_LOCK('27fac...', 300) AS ci_session_lock | 0.000 | 8+-------+----------+-----------+----------------+---------+------+-----------+-----------------------------------------------------+----------+ 9MariaDB [(none)]> kill 11299;

CodeIgniter特有の問題の可能性が高い

通常のPHPプログラムとしてsleepを実行すれば、想定通りの動作(1箇所のみ504エラーで同サイトへのすべてのアクセスは問題なく処理できる)となります。

エラーメッセージは特になし

nginx・php-fpm・mariadbについてエラーログを確認しましたが、気になる点はありませんでした。

試したこと

pconnectの設定値がFALSEであることを確認しました

http://ryokwkm2.hatenadiary.jp/entry/2015/09/28/161925

CodeIgniterを最新にしてみました

https://teratail.com/questions/58318

YoshihisaHamada👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

一旦自己解決しました。
ログの見落としがありました。。

PHP

1WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

というログが出力されており、pm.max_childrenの上限を変更することで動作するようになりました。

またその後の調査で MariaDB・CodeIgniter を利用していない場合にも、発生することがわかりました。
以下PHPファイルを用意し、5つ(pm.max_children数)のブラウザタブからアクセスすると、再現しました。

PHP

1<?php sleep(60); ?>

おそらく以下のような状況が発生していたのではと考えています。

既存の PHP リクエストがタイムリーに処理されない場合、新しい PHP リクエストは待機モードのままになります。Nginx の fastcgi_read_timeoutの値を超えると、504 Gateway Time-outエラーが発生します。
https://jp.alibabacloud.com/help/faq-detail/55207.htm

もし私の認識に間違いがあったり、pm.max_children変更以外の解決方法などあれば、回答いただければと思います。

投稿2018/10/15 10:47

shimizu

総合スコア28

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問