我在PHP上遇到问题我的应用程序试图运行php备份文件并突然获得HTTP Error 500 Code.我检查了日志,这就是它的意思.
[2012年8月28日14:17:28] [警告] [客户端xxxx](104)通过对等方重置连接:mod_fcgid:从FastCGI服务器读取数据时出错,参考资料:http://example.com/backup/backup.php
[Tue Aug 28 14:17:28 2012] [error] [client xxxx]脚本标题的提前结束:backup.php,referer:http://example.com/backup/backup.php
谁知道如何解决这个问题?我真的被困在这里,无法在互联网上找到解决方案.
希望有人可以分享他们的知识.
谢谢.詹姆士
我把它添加到我的.htaccess文件中:
AddHandler fcgid-script .test
Run Code Online (Sandbox Code Playgroud)
(我正在使用FastCGI/VirtualMin/WebMin)
并打包带有内容的test.test文件;
<?php echo "test"; ?>
Run Code Online (Sandbox Code Playgroud)
这会导致内部服务器错误,并在错误日志中显示以下消息:
[Thu Apr 16 14:12:57.631287 2015] [fcgid:warn] [pid 2646] (104)Connection reset by peer: [client xxxx:53595] mod_fcgid: error reading data from FastCGI server
[Thu Apr 16 14:12:57.631402 2015] [core:error] [pid 2646] [client xxxx:53595] End of script output before headers: test.test
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我尝试使用不同的处理程序名称,如x-httpd-php或x-httpd-php5,但这根本不起作用.
我也尝试过:
<FilesMatch "\.test$">
SetHandler fcgid-script
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)
但它有相同的内部服务器错误.
我在localhost写了一个简单的爬行脚本(在php中)(有4个版本).所有这些都在localhost上运行良好.但当我将它们移动到共享主机时,其中两个工作其他人给出了内部服务器错误.我查看了error_log,我看到了这些行:
[Wed Jan 23 22:01:02 2013] [warn] [client ***] mod_fcgid: read data timeout in 61 seconds
[Wed Jan 23 22:01:02 2013] [error] [client ***] Premature end of script headers: index.php
Run Code Online (Sandbox Code Playgroud)
我搜索过但找不到任何有用的结果.这些错误有什么关系?有任何想法吗?
在/sf/answers/888037671/之前已经问过并回答了这个问题,但是,那里的解决方案对我不起作用.
mod_fcgid配置
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FcgidIPCDir /var/run/mod_fcgid/
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm
FcgidIdleTimeout 60
FcgidProcessLifeTime 120
FcgidMaxRequestsPerProcess 500
FcgidMaxProcesses 150
FcgidMaxProcessesPerClass 144
FcgidMinProcessesPerClass 0
FcgidConnectTimeout 30
FcgidIOTimeout 600
FcgidIdleScanInterval 10
FcgidMaxRequestLen 269484032
</IfModule>
Run Code Online (Sandbox Code Playgroud)
php-cgi脚本
#!/bin/bassh
export PHPRC=/var/www/vhosts/example.com/etc/
export PHP_FCGI_MAX_REQUESTS=5000
exec /usr/bin/php-cgi
Run Code Online (Sandbox Code Playgroud)
系统细节
所以我的FcgidMaxRequestsPerProcess设置为500,我的PHP_FCGI_MAX_REQUESTS设置为10x,如前面的答案和Apache文档中所建议的那样.但我仍然遇到这些错误
[Thu Nov 19 18:16:48.197238 2015] [fcgid:warn] [pid 6468:tid 139726677858048]
(32)Broken pipe: [client X.X.X.X:41098] mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
Run Code Online (Sandbox Code Playgroud) 我收到以下警告:
mod_fcgid:无法为/ var/www/cgi-bin/cgi_wrapper/cgi_wrapper应用进程槽
一旦出现此警告,服务器CPU就会上升到97% - 101%
服务器每天获得大约140K的综合浏览量.此警告主要出现在11:00-12:00之外.除了Analytics(分析)计算的140K综合浏览量外,它还会在第三方网站上提出在其网站上显示文字广告的请求.大约2700个网站正在显示一个广告,并且每小时共向服务器发出22139个请求.
我试过了:chmod 755 /var/log/httpd但/ var/log中没有文件夹"httpd"
我尝试将MaxSpareServers和MaxClients调整为任何可能的高值.但根本没有效果.在Apache重新启动之后,它似乎很好一段时间(服务器仍然响应有点慢并且警告不再出现在日志文件中).但过了一会儿,同样的警告出现了,CPU再次升起.
如果有人有建议请告诉我,谢谢大家.
页面导致500错误,日志显示:
[Wed Mar 20 11:19:23 2013] [warn] [client 127.0.0.1] (104)Connection reset by peer: mod_fcgid: ap_pass_brigade failed in handle_request_ipc function
Run Code Online (Sandbox Code Playgroud)
当您尝试在类别页面上查看90个产品时,它会出现在lemonstand网站上.从每页60个到90个的步骤似乎太多,导致500错误.
页面在错误发生之前加载的时间不超过4秒,并且服务器上运行的许多其他网站没有遇到此问题.
到目前为止,我认为这是由于环境设置,而不是由Lemonstand引起的.我已经用Google搜索了这个并尝试了各种配置设置以使其运行,到目前为止还没有修复它.下面是当前的fcgid配置,我已经注释掉了我尝试改变的一些变量.
Fcgid.conf:
<IfModule mod_fcgid.c>
AddHandler php-fcgi .php
Action php-fcgi /fcgi-bin/php-fcgi-wrapper
AddType application/x-httpd-php .php
Alias /fcgi-bin/ /var/apache/fcgi-bin/
FcgidConnectTimeout 180
FcgidIOTimeout 600
FcgidBusyTimeout 3600
FcgidMaxRequestLen 226777216
FcgidFixPathinfo 1
#FcgidOutputBufferSize 65536
#FcgidProcessLifeTime 30
#FcgidMaxRequestsPerProcess 500
FcgidIdleTimeout 60
#FcgidIdleScanInterval 1
#FcgidBusyTimeout 60
#FcgidBusyScanInterval 1
#FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 100000
<Location /fcgi-bin/>
SetHandler fcgid-script
Options +ExecCGI
Order allow,deny
Allow from all
</Location>
</IfModule>
Run Code Online (Sandbox Code Playgroud) 根据" mod_fcgi不是mod_fastcgi的替代品 "和" mod_fcgid和多线程FastCGI应用程序的问题 ",mod_fcgid并不是设计为期望FastCGI服务器能够同时处理多个请求,即不期望FastCGI服务器是多线程的.
前者说:
它们都支持已发布的"FastCGI"协议,但它们如何控制它们的FastCGI服务器有很大不同.mod_fcgid可以快速消除FastCGI服务器并启动新服务器.
后者说:
似乎mod_fcgid不知道我的服务器是多线程的,并且能够处理多个请求.
这只是两个引用,其他地方也有一些.
线程不仅仅是节省CPU和内存,而且避免了创建新进程的开销(创建一个线程比创建一个进程更轻),这可以通过硬件或操作系统性能来减轻; 这也是一个逻辑问题,不容易缓解:线程属于同一个进程,不仅是性能,还有逻辑,例如.进程无法共享线程可以共享的内容,因为进程是隔离运行的(模IPC,但不一样).
至少出于这个逻辑原因,可能会引发多线程FastCGI服务器的问题.FastCGI服务器可以保存上下文(在进程之间共享可能很大且成本很高),当它被设计为多线程服务器时,它对于所有请求处理程序是全局的.为每个并发请求分配新进程不允许更多地确保公共上下文.
以上两个报价是否仍然正确(一个是2011年,另一个是2010年)?我在网上搜索了这个主题,但找不到任何相关内容.如果它仍然是真的,那么,它是否总是正确或是否有预期的计划mod_fcgid,要了解多线程FastCGI服务器并接受这些服务器可能被设计为处理多个并发请求?
我使用/ server-status来监视Apache进程.开始时它们看起来像这样:
_____W_K__K____________C_K________C_____________W_..............
................................................................
................................................................
Run Code Online (Sandbox Code Playgroud)
但经过几个小时的运行后看起来像这样:
R_KCR___KR__RKRR_RRRKRRRRRRKRR_RRCK____R_RRRR_RRRKRRRKRRRRRRRRR_
R_RRRR_R.RR.R_R.R_R..CKRRRRW.K_RCRKRR_R_.._R._.RK_KRK_.RRR.KK_.R
..RR............................................................
Run Code Online (Sandbox Code Playgroud)
有太多的"阅读"(R)状态需要很长时间,我不知道他们做了什么,因为他们甚至没有请求.(提到我从上面的示例中跳过了其他"."状态,总共有2000个位置可用.)在进程列表中,我有大约40个"R"进程,如下所示:
Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
15-2 21291 0/37/11158 R 0.03 7468 2 0.0 1.93 198.35 82.78.95.105
Run Code Online (Sandbox Code Playgroud)
报告的标题如下所示:
Server Version: Apache/2.4.10 (Debian) mod_fcgid/2.3.9 OpenSSL/1.0.1t
Server MPM: prefork
Server Built: Sep 15 2016 20:44:43
Current Time: Thursday, 12-Jan-2017 08:38:46 EET
Restart Time: Wednesday, 11-Jan-2017 00:51:18 EET
Parent Server Config. Generation: 3
Parent Server MPM Generation: 2
Server uptime: 1 day 7 hours 47 minutes …Run Code Online (Sandbox Code Playgroud) 每次我请求.php文件时,我都会收到500错误代码.
我尝试了许多不同的文件权限并搜索了整个互联网(或者至少,感觉就像这样),但我找不到任何有用的东西.(这不是一个容易找到suexec错误或类似的东西.但我想,这是权限的东西......可能我只是不知道/某一点......)
/var/log/apache2/error.log(LogLevel info)
[Tue Sep 11 12:47:21 2012] [info] Init: Seeding PRNG with 648 bytes of entropy
[Tue Sep 11 12:47:21 2012] [info] Init: Generating temporary RSA private keys (512/1024 bits)
[Tue Sep 11 12:47:21 2012] [info] Init: Generating temporary DH parameters (512/1024 bits)
[Tue Sep 11 12:47:21 2012] [info] Init: Initializing (virtual) servers for SSL
[Tue Sep 11 12:47:21 2012] [info] mod_ssl/2.2.16 compiled against Server: Apache/2.2.16, Library: OpenSSL/0.9.8o
[Tue Sep 11 12:47:21 2012] [notice] suEXEC mechanism enabled (wrapper: …Run Code Online (Sandbox Code Playgroud) 我想隐藏index.php页面,只显示域名.
这可能与.htaccess一起使用吗?
RewriteRule ^index\.php/?$ / [L,R=301,NC]
Run Code Online (Sandbox Code Playgroud)
还尝试过:
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /index.php HTTP/
RewriteRule ^index.php$ http://example.com/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Run Code Online (Sandbox Code Playgroud)
index.php仍然显示