上一篇 下一篇 分享链接 返回 返回顶部

跨境电商如何在香港服务器上设置和利用 Windows Server 的 IIS 压缩功能,提升图片与商品详情页加载速度?

发布人:Minchunlin 发布时间:2025-09-10 11:08 阅读量:866


凌晨 1:40,香港机房的运营同事发来消息:‘主页稳了,但商品详情页在美国和欧洲打开还是慢。’我盯着 NOC 屏的 RTT 曲线,心里有数——这不是带宽不够,这是传输效率的问题。两分钟后,我远程进到那台跑 IIS 的 Windows Server,上了一杯便利店咖啡,开始把‘该开的压缩’都开起来。

这一篇,我就把那晚在香港机房给跨境电商站(.com 主站)做 IIS 压缩提速的完整过程写下来:从环境与硬件,到参数选择、脚本、web.config 配置、灰度验证、压测对比,以及现场踩过的坑。尽量写得新手能上手、老手也不嫌浅。

一、现场环境与目标

1)业务与流量画像

  • 站点类型:跨境电商(商品详情页 PV 占全站 62%)
  • 用户地域:美国西部、东南亚、欧洲(移动端占比 78%)
  • 页面特征:图片重 + JS/CSS 多 + 详情页 HTML 较长(存在大量富文本与 JSON 片段)

2)香港服务器与系统版本

项目 参数
机房 香港葵涌机房(直连多国际出口)
服务器 1U,Dual Intel Xeon Silver 4310(2×12C/24T,睿频 3.3GHz)
内存 128GB DDR4-3200
系统盘 960GB SATA SSD(OS)
数据盘 2×1.92TB NVMe(Raid-1 via Intel VROC),静态资源与站点
网卡 2×10GbE(Intel X710),内网走 LACP
OS Windows Server 2022 Datacenter(含 IIS 10.0)
Web IIS 独立 + 应用池 4 个(.NET + Node SSR 混合)
其他 前面挂 1 台硬件 SLB,后面有 2 台 IIS 做主备

备注:IIS 10 原生支持 gzip/deflate 压缩。Brotli 需额外模块或 CDN 侧压缩。本文先把 IIS 原生可控能力吃干榨尽,再讲“预压缩 + 回源”与 CDN 协同。

3)我们要解决什么

跨境链路 RTT 高(HK→US West 140~180ms 常态),必须减少传输字节。

详情页含大量 HTML/JSON/JS/CSS 文本资源,压缩收益高。

图片本身就压缩过(JPG/PNG/WebP);IIS 压缩对图片基本无益,但可通过缓存与分发策略降低加载时间。

目标:在不动业务逻辑的前提下,开启并优化 IIS 压缩,同时完善 缓存头/预压缩/HTTP/2,最终把首屏与详情模块的内容下载时间实打实降下来。

二、上手前:基线测量(你不测,你就不知道哪里慢)

测什么?

  • 典型详情页的 传输体积(HTML/JS/CSS/JSON)
  • 是否已压缩(Content-Encoding)
  • 海外节点的 首包时间/下载时间

快速办法:(Windows 终端用 curl.exe,Linux/macOS 亦可)

# 1) 看响应头是否已有压缩
curl.exe -I --http2 -H "Accept-Encoding: gzip, deflate, br" https://www.example.com/product/12345

# 2) 看某静态资源的体积与压缩情况
curl.exe -I --http2 -H "Accept-Encoding: gzip, deflate, br" https://static.example.com/assets/app.bundle.js

我的当时基线(未开启 IIS 压缩前,取美国西部节点):

资源 原始大小 压缩后大小(实测) Content-Encoding 备注
HTML(详情页) 86 KB 18 KB 无(那时未开) 大量富文本
app.bundle.js 1.21 MB 320 KB 构建未做 gzip / br
styles.css 310 KB 54 KB 规则较多
detail.json(接口) 62 KB 9 KB 商品属性/库存
图片总和 3.8 MB —— —— 多为 JPG/PNG

海外测速(US-West 4G,RTT 约 160ms):

指标 未启用压缩
首屏可交互(TTI) 5.7 s
HTML 完整下载 420 ms
JS/CSS 完整下载 2.3 s
详情主图可见 2.9 s

第一眼就知道:文本资源没压缩是大头。

三、开启并优化 IIS 压缩(系统级)

1)安装 IIS 及压缩组件

# 管理员 PowerShell
Install-WindowsFeature Web-Server -IncludeManagementTools
Install-WindowsFeature Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Logging, Web-Filtering
Install-WindowsFeature Web-Stat-Compression, Web-Dyn-Compression

2)全局开启压缩与关键参数

# 开启静态/动态压缩
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/urlCompression' -name 'doStaticCompression' -value 'True'

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/urlCompression' -name 'doDynamicCompression' -value 'True'

# 压缩级别(0-10)
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/httpCompression' -name 'staticCompressionLevel' -value 7

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/httpCompression' -name 'dynamicCompressionLevel' -value 4

# CPU 门限(动态压缩在高负载下自动让步,防止被压垮)
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/httpCompression' -name 'dynamicCompressionEnableCpuUsage' -value 60

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/httpCompression' -name 'dynamicCompressionDisableCpuUsage' -value 85

# 压缩临时文件目录(放到 NVMe)
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter 'system.webServer/httpCompression' -name 'directory' `
  -value 'D:\IIS_Compress_Temp'

经验值:静态 7、动态 4 是我们在 CPU 成本与收益之间的平衡点;动态图像接口少,主要压 HTML/JSON。

3)声明压缩/不压缩的 MIME 类型(很关键)

# 允许压缩:文本类
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/staticTypes" -name "." `
  -value @{mimeType='text/*';enabled='True'}

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/staticTypes" -name "." `
  -value @{mimeType='application/javascript';enabled='True'}

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/staticTypes" -name "." `
  -value @{mimeType='application/json';enabled='True'}

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/staticTypes" -name "." `
  -value @{mimeType='image/svg+xml';enabled='True'}

# 禁止压缩:已高压缩或不可压缩
foreach($mt in @('image/*','application/zip','application/pdf','application/octet-stream','font/woff2')){
  Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
    -filter "system.webServer/httpCompression/staticTypes" -name "." `
    -value @{mimeType=$mt;enabled='False'}
}

动态类型同理(HTML/JSON 等):

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/dynamicTypes" -name "." `
  -value @{mimeType='text/*';enabled='True'}

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/dynamicTypes" -name "." `
  -value @{mimeType='application/json';enabled='True'}

Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/httpCompression/dynamicTypes" -name "." `
  -value @{mimeType='*/*';enabled='False'}  # 兜底:默认不压

4)HTTP/2 与内核缓存

Windows Server 2022 + IIS 10,启用 TLS 后默认支持 HTTP/2(对首屏多资源并发与头部压缩 HPACK 有益)。

确认站点允许内核缓存(静态命中能绕过用户态,配合压缩缓存效率更高):

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/caching" -name "enabled" -value "True"

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' `
  -filter "system.webServer/serverRuntime" -name "enabled" -value "True"

四、站点级 web.config:让压缩与缓存更“听话”

以下片段放在站点根目录的 web.config(或在 IIS 管理器里 GUI 等效配置)。

<configuration>
  <system.webServer>

    <!-- 1) 压缩策略(覆盖/补充全局) -->
    <httpCompression 
        directory="D:\IIS_Compress_Temp"
        staticCompressionLevel="7"
        dynamicCompressionLevel="4"
        dynamicCompressionEnableCpuUsage="60"
        dynamicCompressionDisableCpuUsage="85">
      <scheme name="gzip" dll="%windir%\system32\inetsrv\gzip.dll" />
      <staticTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="application/javascript" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="image/svg+xml" enabled="true" />
        <add mimeType="font/woff2" enabled="false" />
        <add mimeType="image/*" enabled="false" />
        <add mimeType="application/pdf" enabled="false" />
        <add mimeType="*/*" enabled="false" />
      </staticTypes>
      <dynamicTypes>
        <add mimeType="text/*" enabled="true" />
        <add mimeType="application/json" enabled="true" />
        <add mimeType="*/*" enabled="false" />
      </dynamicTypes>
    </httpCompression>

    <urlCompression doStaticCompression="true" doDynamicCompression="true" />

    <!-- 2) 静态资源长缓存(对 /assets、/static 生效) -->
    <location path="assets">
      <system.webServer>
        <staticContent>
          <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
        </staticContent>
        <httpProtocol>
          <customHeaders>
            <add name="Cache-Control" value="public, max-age=31536000, immutable" />
            <add name="Vary" value="Accept-Encoding" />
          </customHeaders>
        </httpProtocol>
      </system.webServer>
    </location>

    <location path="static">
      <system.webServer>
        <staticContent>
          <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
        </staticContent>
        <httpProtocol>
          <customHeaders>
            <add name="Cache-Control" value="public, max-age=31536000, immutable" />
            <add name="Vary" value="Accept-Encoding" />
          </customHeaders>
        </httpProtocol>
      </system.webServer>
    </location>

    <!-- 3) 关闭 ETag(多机回源时间戳可能不同,避免 CDN/浏览器误判) -->
    <httpProtocol>
      <customHeaders>
        <remove name="ETag" />
      </customHeaders>
    </httpProtocol>

    <!-- 4) (可选)预压缩文件的智能回退:优先 .br,再 .gz,再源文件 -->
    <!-- 如果你做了预压缩,请打开这段;否则先跳过 -->
    <rewrite>
      <rules>
        <!-- JS -->
        <rule name="Serve .br for JS" stopProcessing="true">
          <match url="(.*)\.js$" />
          <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_ACCEPT_ENCODING}" pattern="br" />
            <add input="{REQUEST_FILENAME}.br" matchType="IsFile" />
          </conditions>
          <action type="Rewrite" url="{R:1}.js.br" />
        </rule>
        <rule name="Serve .gz for JS" stopProcessing="true">
          <match url="(.*)\.js$" />
          <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_ACCEPT_ENCODING}" pattern="gzip" />
            <add input="{REQUEST_FILENAME}.gz" matchType="IsFile" />
          </conditions>
          <action type="Rewrite" url="{R:1}.js.gz" />
        </rule>
        <!-- CSS 同理 -->
        <rule name="Serve .br for CSS" stopProcessing="true">
          <match url="(.*)\.css$" />
          <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_ACCEPT_ENCODING}" pattern="br" />
            <add input="{REQUEST_FILENAME}.br" matchType="IsFile" />
          </conditions>
          <action type="Rewrite" url="{R:1}.css.br" />
        </rule>
        <rule name="Serve .gz for CSS" stopProcessing="true">
          <match url="(.*)\.css$" />
          <conditions logicalGrouping="MatchAll">
            <add input="{HTTP_ACCEPT_ENCODING}" pattern="gzip" />
            <add input="{REQUEST_FILENAME}.gz" matchType="IsFile" />
          </conditions>
          <action type="Rewrite" url="{R:1}.css.gz" />
        </rule>
      </rules>

      <!-- 出站规则:为 .br/.gz 响应补充正确的 Content-Encoding -->
      <outboundRules>
        <rule name="Add CE for .br" preCondition="IsBrotli">
          <match serverVariable="RESPONSE_Content_Encoding" pattern=".*" />
          <action type="Rewrite" value="br" />
        </rule>
        <rule name="Add CE for .gz" preCondition="IsGzip">
          <match serverVariable="RESPONSE_Content_Encoding" pattern=".*" />
          <action type="Rewrite" value="gzip" />
        </rule>
        <preConditions>
          <preCondition name="IsBrotli">
            <add input="{REQUEST_URI}" pattern="\.br$" />
          </preCondition>
          <preCondition name="IsGzip">
            <add input="{REQUEST_URI}" pattern="\.gz$" />
          </preCondition>
        </preConditions>
      </outboundRules>
    </rewrite>

    <!-- 5) 让 IIS 认识 .gz/.br 的 MIME(供静态回源) -->
    <staticContent>
      <remove fileExtension=".gz" />
      <remove fileExtension=".br" />
      <mimeMap fileExtension=".gz" mimeType="application/octet-stream" />
      <mimeMap fileExtension=".br" mimeType="application/octet-stream" />
    </staticContent>

  </system.webServer>
</configuration>

说明:如果你不开“预压缩文件回源”,只用 IIS 在线压缩,也能拿到 70% 左右的字节节省。但预压缩 + 智能回退对高并发、CPU 受限场景特别友好。

五、(可选)构建阶段预压缩:PowerShell 一把梭

我们把前端构建产物(/assets、/static)在 CI/CD 阶段直接生成 .br 与 .gz,放进发布包。Windows Server 2019/2022 自带 .NET 4.8,可用 System.IO.Compression 直接搞定。

# Compress-Static.ps1
param(
  [string]$Root="D:\site\static",
  [string[]]$Patterns=@("*.js","*.css","*.json","*.svg","*.xml","*.txt")
)

Add-Type -AssemblyName System.IO.Compression.FileSystem
Add-Type -AssemblyName System.IO.Compression

function Compress-Gzip($inPath,$outPath){
  $fsIn = [System.IO.File]::OpenRead($inPath)
  $fsOut = [System.IO.File]::Create($outPath)
  $gz = New-Object System.IO.Compression.GZipStream($fsOut,[System.IO.Compression.CompressionLevel]::Optimal)
  $fsIn.CopyTo($gz); $gz.Dispose(); $fsIn.Dispose(); $fsOut.Dispose()
}

function Compress-Brotli($inPath,$outPath){
  $fsIn = [System.IO.File]::OpenRead($inPath)
  $fsOut = [System.IO.File]::Create($outPath)
  $br = New-Object System.IO.Compression.BrotliStream($fsOut,[System.IO.Compression.CompressionLevel]::Optimal)
  $fsIn.CopyTo($br); $br.Dispose(); $fsIn.Dispose(); $fsOut.Dispose()
}

foreach($p in $Patterns){
  Get-ChildItem -Path $Root -Recurse -Filter $p | ForEach-Object {
    $gz="$($_.FullName).gz"
    $br="$($_.FullName).br"
    if(!(Test-Path $gz)){ Compress-Gzip $_.FullName $gz }
    if(!(Test-Path $br)){ Compress-Brotli $_.FullName $br }
  }
}
Write-Host "Pre-compress done."

跟上面 web.config 的重写规则配合,浏览器优先拿 .br,不支持再拿 .gz,都不行就回源。IIS 减少在线压缩 CPU 消耗。

六、图片怎么办?(压缩对图片没用,但我们可以让图片“更快”)

  • 不对 JPG/PNG/WebP 做 IIS 压缩(已高压缩,收益小还耗 CPU)。
  • 强缓存 + CDN:给 /img/ 路径打长期缓存(文件名带 hash),CDN 边缘命中率高。
  • 响应 Range:IIS 默认支持断点续传;对大图/视频,浏览器可并行按需取。
  • 自动降级 & 响应式:前端 <img srcset> / <picture> 提供多分辨率,移动端拿更小图。
  • WebP/AVIF 产线:构建或异步生成多格式(AVIF/WebP/JPG),通过 UA/Accept 或前端逻辑选择。

我们在 IIS 的图片路径上只做缓存与头部:

<location path="img">
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="90.00:00:00" />
    </staticContent>
    <httpProtocol>
      <customHeaders>
        <add name="Cache-Control" value="public, max-age=7776000, immutable" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</location>

七、上线与验证:别一把梭,先灰度

1)灰度思路

IIS 站点复制:一台机器开两个站点(www / www-canary),端口或主机头区分。

SLB 把 5% 海外流量打到 canary。

Prometheus/PerfMon 监控:CPU、IIS 压缩命中、吞吐、5xx。

2)快速校验命令

# 必须看到 Content-Encoding: gzip 或 br
curl.exe -I --http2 -H "Accept-Encoding: gzip, deflate, br" https://canary.example.com/product/12345

# 体积对比(以 JS 为例)
$raw = (curl.exe -s https://canary.example.com/assets/app.bundle.js | Measure-Object -Character).Characters
$gz  = (curl.exe -s -H "Accept-Encoding: gzip" https://canary.example.com/assets/app.bundle.js | Measure-Object -Character).Characters
"$raw -> $gz"

八、实测结果(对同一款详情页)

美国西部 4G,RTT≈160ms,Chrome:

指标 优化前 优化后(仅 IIS 压缩) 优化后 + 预压缩(br/gz)
HTML 传输(大小/Content-Encoding) 86 KB / 无 18 KB / gzip 14 KB / br
app.bundle.js 1.21 MB / 无 340 KB / gzip 270 KB / br
styles.css 310 KB / 无 58 KB / gzip 46 KB / br
detail.json 62 KB / 无 10 KB / gzip 8 KB / br
首屏可交互(TTI) 5.7 s 4.3 s 3.7 s
JS/CSS 完整下载 2.3 s 1.2 s 0.9 s
详情主图可见 2.9 s 2.3 s 2.1 s
IIS W3WP CPU 峰值 38% 46% 41%

解释:仅 IIS 在线压缩时 CPU 会升一点(可以接受);**加上“预压缩”**后,CPU 又回落,同时体积更小(br 更优),海外端到端体验最佳。

九、线上坑与现场解决

CPU 突刺
大促时动态压缩会把 CPU 冲上去。我们靠 dynamicCompressionEnableCpuUsage=60 / Disable=85 兜住;另外只让 HTML/JSON 动态压,避免把一切都丢给压缩器。

杀毒/EDR 锁住压缩临时目录
某次发现 IIS_Compress_Temp 下文件句柄被占,W3WP 报错。把目录加进安全软件白名单,问题解决。

CDN 复用与回源
CDN 默认会携带 Accept-Encoding 回源,有的边缘把 gzip 直接透传给用户。这没问题,但务必加 Vary: Accept-Encoding,否则 CDN 缓存键不区分编码,可能错配。

ETag 与多机一致性
多台 IIS 的文件时间戳不一致,会导致 ETag 不同,CDN 命中率下降。我们直接移除 ETag,靠 Cache-Control + Hash 文件名 保证一致性。

错误地压缩图片
初期误把 image/* 加进了动态类型,CPU 抖且收益为零。回滚后一切恢复。

HTTP/2 被意外关闭
某次组策略更新把 TLS 套件改了,HTTP/2 退化为 HTTP/1.1。对比头部与并发后迅速定位,恢复 TLS 配置后 HTTP/2 正常。

十、建议的参数与 SOP(可直接复用)

推荐参数(起步即用)

  • staticCompressionLevel=7、dynamicCompressionLevel=4
  • dynamicCompressionEnableCpuUsage=60、Disable=85
  • 允许压缩:text/*、application/javascript、application/json、image/svg+xml
  • 禁止压缩:image/*、font/woff2、application/pdf、application/zip、application/octet-stream
  • Vary: Accept-Encoding,Cache-Control: public, max-age=31536000, immutable(静态资源路径)
  • 预压缩:构建阶段产出 .br/.gz,用重写规则智能回退
  • 监控:CPU、请求数、压缩命中率、5xx、平均响应体积

上线 SOP

  • 基线测量(体积/编码/TTI)。
  • 系统级开启压缩 + 类型白/黑名单。
  • 站点 web.config 下发缓存与头部。
  • 小流量灰度 + 海外节点验证。
  • 开启预压缩(CI/CD 脚本)+ 重写规则。
  • 放量,观察 CPU 与 5xx。
  • 复盘与参数微调。

十一、FAQ:几条常被问到的话

要不要上 Brotli 模块?
IIS 原生不带 Brotli 在线压缩。你可以用预压缩的 .br 文件 + 上面的规则,已经够香;或者把 Brotli 放到 CDN 边缘做,性价比更高。

对 API 接口有副作用吗?
一般没有。注意只给 application/json 开启动态压缩,并确保你的客户端/中间层都能处理 Content-Encoding。

图片还能不能更快?
可以:CDN 近源、多分辨率/格式、懒加载、骨架屏、HTTP/2 优先级/Preload 都能叠加。

十二、收尾:凌晨 3:05 的 NOC

“3:05,我又刷了一次美国西部的链路。TTI 从 5.x 掉到 3.x,运营群里大促转化率曲线开始上扬。窗外货梯还在上上下下,机房的风依旧冷,但我知道这波压缩、缓存、预压缩和 HTTP/2 的组合拳,算是打对了。”

这篇笔记写到这里,不是炫技,是想让你在类似的跨境场景里,有一套可复制的 IIS 提速方案:先测量 → 开压缩 → 明确类型 → 配缓存 → 预压缩 → 灰度验证 → 观察调参。
当你也在香港的夜里守着那几台服务器时,希望这份流程能让你少走弯路,多睡一会儿。

附:一键初始化脚本(合并常用设置)

# Init-IIS-Compression.ps1
$compressTemp="D:\IIS_Compress_Temp"
New-Item -Path $compressTemp -ItemType Directory -Force | Out-Null

Install-WindowsFeature Web-Server -IncludeManagementTools
Install-WindowsFeature Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Logging, Web-Filtering
Install-WindowsFeature Web-Stat-Compression, Web-Dyn-Compression

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/urlCompression' -name 'doStaticCompression' -value 'True'
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/urlCompression' -name 'doDynamicCompression' -value 'True'

Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/httpCompression' -name 'staticCompressionLevel' -value 7
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/httpCompression' -name 'dynamicCompressionLevel' -value 4
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/httpCompression' -name 'dynamicCompressionEnableCpuUsage' -value 60
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/httpCompression' -name 'dynamicCompressionDisableCpuUsage' -value 85
Set-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter 'system.webServer/httpCompression' -name 'directory' -value $compressTemp

# Static types allow / deny
$allow=@('text/*','application/javascript','application/json','image/svg+xml')
$deny=@('image/*','font/woff2','application/pdf','application/zip','application/octet-stream')

foreach($mt in $allow){
  Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/httpCompression/staticTypes" -name "." -value @{mimeType=$mt;enabled='True'}
}
foreach($mt in $deny){
  Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/httpCompression/staticTypes" -name "." -value @{mimeType=$mt;enabled='False'}
}

# Dynamic types
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/httpCompression/dynamicTypes" -name "." -value @{mimeType='text/*';enabled='True'}
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/httpCompression/dynamicTypes" -name "." -value @{mimeType='application/json';enabled='True'}
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -filter "system.webServer/httpCompression/dynamicTypes" -name "." -value @{mimeType='*/*';enabled='False'}

Write-Host "IIS compression baseline configured."

用这套基线 + 上文 web.config 与预压缩脚本,你基本就具备了跨境电商在香港 IIS 提速的实战兵器库。

目录结构
全文