Zend / Apache2:在多次请求url时找到302

时间:2013-03-04 12:35:09

标签: php mysql api zend-framework apache2

我正在使用 Zend框架编写 REST API 多次调用网址时(例如,每秒1次请求1000次),大约 0.2%的情况,而不是 200 OK 作为回复我获取 302 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 个答案:

答案 0 :(得分:2)

这对我来说非常简单直接。这是一个302重定向,我想不出ZF中任何重定向的东西;特别是不要500错误页面。 500错误(内部服务器错误)必须始终返回500错误,并且永远不应该是302重定向。所以你在这里很幸运,因为你必须在RETS API中有一些错误处理导致某个地方的重定向(而不是常规的错误页面)。

在代码中搜索重定向。可以使用ZF重定向器帮助程序(在控制器内)或手动(任何地)使用header()和exit()来完成。当您发现重定向时,使用debug_backtrace显示(退出)或将其转储到日志文件中。并修复返回代码或处理错误的方式。

答案 1 :(得分:1)

  

请注意,当您指定一个指向远程URL的ErrorDocument(即任何方法,例如前面带有http的方法)时,Apache会向客户端发送重定向,告诉它在哪里找到该文档,甚至如果文档最终在同一台服务器上。

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

我假设你在Apache HTTP服务器配置中使用ErrorDocument指令,然后按照500错误的配置进行操作。

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

或者我通常写道:

  

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

哇 - 这是一个完全意想不到的问题,很难弄明白......

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

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

这显然是一个非常常见的问题,如所描述和解决here 变量session.gc_probability1中设置为php.ini,这意味着垃圾收集器运行并清理php会话所在的目录/var/lib/php5的概率为1%存储。显然,www-data无法写入此文件夹,从而导致上述错误并抛出Zend异常。

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

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