web-dev-qa-db-ja.com

nginxおよびphp-fpmによる継続的なセグメンテーション違反(コード11)

私は1.2GHzのCPUと2.4GBのRAMを搭載したCentOS664ビットサーバーを実行しています。サーバーは、APC拡張機能とmysqlを使用してnginxとphp-fpmを実行します。

数週間前、サーバーはHTTPリクエストで500エラーを継続的にスローし始めました。 Google WMTは、クロールエラーで毎日約450のサーバーエラーを報告していました。 Webサイトを閲覧している場合、3〜4ページごとにエラーがスローされました。

これはphp-fpmがどのように構成されたかです:

pm = dynamic
pm.max_children = 45
pm.start_servers = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 1000

Php-fpmエラーログで見つけたログを確認したところ、これらが2つの最も頻繁なエラーであることがわかりました。

ERROR: fork() failed: Cannot allocate memory (12)
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 30 total children

WARNING: [pool www] child 27455 exited on signal 11 (SIGSEGV) after 8393.397161 seconds from start

ログの推奨事項に従い、上記の値を次のように増やしました。

pm = dynamic
pm.max_children = 70
pm.start_servers = 25
pm.min_spare_servers = 15
pm.max_spare_servers = 25
pm.max_requests = 1000

エラーの頻度は減少しましたが、大幅には減少しませんでした。

さらに調査を行った結果、「メモリを割り当てられません」エラーの理由の1つは、インストールされているPHP 5.4とAPC3.1.9の非互換性である可能性があることを発見したため、APCを次のように更新しました。 PHP 5.4との互換性を報告したバージョン3.1.13。これにより、「メモリを割り当てられません」エラーが完全に消えましたが、それでもコード11のセグメンテーション違反がスローされていました。

その後、pm.max_requestsの値が高すぎる可能性があることを発見したので、次のように減らしました。

pm.max_requests = 600

ここでも、スローされるエラーの頻度は低下しましたが、大幅には低下しませんでした。

もう少し推奨事項を読んだ後、WebサーバーのフロントエンドとしてVarnishをインストールしました。これによりエラーが大幅に減少しましたが、ログには、コード11のセグメンテーション違反エラーが2〜3時間に1回程度スローされることが示されています。これは、私のWebサイトを表示しようとしたときにサーバーエラーが発生するユーザーがまだいることを意味します。 Webサーバーに対して実行できる他の最適化があるかどうかを知りたいのですが。

役に立つかもしれない他の情報:私は毎日およそ2000のユニークビジターを獲得していますが、私のウェブサイトでも高レベルのスパム攻撃を受けています。私はサーバーの前でプロキシとしてCloudflareを設定しましたが、それ以来、スパムレベルは大幅に減少しました。また、スクリプトや画像などの静的ファイルにもMaxCDNを使用しているため、これらは通常Webサーバーから要求されません。

2
Daniel

Phpに含まれているモジュールが、セグメンテーション違反を引き起こしている可能性があります。何が原因であるかを把握するために、デバッグを行う必要があります。開始するのに適した場所は次のとおりです。

コアファイルをオンにします: http://aplawrence.com/Linux/limit_core_files.html

GDBでコアダンプを読み取ります: https://stackoverflow.com/questions/5115613/core-dump-file-analysis

それはあなたにそれを引き起こしているかもしれないものの一般的な考えを与えるでしょう。インストールしたPHPモジュール)をアップグレード/ダウングレードする必要がある場合があります。

3
Kyle