8

我正在使用Zend 框架编写REST API。 当多次调用 url 时(例如 1000 次,每秒 1 个请求),在大约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数据库并返回一个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 或将其转储到日志文件中。并修复返回码或错误处理方式。

于 2013-03-08T16:03:41.463 回答
1

请注意,当您指定一个指向远程 URL 的 ErrorDocument(即前面带有 http 之类的方法的任何内容)时,Apache 将向客户端发送重定向以告诉它在哪里可以找到文档,即使文档最终在同一台服务器上。

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

我假设ErrorDocument您在您的 Apache HTTP 服务器配置中使用该指令,该指令将按照 500 错误的配置执行。

500 错误可以由 PHP 本身触发。要了解发生了什么,您需要查看服务器错误日志以及 php 错误日志(并自然为此启用 PHP 错误日志记录)。

或者就像我通常写的那样:

500 内部服务器错误始终查看服务器错误日志的邀请。它包含更多信息。由于这是 PHP,也很有可能是因为PHP 中的致命错误,因此确保启用 PHP 错误日志并查看 PHP 错误日志也非常有用。有关 500 内部服务器错误的更多信息

于 2013-03-10T12:58:03.037 回答
0

如果没有有关您的应用程序的更多详细信息,则很难猜测。我的猜测是您的一项服务(很可能是数据库)在流量和 I/O 增加的情况下会变慢。因此,某些 PHP 连接可能会超时。这会导致应用程序错误并重定向到错误页面。

取决于您的应用程序在记录内部问题方面的表现如何,logs/application.log但默认情况下,记录内容并不是很好。

于 2013-03-07T16:38:43.490 回答
0

哇 - 这是一个完全出乎意料的问题,真的很难弄清楚......

@AdrianWorld 帮助我走上正轨。在 Zend ErrorController 中,我输出错误消息并发现以下异常:

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

这显然是一个很常见的问题,正如这里描述和解决的那样。
该变量session.gc_probability设置为1php.ini这意味着垃圾收集器有 1% 的概率运行并清理/var/lib/php5存储 php 会话的目录。www-data显然,由于导致上述错误并抛出 Zend 异常,该文件夹不可写。

由于session.gc_probability仅设置错误随机发生的概率,因此调试非常困难。

无论如何,我很高兴它已解决 - 感谢所有提示和猜测:)

于 2013-03-13T21:20:20.970 回答