IIS7.5+php5.5的HTTP 错误 500.0问题排查

这几天在windows2008 R2环境下,迁移一个web网站。iis版本是7.5,php版本是5.5,安装软件一切正常,然后把web服务放在虚拟目录下,在本地测试是否能够正常访问。浏览网页都OK,但调用php代码时报错,经典的http 500错误。具体错误如下:

HTTP 错误 500.0 - Internal Server Error

发生未知 FastCGI 错误

模块 FastCgiModule
通知 ExecuteRequestHandler
处理程序 PHP55_via_FastCGI
错误代码 0x80070005
请求的 URL http://localhost:8081/mztx_v2/search.php
物理路径 E:\mzapp\mztx_v2\search.php
登录方法 匿名
登录用户 匿名



  • IIS 收到了请求;但在处理请求过程中出现内部错误。此错误的根本原因取决于处理该请求的是哪一个模块以及出现此错误时工作进程中出现了何种情况。
  • IIS 无法访问网站或应用程序的 web.config 文件。如果 NTFS 权限设置不正确,便会出现这种情况。
  • IIS 无法处理网站或应用程序的配置。
  • 已经过身份验证的用户没有使用此 DLL 的权限。
  • 该请求将被映射到托管处理程序,但不会安装 .NET 可扩展功能。




上网一搜,基本上都说是权限问题,而且解决办法也是抄来抄去,身份验证指定用户,设置目录的权限等,都不能解决,最后还是老外那里取来真经,参见这篇:https://serverfault.com/questions/381872/why-would-i-get-a-500-internal-server-error-iis7-fastcgimodule-with-php看图说话:

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第1张图片

在高级设置里面把标识改为localSystem

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第2张图片

然后在配合网络上千篇一律的做法,身份验证指定特定用户,比如administrator。问题解决,php可以正常访问了。

但是,等一下,作为一个有安全意识的程序员,这样做是不是有点危险?一个外网用户登录到你的网站,就拥有了管理员权限?

如果不能用localsystem,那要用什么呢?回头再看一下那个应用程序池标识,上网一搜,果然有了,具体参见这篇:

http://www.jb51.net/article/89164.htm

简单的说就是在iis7.5中,为了提高系统的安全性,微软增加了一个新特性,虚拟账户。外网用户用这个虚拟账户登录你的网站,

只有这个虚拟账户的权限,而这个账户的权限是很低的。

因此,应用程序池推荐使用applicationpoolidentity模式。

接下来,是更安全的解决方案。

修改应用程序池标识为applicationpoolidentity,这里我用的是classic .net apppool,注意应用程序池的名字,

因为账户名称是和它对应的。如果你自己定义了一个应用程序池,请自行替代。

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第3张图片

找到虚拟目录,修改身份验证的匿名身份验证为启用,并且指定为应用程序池标识

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第4张图片

修改虚拟目录的基本设置,连接为“应用程序用户(通过身份验证)”,应用程序用户是没有密码的。

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第5张图片

这时候做测试连接,会得到一个黄色的感叹号:

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第6张图片

认真看说明,只是无法验证而已,不影响使用。

接下来编辑虚拟目录的权限,让我们的IIS AppPool\Classic .NET AppPool用户(和应用程序池名字对应)可以访问,记得用户名要写全。

另外,不用给父目录或者web根目录去赋权限,没有影响,需要的权限就是底下这些,不用多给:

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第7张图片

OK,安全的配置方法结束,正常情况下你已经可以正确访问php了。

你以为结束了吗?并没有,上面说的都是正常的情况下,敲黑板啦,接下来才是重点,如果上面都设置好了,还是出现500错,怎么办?

高潮来了,神器出场,隆重推荐一下微软自家的ProcessMonitor,下载链接自己去搜吧。

打开神器,简单做一下设置,记得进程名称是w3wp.exe,不是php-cgi:

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第8张图片

然后把界面清一下,打开ie,输入出错的链接,回到神器,找到ACCESS DENIED的错误,提示:Classic .NET AppPool用户访问注册表选项HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options出现了ACCESS DENIED的错误。


IIS7.5+php5.5的HTTP 错误 500.0问题排查_第9张图片

找到原因,解决就简单了,打开注册表编辑器regedit,找到上面提到的项,右键,权限:

IIS7.5+php5.5的HTTP 错误 500.0问题排查_第10张图片

智齿,问题完美解决,这也说明了为什么前面配置为localsystem-administrator可以解决问题了。

问题是次要的,解决问题的方法才是主要的,通过深究这个问题,get到了ProcessMonitor这个解决问题的神器,这个才是今天最大的收获。

你可能感兴趣的:(IIS)