首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IIS8 RewriteModule / URLRewrite极慢

IIS8 RewriteModule / URLRewrite极慢
EN

Stack Overflow用户
提问于 2017-07-07 13:36:24
回答 2查看 1.3K关注 0票数 0

我在Windows 2012上运行一个带有IIS8的网站。我正在试图确定什么是IIS造成的高CPU使用率(通常是IIS占用了50%或更多CPU )。服务器一天内每秒接收大约40个请求,但可能每秒只有1-2个URL需要处理。

我启用了请求跟踪,发现一些RewriteModule请求花费了超过100秒(!)来完成。我很难确定这在一台拥有超过足够硬件的机器上是如何可能的。在不到一秒钟的时间内,通过Apache上的mod_rewrite处理完全相同的URL结构。

一个示例URL如下所示:

代码语言:javascript
复制
http://<domain-name>/Product/<Parent-Category>/<Child-Category1>/<Child-Category2>/<Child-Category3>/<Product-Name>

伴随的重写规则是:

代码语言:javascript
复制
<rule name="Rule" stopProcessing="true">
      <match url="^Product/([^/\?]+)/?([^/\?]+)?/?([^/\?]+)?/?([^/\?]+)?/?([^/\?]+)?/?([^/\?]+)?/?[\?]?(.+)?$"/>
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
      </conditions>
      <action type="Rewrite" url="/Product/index.php?a={R:1}&amp;b={R:2}&amp;c={R:3}&amp;d={R:4}&amp;e={R:5}&amp;f={R:6}&amp;{R:7}" appendQueryString="true"/>
    </rule>

在定义匹配URL的方式中,是否存在导致处理时间较长的问题?一些匹配的urls包含大量字符,如果它们使用许多父/子类别(最多5个,通常为3-4)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-09 18:27:59

问题肯定在你的正则表达式中。最好的方法是尝试将其分割成不同的更具体的模式。

如果不是这样的话,这个规则应该保持相同的功能,并且工作得更快:

代码语言:javascript
复制
<rule name="Rule" stopProcessing="true">
  <match url="^Product/([^/]+)/?([^/]+)?/?([^/]+)?/?([^/]+)?/?([^/]+)?/?([^/]+)?"/>
  <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
  </conditions>
  <action type="Rewrite" url="/Product/index.php?a={R:1}&amp;b={R:2}&amp;c={R:3}&amp;d={R:4}&amp;e={R:5}&amp;f={R:6}" appendQueryString="true"/>
</rule>

我在您的regexp中删除了不必要的\?检查,因为<match url中的patter是在没有查询字符串的情况下检查URL,所以在regexp中进行?检查是多余的。

我检查了我的个人电脑,它的工作速度肯定更快,但您需要再次检查它是否保持相同的功能。

票数 1
EN

Stack Overflow用户

发布于 2017-07-10 13:18:39

我进行了广泛的测试,并将规则更改为以下内容。这导致CPU下降到1%,而之前的100秒钟完成时间下降到大约50 in。

我仍然不明白这是怎么可能的--这是一台4 CPU/8核机器,内存为48 it,IIS8花了100秒钟将一个70个字符串拆开,并将其与以前的正则表达式进行比较。除非前面的例子以某种方式创建了一个近乎无限的循环,否则我看不出它怎么会那么慢。

新规则:

代码语言:javascript
复制
<rule name="Rule" stopProcessing="true">
      <match url="^Product/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)?[/]?(.+)?$"/>
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
      </conditions>
      <action type="Rewrite" url="/Product/index.php?a={R:1}&amp;b={R:2}&amp;c={R:3}&amp;d={R:4}&amp;e={R:5}&amp;f={R:6}&amp;{R:7}" appendQueryString="true"/>
    </rule>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44972191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档