ASPX程序造成IIS进程池意外终止的一个例子

今天是2012年的春节放假后的第一个工作日。一大早就接到一位客户的电话,说网站打开报Service Unavailable错误。这个错误是非常常见的错误之一,之前我们也有在帮助中心的一篇文章中分析过。我们远程到服务器上一检查,原来是这个空间所在的进程池意外停止了,显示出红色的记号,并非管理员人工停止的。那么如何查明造成进程池停止的具体原因呢?

由于我们对进程池采取了分类管理的措施,所以一眼就看出这个意外停止的进程池是ASP.net2.0网站所在的进程池。这样马上就意识到可能是部分客户的aspx程序造成的。接下来,我们打开管理面板的事件查看器,再打开应用程序事件。搜索红色的错误事件,很快就发现了这样一个asp.net2.0的错误日志,并且重复多次。具体内容如下:

===================================

发生未处理的异常,并已终止进程。

Application ID: /LM/W3SVC/877/Root

Process ID: 3072

Exception: System.UnauthorizedAccessException

Message: 对路径“d:\freehost\***\web\bbs\cache\scheduleeventfaildlog.config”的访问被拒绝。

StackTrace: 在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
在 Discuz.Forum.ScheduledEvents.EventLogs.WriteFailedLog(String logContent)
在 Discuz.Forum.HttpModule.ScheduledEventWorkCallback(Object sender)
在 System.Threading._TimerCallback.TimerCallback_Context(Object state)
在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
在 System.Threading._TimerCallback.PerformTimerCallback(Object state)

===================================

日志中很明显的指出了具体出错的程序文件和出错原因。既然是访问被拒绝,那么我们只要把这个文件设置成权限都允许就可以了。由于运行虚拟主机的服务器权限设置的是比较死的,网站权限都是能少则少,所以会碰到部分程序不适应的情况。建议程序开发商还是能考虑到虚拟主机服务器的这点要求,尽量设计出更加合理的程序来,以减少这种错误的出现。

返回行业资讯