网络上有关iis的问题和相关解决方案,多不胜搜,但很多都比较零散,没有系统的解决方案;另外,有些解决方法,似是而非,不能找到其中的问题关键点,本人平时对于服务器的应用上也有点实践,因此,今天稍稍总结一点平时遇到地问题和解决方法,特别是对iis的特殊权限引起问题、iis应用程序池假死问题和比较罕见的iis重启命令和自动重启办法。其它相关问题,继续关注本博。 一、2003应用程序池自动死了,不能恢复了,一直出现 Service Unavailable 常见方法如下。 1:没有打SP1补丁的时候会出现这个IIS6.0假死问题,但现在微软都在自动更新里面出补丁了,一般你打好最新补丁后是不会出现此问题了。(所以现在的IIS假死与这个关系不是很大) $ l% }) @6 L4 n0 V5 ]2:从IIS6.0开始CPU资源都在应用池里面限制了,不象以前的IIS.5。所以假死的池的缘故就是池被拉死,你在网站打不开的时候可以看到你的某个应用池是禁用的,上面出现一个红叉。你鼠标右键启动网站又会自动恢复。 这个原因:大概是以下几个因数造成的。 (1):你限制了应用池的资源,限制得太小 比如:50这样或更少更多一点,这个时候如果你这个池下面的网站占用CPU太高,比如超过50% 那么5分钟后他就自动死了,手工默认建立的应用池默认是超过资源不操作。 (2):内存限制 在IIS6.0应用池上面有虚拟内存和最大内存限制,如果你设置了这个。那么网站访问量大了 也会出现假死,所以不建议设置这里。默认就可。 3:就是服务器自身内存太小,网站运行当然需要使用到内存了,当内存不够的时候应用池也会死掉变成禁用。那么只有等内存全部释放出来才能恢复应用池了。出现这个情况:那么你就要考虑加内存或者检查到底是什么程序占用了内存了。比如MSSQL数据库,这个可是吃内存得大户啊,最好别和WEB服务器同时一个服务器上。很多人用1G内存做 2003系统,2003NET结构是很占用内存的,所以做服务器选2003还得把内存加到2G或更高才好。 内存不够上面 2点讲到的,是没办法操作了,也无法自动恢复。 * F0 R ?3 y. z& b4:就是ACCESS数据库太大或查询太多,这个也会出现把IIS拉死,解决方法;修复ACCESS数据库,或尽量少用ACCESS数据库,升级至sqlserver数据库;或者在技术方面革新,像现在有些网站系统,风讯、动易等cms;pjblog、zblog等博客程序,都支持生成静态功能. 5:不同网站用不同应用池:根据你自己实际情况而定,站点大的最好独立一个应用池,限制他的资源超过了自动回收,看上面(1)讲到的,这样就不影响其他站点。中型站点:多个网站共用一个应用池,比如5个站点用一个池,设置他资源时间等等。这样他们就算超资源了也不影响其他应用池的网站。 " p: O" B* m3 f7 f, u$ S6:设置回收时间:很多人以为设置回收池越短越好,其实是错误的,每次回收当然是把内存回收回来了,但加重了一次服务器的负担,当服务器比较繁忙的时候,有可能导致其他应用池死。所以建议设置共1000就行了。其他独立池按照他网站流量而设置 可以设置600 也行,共用的不建议设置太短。 7:网站后台过不了多久自动退出又要重新登陆:这个情况就是你设置回收时间太短了,按照 6点设置吧。 不要设置什么20分、30分这样的,这样不好的。另外一个原因就是和站的响应设置时间有关,设置得稍长些。 # X! P; M# {1 m8:windows 2003系统iis6访问本机的站点时提示“Service Unavailable”; 用事件查看器查看系统错误日志,发现如下提示: 解决方法,给NETWORK SERVICE 加上访问iis服务的权限,具体方法如下: * H& D) g1 A1 e2 ~; s+ E7 v; I点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项, 9:重启IIS中的特定应用程序池命令和自动重启的方法 6 v. w3 a- i$ C1 s在操作系统是Windows server 2003 SP1+的情况下,可以用以下命令部分重启IIS应用程序池: |
在系统中IIS日志中发现:
- X+ u- I, z5 s, w! N1 w8 e' g$ b. n应用程序:ISAPI ’C:\WINDOWS\system32\inetsrv\asp.dll’ 报告它自身有问题,原因如下: ’ASP 不正常,因为执行请求的 100% 被挂起,而且请求队列已经使用了 0%。’。
关于server 2003+IIS6 出现 ’ASP 不正常,因为执行请求的 100% 被挂起
现象如下:
站点无法打开,或者打开很慢.HTML可以打开.重新启动或者回收应用程序池可恢复.但过一段时间又会出现
日志里会有:
ISAPI ’C:\WINDOWS\system32\inetsrv\asp.dll’ reported itself as unhealthy for the following reason: ’ASP unhealthy because 100% of executing requests are hung and 6% of the request queue is full.’.
或者:
ISAPI ’C:\WINDOWS\system32\inetsrv\asp.dll’ 报告它自身有问题,原因如下: ’ASP 不正常,因为执行请求的 100% 被挂起,而且请求队列已经使用了 0%。’。
解决方法:
( P& j# A7 r; V; }' U1.asp是否正确映射到’C:\WINDOWS\system32\inetsrv\asp.dll’
" C# n2 X$ Z' F& W2.一般来讲,是由于在同属IIS的应用程序池出现了某个站ASP代码错误所致,使得内存耗尽,检查代码本身的问题.可以隔离到单独应用程序池调试
3、减少应用程序池回收时间。默认为:1740。。可设为120(每2小时)
IIS假死的原因:
% L" e% V& |0 H: D打开IIS 你就会看到应用程序池,默认只有一个应用程序池,查看应用程序池的属性,会发现他的回收时间,默认多达,1740分钟,就是说,需要在1740分钟后才回收此应用程序池,如果在这个时间内,达到请求的最高限制,那么就会出现ASP假死的情况,这个就是大型网站出现假死的情况,反而,小型网站确不会出现这样的情况,因为他请求少,流量少,还没达到限制数量。当然要看你的服务器上网站数目而定。
以下是解决方法:
资料一
' a# t9 ?( A4 g6 a( H! B$ | 单个网站解决方法:
把应用程序池回收时间缩短到300-600分钟,其间回收过程中,需要占用一点CPU资源,没办法,为了稳定性,再把回收时间设为凌晨5点。
多网站解决方法:
& t0 @& u1 S& U& v! g视服务器网站的多少,新建多个应用程序池,把每个池回收时间缩小到300分钟,然后再分配每个池10个网站左右(这个分配是要求你的网站访问量所定)如果某个网站,访问量大,就单独给他一个程序池,但是这样做的后果就是需要大内存,一个池现在占用我120M内存左右,反正内存大,没关系,
那么多网站如何分配应用程序池,打开IIS--查看你要分配的网站属性,查看主目录--在下面你就会看到应用程序池了,分配一个就行了。
" w4 q9 \; a5 k资料二
大家在使用iis6时..如果装了动网论坛.肯定有出现过iis6假死现像..就是asp网页打开慢..但是iis却是正常的..静态网页打开速度一样..这时候..我一直是重启的方法..查了官方的资料结果没有...据官方资料说..win2003很快就要打这个补丁了..是iis6对access驱动支持不理像..也算是一个bug吧..由于我的服务器虚拟主机多..而且大多支持asp..如果一旦假死就无法运行..在多方面的资料查找下..找到了一个比较简单的方法..具体我测试是通过了..iis6自带数据应用程序池..现在就利用他来解决假死..
首先把bbs设一个单独的目录..然后点击应用程序池..新建应用程序池.输入应用程序池id..
然后把bbs的虚拟目录下面的.就用程序池..选择刚才新建的应用程序池...
- b7 s3 q& N, G+ O5 X* F& j然后再回到刚才设好的应用程序池...点击..属性...把回收工作进程数(分钟)及回收工作进程数还有在下列时间回收时间进程勾上..然后在下列时间回收程序池里左边添加..选择一个时间..一般来说..网站到凌晨3点的时候.基本人都很少了..这时回收一下bbs的进程数..就可以解决了iis假死的现像..
当然还可以配置其他信息..比如说iis6的用户名.. 我们可以打开计算机管理..然后打开计算机用户管理..添加一个用户..设置好后..在应用程序池里面..标识..把添加的用户放上去..用用户来测试回收的进程..当然还有..其他配置..其实很简单..只要好好看一下..就能明白意思...
也可以借助专用的工具来回收应用程序池..这样方便而且快捷..iis的备份.虚拟主机ip的统一修改及端口访问的ip记录..用批处理是一个很简单又方便的方法.所以.把一台服务器做的安全..并不是哪么容易的事..特别是iis..经常去官方网站搜索资料是一个好习惯..还有就是经常性的访问日志..及注册表的用户还有加载运行的程序.及服务也是一个好方法.
如果 Microsoft Internet 信息服务 (IIS) 6.0 中没有正确地配置用于虚拟服务器的应用程序池,就可能会发生此问题。此问题可能会在存在下列一种或多种情况时发生: ?应用程序池没有运行。 解决方案 请按照下列步骤来确定虚拟服务器正在使用的应用程序池。 a. 单击“开始”,指向“管理工具”,然后单击“Internet 信息服务 (IIS) 管理器”。 为虚拟服务器配置的应用程序池列在“应用程序池”框中。 2.验证应用程序池帐户使用的密码是否正确。IIS 不会自动轮询 Active Directory 目录服务中的密码更改。如果应用程序池帐户是一个域帐户,其密码已过期,则在为此帐户重新指定一个新密码后,您可能会收到本文“症状”部分所描述的错误信息。 ! y2 T/ i( b( w- p7 v2 s8 k% r请按照下列步骤来验证应用程序池帐户所用的密码是否正确: a. 在 Internet 信息服务 (IIS) 管理器中,展开“应用程序池”。 3.验证应用程序池帐户是服务器上的 IIS_WPG 组和 STS_WPG 组的成员。 验证 IIS_WPG 和 STS_WPG 是否都出现在“成员属于”列表中。如果其中之一没有列出或者两者均未列出,请根据具体情况将 IIS_WPG 组、STS_WPG 组或者这两个组添加到列表中。 b. 在域控制器上安装了 SharePoint Portal Server 的情况下: 1.启动“Active Directory 用户和计算机”。 验证 IIS_WPG 和 STS_WPG 都出现在“成员属于”列表中。如果其中之一没有列出或者两者均未列出,请根据具体情况将 IIS_WPG 组、STS_WPG 组或者这两个组添加到列表中。
点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM(配置)”选项,选择其下的“IIS ADMIN SERVICE”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“NETWORK SERVICE ”,给该帐号赋予“本地启动”和“本地激活”的权限即可。 |
2 E- l. j8 n0 ^3 N$ h3 |; A1 \
今天机器上IIS突然出现问题,无法解析ASP文件,只能打开HTM文件。着实让偶郁闷了半天,查了N多资料,后发现病因,解决成功,娃哈哈 ^_^
备注:一定要按第一种解决方案卸载msdtc并删除注册表中三处,否则再按第二种方案执行时,其三步中的最后一步无法成功。
今天很开心,发现出现问题时不要郁闷,仔细查找资料,查明原因解决后,心情不要太好哦,嘿~
==============================================================
现引用各高手心得,收藏: + K: ? K0 M3 f+ y7 v0 p
) G, M1 v& ~& W
8 j l. \ ]! s s( Q" x
2 e! \6 s9 A! C% J
一、com+应用程序错误 1、首先进入组件服务,查看组件服务/计算机/我的电脑/COM+应用程序,结果报错“COM+ 无法与 Microsoft 分布式事务协调程序交谈”,无法查看里面的对象。 二、IIS 500内部错误之解决办法
IIS 500内部错误之解决办法(一.错误表现) 一.错误表现 (一)IE中的表现 当浏览以前能够正常运行的asp页面时会出现如下的错误: C+ o# ~. h+ P T2 b" v7 i(1) --------------------------------------------- . A' G- ]; ?6 f请尝试下列操作: 打开 http://127.0.0.1 主页,寻找指向所需信息的链接。 HTTP 500 - 内部服务器错误 -------------------------------------------------------------------------------- 3 Y; Q! V6 n4 S3 @1 Y X技术信息(支持个人) ; ?3 P& Z- J; q0 ?/ {, j详细信息: [注意,这儿只是500错误,不是500.xx等错误的,那些错误主要是asp编程问题,与iis没有太大的关系,只有500错误是由iis自身造成的] s8 Z& N7 F) ](2) (二)安全日志记录(2条)
注:IWAM_MYSERVER,启动进程之外的应用程序的 Internet 信息服务的内置帐号,安装IIS时自动建立,其密码由IIS控制. - N& ^2 w" W- b3 I- u/ I+ }(三)系统日志中的记录(2条) 事件类型: 警告 注:3D14228D-FBE1-11D0-995D-00C04FD919C1}实际是IIS Out-Of-Process Pooled Applications 的KEY.也就是代表IIS Out-Of-Process Pooled Applications. 出现IIS 500内部错误的原因有多个,但最主要的原因是IWAM_MACHINE账号在Active Directory(或SAM),IIS的metabase数据库与COM+组件中的密码不匹配不同步最成的.因此解决问题的关键在于使这三方的密码同步起来. 操作如下: 系统会显示: 提示密码更新成功. , F* e& q9 r& j3 L3 S3 T& k通常情况下IIS会自动与系统账号等信息同步,但我发现我的机器上ISUR_MACHINE是同步的,但IWAM_MACHINE总是不同步,因此只好自行修改了. ! L: {. j' s- J; `7 B: U, j3.同步COM+账号密码 -v参数是打开详细模式,让我们看到更新的过程,通常会如下显示: & ` F) G) p8 r& c! D! U5 V0 X9 XMicrosoft (R) Windows Script Host Version 5.6 WamUserNameIWAM_MYSERVER Out of process applications defined: Updating Applications: 密码同步成功.如果不成功先看一下这个脚本取的IIS的密码正确不正确,如果不正确请重复第二步同步IIS密码 |
有个朋友说过这个问题,但看不懂。
==(补充修改版)26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法== 2004-11-20 补充最新修改版,使用Unicode的字符代码,而不是非unicode(负数值,有时会出错)代码
Y8 A' X# g. M: p7 R. A! k) O- E0 F9 _ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ 当字段内包含了这26个日文字符任意一个多个时,就会导致在执行SQL语句中包含了 [字段] like '%aaaaa%' 或 inStr(1,[字段],'aaaaa',1)>0 这样的查询时,毫无道理的出现了 "Microsoft JET Database Engine 错误 '80040e14' 内存溢出"的错误 其他Jet SQL函数命令未作测试,大概与字符搜索定位匹配相关的都可能出错 搜索相关资料得知被微软工程师证实是Access的bug,可能是语法关系都是微软的东东在vbs中 执行inStr(1,日文平假名变量,"aaaaa",1)依然要出现错误 Microsoft VBScript 运行时错误 错误 '800a0005' 无效的过程调用或参数: 'instr' 没有搜索,因这几个字符出现Access的论坛网站搜索无法进行,何等痛苦昨天一朋友大叫怪事,他的音乐数据库无法搜索了,只有30000条记录时是好的毫无疑问,日文片假名是祸根,花几分钟把有包含上面的日文替换成"?"搜索顺利恢复找来论坛程序用户群最大的动网dvBBS AC版本 7.0SP2 版测试,同样有这个日文发帖后 导致无法搜索并且运行时出错的问题线上去搜索 '80040e14' 内存溢出" 的错误 多的是! 一简单有效的解决办法: 对这26个字符进行编码和解码,可能效率感觉不理想,测试下来问题不大,速度影响不是太大 编码: Function Jencode(byVal iStr) if isnull(iStr) or isEmpty(iStr) then Jencode="" Exit function end if dim F,i,E E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;") F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_ chrw(12466),chrw(12470),chrw(12472),chrw(12474),_ chrw(12485),chrw(12487),chrw(12489),chrw(12509),_ chrw(12505),chrw(12503),chrw(12499),chrw(12497),_ chrw(12532),chrw(12508),chrw(12506),chrw(12502),_ chrw(12500),chrw(12496),chrw(12482),chrw(12480),_ chrw(12478),chrw(12476)) Jencode=iStr for i=0 to 25 Jencode=replace(Jencode,F(i),E(i)) next End Function
解码:
) w5 O* f5 B/ J1 P: f' hFunction Juncode(byVal iStr) if isnull(iStr) or isEmpty(iStr) then Juncode="" Exit function end if dim F,i,E E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;") F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_ chrw(12466),chrw(12470),chrw(12472),chrw(12474),_ chrw(12485),chrw(12487),chrw(12489),chrw(12509),_ chrw(12505),chrw(12503),chrw(12499),chrw(12497),_ chrw(12532),chrw(12508),chrw(12506),chrw(12502),_ chrw(12500),chrw(12496),chrw(12482),chrw(12480),_ chrw(12478),chrw(12476)) Juncode=iStr for i=0 to 25 Juncode=replace(Juncode,E(i),F(i))'□ next End Function 注意,如果直接使用字符不方便(windows还没装日文支持),注释掉的部分提供有 chr(-23804) ..这样的定义 这样 1. 表单输入保存时,使用Jencode()将这26个字符先编码再保存(为什么是这26个字符,经过全部测试87个平假名89个片假名最终认定的) 如ゴ 即 chr(-23116) 编码为 Jn1; 2. 显示时,则使用 Juncode() 函数进行解码,还原日文片假名显示 3. 搜索关键字,也要使用 Jencode() 进行编码后再放入 like里 where [Topic] like '%Jencode(kewwords)%' 使用才能保证搜索的值和编码过的数据库字段内容匹配 ================================== PS: 也可以使用正则表达式来改写上面的两个函数,或许效率还要更高些再就是如果 压根不使用日文,也不需要搜索日文,则解码部分可以不用,保存数据实直接把这26个片假名字符替换为空字符或任一字符,比如"□" 抛砖引玉,如果有更本质的真正的好方法,谢分享 附: ---------------------------- 平假名87个 asc值 -23391 --> -23316 unicode 3040-309F ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん゛゜ゝゞ ------------------------------ 片假名89个 asc值 -23135 -> -23059 unicode 30A0-30FF ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶーヽヾ
================补充 修改的版本===========================
0 H3 K/ i0 X9 ]7 P4 p2 @9 I. L9 {3 K- x添加一个编码解码参数codeType 都使用一个函数使用chr()不直接使用日文字符这样~ 够简洁了吧?
9 z" ~0 P0 k# `9 f疑点: 显示日文是不会出错的,保存到数据库也不会出错只有SQL使用 like 和 inStr 的时候 才会出错 这个与显示无关!还有在vbs里使用 inStr(1,str,"aaa",1)这样按字符搜索也会错改为 inStr(lcase(str),"aaa") 就不会出错
. f+ s8 ^. K! E如果一定得用 inStr(1,str,"aaa",1) 字符搜索语法则一定要在先inStr() 后 jncode() 的顺序 否则会出错
4 e: z" o& J; W一点问题都没有! 注意到这几点绝对没错!
rs("TopicStr")=Jncode(TopicStr,true) 'encode 保存到数据库的资料 DisplayStr=Jncode(rs("TopicStr"),false) 'uncode '显示到页面的标题
Function Jncode(byVal iStr,codeType) if isnull(iStr) or isEmpty(iStr) or iStr="" then Jncode="" : Exit function end if dim F,i,E E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;",_ "Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;",_ "Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;",_ "Jn21;","Jn22;","Jn23;","Jn24;","Jn25;") F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_ chrw(12466),chrw(12470),chrw(12472),chrw(12474),_ chrw(12485),chrw(12487),chrw(12489),chrw(12509),_ chrw(12505),chrw(12503),chrw(12499),chrw(12497),_ chrw(12532),chrw(12508),chrw(12506),chrw(12502),_ chrw(12500),chrw(12496),chrw(12482),chrw(12480),_ chrw(12478),chrw(12476)) if codyType then for i=0 to 25 iStr=replace(iStr,F(i),E(i)) next else for i=0 to 25 iStr=replace(iStr,E(i),F(i)) next end if Jncode=iStr End Function
: W9 x) [8 D" F====================================================
! `5 S# h- L6 a ]$ [
我帮楼上的兄弟转过来 因为你的论坛有人发贴带日文了,解决方法有两个,最好是升级成MSSQL版就不会了,如果没条件换成MSSQL版的话,我的方法是(非官方): Query.asp文件 / t/ K$ Q; I' t. _. x找到(大概在353行附近) SqlColumn = SqlColumn &",HideName From dv_Topic Where "&searchboard&" Title like "&SearchUserID&" Order By TopicID Desc" 改成 'SqlColumn = SqlColumn &",HideName From dv_Topic Where "&searchboard&" Title like "&SearchUserID&" Order By TopicID Desc" ------------------------------------------------------------------------------------------ # y' x1 x2 H t" `找到(大概在456行附近) SqlColumn = SqlColumn & " From " & stable & " Where "&searchboard&" body like '%"&keyword&"%' Order By AnnounceID Desc" / q, g+ H! N! @) T% u1 j6 I6 u改成 4 G6 A6 m: m0 v" x, g1 a'SqlColumn = SqlColumn & " From " & stable & " Where "&searchboard&" body like '%"&keyword&"%' Order By AnnounceID Desc" |
由于查询内容中出现日文等数据库不支持的字符.导致Access数据库查询内存溢出!
此补丁已经修复了这个问题,请下载替换便可,安装说明见补丁包!
点击下载 update_v1.8jp.rar
Asp之ACCESS数据库遇日文时内存溢出的处理办法
欢迎光临 老秘网_材夜思范文 (http://caiyes.cn/) | Powered by Discuz! X3.4 |