8

Zend フレームワークでREST APIをプログラミングしています。 URLを数回呼び出すと(たとえば、1秒あたり1リクエストで1000回)、約0.2%のケースで、応答として取得するのではなく、別のページにリダイレクトされます。 サーバーの応答全体は次のとおりです。
200 OK302 Found

302 Found Date: Mon, 04 Mar 2013 11:56:04 GMT
Server: Apache/2.2.17 (Ubuntu)
X-Powered-By: PHP/5.3.5-1ubuntu7.11
Set-Cookie: PHPSESSID=ui9r8jqa63dbom8osknso6eea5; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: /de/default/index/index/error/500
Vary: Accept-Encoding
Content-Length: 0
Content-Type: text/html; charset=utf-8

そのため、Zend はエラー 500 (内部サーバー エラー) ページにリダイレクトします。問題はその理由です-そして、私にはそれを理解することはできません...
呼び出されたphpページは、MySQLデータベースに1行を挿入し、JSON文字列を返します-それだけです。

Apache2には約20 の同時接続が開いており、サーバーの負荷は <<1 であるため、リクエストが問題を引き起こす理由がよくわかりません。

これはリモートで診断するのが非常に難しい問題であることはわかっていますが、これを解決するための適切な推測と推奨事項は大歓迎です! ありがとう。

これは、@chris から要求された apache vhost 構成です。

<IfModule mod_ssl.c>
<VirtualHost mydomain.tld:443>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www
    ServerName www.mydomain.tld
    ServerAlias mydomain.tld *.mydomain.tld
    <Directory />
        Options FollowSymLinks
        AllowOverride All
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/ssl_access.log combined

#   RewriteLog "/var/log/htaccess.log"
#   RewriteLogLevel 5

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

    #   SSL Engine Switch:
    #   Enable/Disable SSL for this virtual host.
    SSLEngine on
    SSLOptions +StrictRequire
    SSLCertificateFile /etc/apache2/ssl/cert_2013_2014.crt
    SSLCertificateKeyFile /etc/apache2/ssl/www.mydomain.tld.key
    SSLCACertificateFile /etc/apache2/ssl/intermediate.crt

</VirtualHost>
</IfModule>
4

4 に答える 4

2

これは非常に単純で、私には簡単に見えます。これは302リダイレクトであり、ZFではそれ自体でリダイレクトするものは何も考えられません。特に500エラーページではありません。500エラー(内部サーバーエラー)は常に500エラーを返す必要があり、302リダイレクトになることはありません。したがって、(通常のエラーページではなく)どこかにリダイレクトを引き起こすRETS APIでエラー処理を行う必要があるため、ここでは幸運です。

コードでリダイレクトを検索します。これは、ZFリダイレクタヘルパー(コントローラー内)を使用して実行することも、header()およびexit()を使用して手動(任意の場所)で実行することもできます。リダイレクトが見つかったら、debug_backtraceを使用してshow(exit)するか、ログファイルにダンプします。また、リターンコードまたはエラーの処理方法を修正します。

于 2013-03-08T16:03:41.463 に答える
1

リモートURL(つまり、その前にhttpなどのメソッドがあるもの)を指すErrorDocumentを指定すると、Apacheはクライアントにリダイレクトを送信して、ドキュメントがどこにあるかをクライアントに通知します。最終的に同じサーバー上に存在することになります。

http://httpd.apache.org/docs/2.2/mod/core.html#errordocument

ErrorDocumentApache HTTPサーバー構成でディレクティブを使用していると仮定します。このディレクティブは、500エラーに対して構成されたとおりに機能します。

500エラーはPHP自体によってトリガーされる可能性があります。何が起こるかを知るには、サーバーエラーログとphpエラーログの両方を調べる必要があります(そして当然、そのためにPHPエラーログを有効にします)。

または私がよく書くように:

500 Internal Sever Errorは、常にサーバーのエラーログを調べるための招待状です。詳細情報が含まれています。これはPHPであるため、PHPの致命的なエラーが原因である可能性も高いため、PHPエラーログが有効になっていることを確認し、PHPエラーログを調べることも非常に役立ちます。500内部サーバーエラーの詳細

于 2013-03-10T12:58:03.037 に答える
0

うわー、これはまったく予期しない問題であり、理解するのは本当に困難でした...

@AdrianWorld は、私が正しい軌道に乗るのを助けてくれました。Zend ErrorController でエラー メッセージを出力したところ、次の例外が見つかりました。

ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13) Array

ここで説明および解決されているように、これは明らかにかなり一般的な問題です。
変数session.gc_probabilityは に設定され1ました。php.iniこれは、1% の確率でガベージ コレクターが実行/var/lib/php5され、php セッションが保存されているディレクトリがクリーンアップされることを意味します。www-data上記のエラーが発生し、Zend 例外がスローされるため、明らかにこのフォルダーは書き込み可能ではありません。

エラーがランダムに発生する確率のみを設定するためsession.gc_probability、デバッグがかなり困難になります。

とにかく、それが解決されてうれしいです-すべてのヒントと推測に感謝します:)

于 2013-03-13T21:20:20.970 に答える
0

アプリケーションに関する詳細がなければ、推測するのは非常に困難です。私の推測では、あなたのサービスの 1 つ (データベースである可能性が最も高い) は、トラフィックと I/O が増加すると速度が低下します。その結果、一部の PHP 接続でタイムアウトになる場合があります。その結果、アプリケーション エラーが発生し、エラー ページにリダイレクトされます。

内部の問題をログに記録するアプリケーションがどれだけ優れているかによって異なりますlogs/application.logが、デフォルトでは、ログの記録にはあまり適していません。

于 2013-03-07T16:38:43.490 に答える