発生する問題:
1 コマンドラインで php スクリプトを直接実行すると、通常のデータが返されます
2 nginx 経由でアクセスすると、切り詰められたデータが返されます
トラブルシューティング後、fastcgi_temp ディレクトリの読み取りおよび書き込み権限に問題があり、次のようなエラーが Nginx エラー ログに多数記録されます:
2016/06/07 00:41:28 [crit] 32763#0: *5439 open() "/Data/apps/nginx/fastcgi_temp/5/02/0000000025" failed (13: Permission denied) while reading upstream, client: 203.171.237.2, server: www.36nu.com, request: "GET /thread.html HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000",...
この文から判断します。返されたデータが大きすぎるため、ファイルの形式で保存する必要があるはずですが、nginx には読み取りおよび書き込み権限がないため、fastcgi_temp に読み取りおよび書き込み権限を与えました。
chmod -R 764 /usr/local/nginx/fastcgi_temp/
Nginx のバッファー メカニズムについて簡単に説明します。Nginx は FastCGI サーバーからの応答をメモリにバッファーし、順番にクライアントに送信します。バッファのサイズは、fastcgi_buffers と fastcgi_buffer_size の 2 つの値によって制御されます。
たとえば、次の構成:
fastcgi_buffers 8 4K;
fastcgi_buffer_size 4K;
fastcgi_buffers は、4K サイズのバッファを最大 8 つ作成するように nginx を制御します。 fastcgi_buffer_size は、Response を処理するときの最初のバッファのサイズであり、前者には含まれません。したがって、作成できる合計最大メモリ バッファ サイズは 8*4K+4K = 36k です。これらのバッファは、実際の応答サイズに基づいて動的に生成され、一度にすべて作成されるわけではありません。たとえば、8K ページの場合、Nginx は 2*4K の合計 2 つのバッファを作成します。 Response が 36k 以下の場合は、当然ながらすべてのデータがメモリ内で処理されます。 Response が 36k より大きい場合はどうなりますか?それが fastcgi_temp の機能です。追加のデータは一時的にファイルに書き込まれ、このディレクトリの下に配置されます。 36Kb はメモリにバッファされ、残りはファイルに書き込まれます。実際の状況では、Nginx プロセスを実行しているユーザーには fastcgi_temp ディレクトリへの読み取りおよび書き込み権限がありません。この解決策は、fastcgi_temp ディレクトリへの読み取りおよび書き込み権限を付与することで比較的簡単に解決できます。