Skip to content

IIS 安装与使用 ​

正式环境的所有网站统一由 Microsoft IIS 承载,不再运行 Nginx。公网使用标准 HTTP 80 和 HTTPS 443,并按域名分成三个独立站点:GM109.ZHIYESHI.CN、GM113.ZHIYESHI.CN、AH.ZHIYESHI.CN。HTTP 只负责跳转到 HTTPS。物理目录仍保留历史的 *.DIABLO2.COM.CN 名称,不随公网域名改名。109 主机保留独立的 GM109 源站,113/Web 主机按 Host Header 提供三个公网入口。不存在跨版本公共共享 API;后台自己的 /api/ 由登录会话保护。

论坛程序、附件、缓存、109/113 交易入口和两套独立 PHP 运行环境均位于 D 盘:

内容正式路径
phpwind 与论坛前端D:\AH.DIABLO2.COM.CN
109 论坛 PHPD:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php
113 论坛 PHPD:\AH.DIABLO2.COM.CN\forum-services\d2113\runtime\php
在线文档D:\AH.DIABLO2.COM.CN\docs
109 后台站点D:\GM109.DIABLO2.COM.CN
113 后台站点D:\GM113.DIABLO2.COM.CN

开始前 ​

  1. 使用管理员账号通过 RDP 登录目标服务器。
  2. 打开“开始”,搜索 PowerShell,右键选择“以管理员身份运行”。
  3. 确认 D 盘剩余空间至少是现有论坛目录的两倍。
  4. 保留 SSH 会话和 RDP 会话,直到所有网址验收完成。
  5. 若 DISM 显示 Enable Pending 或 Disable Pending,必须先重启完成待处理操作,再继续安装。
powershell
# 查看操作系统版本;本命令不修改系统。
cmd.exe /c ver
# 查看 IIS 核心功能状态;State 应为 Enabled,Pending 表示必须重启。
dism.exe /English /Online /Get-FeatureInfo /FeatureName:IIS-WebServerRole
# 查看 C、D 盘容量;FreeSpace 是剩余字节数。
Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID,Size,FreeSpace
# 查看 80 端口当前监听者;迁移后应为 PID 4/IIS HTTP.sys。
netstat.exe -ano -p tcp | findstr ":80"

安装 IIS 角色 ​

仓库部署器会自动执行本节。手工安装时,每一项功能都必须成功;不能只安装 IIS 管理器而漏掉 CGI、静态文件或脚本管理工具。

powershell
# 安装 IIS Web 服务器核心,不立即重启。
dism.exe /Online /Enable-Feature /FeatureName:IIS-WebServerRole /NoRestart
# 安装静态文件、默认文档和 HTTP 错误页。
dism.exe /Online /Enable-Feature /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-HttpErrors /NoRestart
# 安装 CGI/FastCGI,用于 PHP 5.6 x86 NTS。
dism.exe /Online /Enable-Feature /FeatureName:IIS-CGI /FeatureName:IIS-ISAPIExtensions /FeatureName:IIS-ISAPIFilter /NoRestart
# 安装请求筛选、日志和请求监控。
dism.exe /Online /Enable-Feature /FeatureName:IIS-RequestFiltering /FeatureName:IIS-HttpLogging /FeatureName:IIS-RequestMonitor /NoRestart
# 安装 IIS 管理器和 appcmd/脚本管理工具。
dism.exe /Online /Enable-Feature /FeatureName:IIS-ManagementConsole /FeatureName:IIS-ManagementScriptingTools /NoRestart
# 确认 appcmd 已存在;找不到时说明 IIS 安装不完整。
Test-Path "$env:windir\System32\inetsrv\appcmd.exe"

安装 URL Rewrite 与 ARR ​

后台是 Node.js 服务,IIS 使用 URL Rewrite 2.1 和 Application Request Routing 3 反向代理。ARR 依赖 URL Rewrite,安装顺序不能颠倒。只使用部署包 runtime-dependencies 中经过校验的微软 x64 MSI。

powershell
# 静默安装微软 URL Rewrite 2.1;执行完等待进程退出。
Start-Process msiexec.exe -Wait -ArgumentList '/i D:\install\rewrite_amd64_en-US.msi /qn /norestart'
# 在 Rewrite 安装完成后静默安装 ARR 3。
Start-Process msiexec.exe -Wait -ArgumentList '/i D:\install\requestRouter_amd64.msi /qn /norestart'
# 确认 RewriteModule 已注册。
& "$env:windir\System32\inetsrv\appcmd.exe" list modules | Select-String 'RewriteModule'
# 确认 ARR proxy 配置节存在。
& "$env:windir\System32\inetsrv\appcmd.exe" list config /section:system.webServer/proxy

ARR 只做反向代理,不启用磁盘缓存。部署器设置 enabled=true、preserveHostHeader=true,并保持后端 Node 端口只监听 127.0.0.1。

Windows Server 2008 R2 的 IIS 7.5 不能直接使用 ARR 3 安装包中的十六进制 int64 架构默认值,而且 32 位 PHP 应用池还需要 x86 ARR 模块。自动部署器已内置经过校验的 IIS 7 兼容架构文件和 x64/x86 两套模块,并直接修改结构化 IIS 配置,不依赖目标机 PowerShell。新手不要手工替换 applicationHost.config 或 ARR DLL;使用本页“自动部署”命令即可。

论坛应用需要在各自 web.config 中声明独立 PHP FastCGI 映射。部署器会把 system.webServer/handlers 的委派状态设为 Allow。若遗漏这一步,IIS 7.5 会返回 500.19 和错误码 0x80070021。

站点和应用池 ​

正式名称来自 deploy\realms\catalog.json,不要在 IIS 管理器中临时改名。

主机IIS 站点绑定应用
109GM109.ZHIYESHI.CN*:80:GM109.ZHIYESHI.CN反代 127.0.0.1:4139
113GM109.ZHIYESHI.CN*:80:GM109.ZHIYESHI.CN转发到独立 109 源站
113GM113.ZHIYESHI.CN*:80:GM113.ZHIYESHI.CN反代 127.0.0.1:4143
113AH.ZHIYESHI.CN*:80:AH.ZHIYESHI.CNphpwind、交易、自助服务和 /docs/
113CNBN-IP-Compatibility*:80:、*:443:80 兼容跳转;443 按 Host 分流三个公网域名
113AH.ZHIYESHI.CN-Internal127.0.0.1:4087D2GS/API 内部论坛调用

论坛使用两个 32 位、无 CLR 应用池:CNBN-Forum-109 和 CNBN-Forum-113。两个 PHP 可执行文件、php.ini、日志、内部令牌和 FastCGI 环境变量完全分离。禁止把 d2109 与 d2113 指向同一个 PHP 可执行文件。

服务器是 IIS 7.5,不支持 SNI,因此三个业务站点不能分别声明 *:443:<域名>。部署器只在 CNBN-IP-Compatibility 上建立一个 *:443: 入口,并让 HTTP.sys 绑定一张同时包含三个域名的 SAN 证书;TLS 握手完成后,URL Rewrite 再按 Host 转发到 109 后台、113 后台或论坛内部站点。该入口只负责 TLS 和分流,三个目录、后台进程、PHP 环境与配置仍完全独立。不要在 IIS 管理器中手工给三个站点追加 HTTPS binding。

powershell
# 列出 IIS 站点和绑定;核对 109 或 113 主机应有的站点。
& "$env:windir\System32\inetsrv\appcmd.exe" list site
# 列出应用池;论坛两个池应存在并启动。
& "$env:windir\System32\inetsrv\appcmd.exe" list apppool
# 列出 FastCGI 配置;应显示 D 盘的两个不同 php-cgi.exe。
& "$env:windir\System32\inetsrv\appcmd.exe" list config /section:system.webServer/fastCgi
# 查看 IIS 服务状态;WAS 和 W3SVC 都应为 RUNNING。
sc.exe query WAS
# 再查看网站发布服务状态。
sc.exe query W3SVC

PHP 5.6 配置 ​

论坛是旧版 PHPWind,使用经过验证的 PHP 5.6.40 x86 NTS。PHP 已停止官方安全更新,因此只允许 IIS FastCGI 调用,不创建公网 FastCGI 端口,也不手工启动 php-cgi.exe -b。

两个 php.ini 至少配置:

参数值
cgi.force_redirect0
cgi.fix_pathinfo1
fastcgi.impersonate1
fastcgi.logging0
date.timezoneAsia/Shanghai
powershell
# 检查 109 PHP 的版本、架构和配置文件。
D:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php\php.exe -c D:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php\php.ini -i | Select-String 'PHP Version|Architecture|Loaded Configuration File'
# 检查 109 PHP 的 MySQL 扩展。
D:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php\php.exe -c D:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php\php.ini -m | Select-String 'mysql|mysqli'
# 检查 113 PHP 的 MySQL 扩展。
D:\AH.DIABLO2.COM.CN\forum-services\d2113\runtime\php\php.exe -c D:\AH.DIABLO2.COM.CN\forum-services\d2113\runtime\php\php.ini -m | Select-String 'mysql|mysqli'
# 检查 109 论坛入口语法,不执行页面业务。
D:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php\php.exe -n -l D:\AH.DIABLO2.COM.CN\d2109\d2109.php
# 检查 113 论坛入口语法,不执行页面业务。
D:\AH.DIABLO2.COM.CN\forum-services\d2113\runtime\php\php.exe -n -l D:\AH.DIABLO2.COM.CN\d2113\d2113.php

自动部署 ​

先预演,再正式应用。首次迁移或 IIS 功能处于 Pending 时允许受控重启;113 主机重启会短暂中断 109 VIP GS,脚本会在服务器返回后继续并检查 109 双国度拓扑。

powershell
# 进入源码工作区。
Set-Location C:\D2113server
# 校验目录、环境变量、IIS 模板和版本隔离,不连接正式服务器。
python .\scripts\d2ctl.py validate
# 预演论坛与 IIS 部署;只打印计划,不修改线上。
python .\scripts\d2ctl.py deploy all --component forum
# 正式迁移到 IIS;可能按需重启服务器。
python .\scripts\d2ctl.py deploy all --component forum --apply
# 预演 HTTPS 证书部署;只打印命令,不连接服务器。
python .\scripts\d2ctl.py deploy all --component https
# 申请、安装证书并创建自动续期计划任务;首次执行会短暂停止 IIS。
python .\scripts\d2ctl.py deploy all --component https --apply
# 单独重新构建并发布在线文档到 D 盘 IIS 目录。
python .\scripts\d2ctl.py deploy all --component docs --apply

HTTPS 证书与自动续期 ​

证书申请邮箱固定为 39641843@qq.com。部署器使用与 Windows Server 2008 R2 兼容的 ACME 客户端,通过 TLS-ALPN-01 在 443 上验证域名,不依赖被云平台拦截的 HTTP 验证。证书同时覆盖:

  • GM109.ZHIYESHI.CN
  • GM113.ZHIYESHI.CN
  • AH.ZHIYESHI.CN

证书和续期文件位于 D:\AH.DIABLO2.COM.CN\acme。production 包含 ACME 账号、私钥和证书,secrets\pfx-password.txt 是 PFX 密码,logs\renew.log 是续期日志。该目录仅允许 SYSTEM、本机管理员和部署账号访问,不得放入论坛下载目录、发送给他人或提交 Git。

证书维护分为两个 SYSTEM 计划任务。CNBN-IIS-Certificate-Binding-Repair 在每次开机时仅使用本机已有 PFX 校验或修复 HTTP.sys 的 0.0.0.0:443 绑定,不访问 ACME;CNBN-IIS-Certificate-Renewal 每天 03:37 检查到期时间。证书剩余超过 30 天且绑定正确时,日常任务不会停止 IIS、不会删除绑定,也不会联网签发;只有确实需要续期时才短暂停止 IIS并执行 TLS-ALPN-01。续期失败时会恢复上一张证书指纹并重新启动 IIS。

Windows Server 2008 R2 初始状态可能只启用 TLS 1.0。HTTPS 部署器会写入 Schannel 的 TLS 1.2 Client/Server 开关并仅重启 HTTP.sys、WAS、W3SVC 和 WinRM,使现代浏览器无需整机重启即可握手。不要删除 HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2;该步骤不会停止 PvPGN 或 D2GS。

powershell
# 查看证书续期计划任务;Status 应为 Ready,Last Result 正常时为 0。
schtasks.exe /Query /TN "CNBN-IIS-Certificate-Renewal" /V /FO LIST
# 查看开机证书绑定修复任务;该任务不能包含 ACME 强制续签参数。
schtasks.exe /Query /TN "CNBN-IIS-Certificate-Binding-Repair" /V /FO LIST
# 查看 443 当前绑定的证书指纹和证书存储;IP:port 应为 0.0.0.0:443。
netsh.exe http show sslcert ipport=0.0.0.0:443
# 查看最近一次证书申请或续期日志;只读,不修改证书。
Get-Content D:\AH.DIABLO2.COM.CN\acme\logs\renew.log -Tail 100
# 手工执行一次正常到期检查;证书未临期时不会强制续签。
cmd.exe /d /c D:\AH.DIABLO2.COM.CN\acme\renew-iis-certificate.cmd
# 只用已有 PFX 修复 443 绑定;不会联网申请证书,也不会停止 IIS。
cmd.exe /d /c D:\AH.DIABLO2.COM.CN\acme\renew-iis-certificate.cmd --repair

不要删除 production\accounts,否则会丢失 ACME 账号并增加签发限额风险。不要在白天反复使用 --force,域名验证服务有失败次数限制。证书异常时先看 renew.log:非临期检查应出现 checking the HTTPS binding only,且后面不应出现停止 WAS 或 W3SVC 的记录。

防火墙与验收 ​

powershell
# 放行 HTTP 端口 80;它只用于跳转到 HTTPS。
New-NetFirewallRule -DisplayName 'CNBN IIS Web 80' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 80
# 放行 HTTPS 端口 443;证书验证和全部公网 Web 访问都需要此端口。
New-NetFirewallRule -DisplayName 'CNBN IIS HTTPS 443' -Direction Inbound -Action Allow -Protocol TCP -LocalPort 443

所有公网 Web 应用只允许通过 IIS 的 80/443 和上述三个域名访问,不得再增加 81 或其他公网兼容绑定。127.0.0.1:4087 是 113 本机论坛后端;109 主机通过自动部署的 D2109ForumTunnel SSH 服务连接该后端,隧道只绑定 127.0.0.1:42087,不能开放到公网。

powershell
# 确认 109 到论坛的内部 SSH 隧道服务正在运行。
sc.exe query D2109ForumTunnel
# 确认隧道只绑定回环地址;结果必须是 127.0.0.1:42087。
netstat.exe -ano -p tcp | findstr "127.0.0.1:42087"
# 确认三个业务站点具有 80 Host Header,只有 CNBN-IP-Compatibility 具有无 Host 的 443 绑定,不应出现 81。
& "$env:windir\System32\inetsrv\appcmd.exe" list site
powershell
# 查看 80 监听;迁移后通常由 HTTP.sys 的 PID 4 监听。
Get-NetTCPConnection -State Listen -LocalPort 80 | Select-Object LocalAddress,LocalPort,OwningProcess
# 查看 443 监听;安装证书后同样应由 HTTP.sys 的 PID 4 监听。
netstat.exe -ano -p tcp | findstr ":443"
# 确认旧 Web 入口服务已禁用。
Get-Service D2109Nginx,D2113Nginx,D2109PhpCgi,D2113PhpCgi -ErrorAction SilentlyContinue | Select-Object Name,Status,StartType
# 确认没有旧入口进程。
Get-Process nginx -ErrorAction SilentlyContinue

浏览器逐项检查:

  1. https://GM109.ZHIYESHI.CN/login.html
  2. https://GM113.ZHIYESHI.CN/login.html
  3. https://AH.ZHIYESHI.CN/
  4. https://AH.ZHIYESHI.CN/d2109/d2109.php
  5. https://AH.ZHIYESHI.CN/d2113/d2113.php
  6. https://AH.ZHIYESHI.CN/docs/
  7. 未登录访问两个后台的 /admin-api/session 必须返回 401,登录后必须返回 200。

常见问题 ​

现象原因处理
IIS 安装后仍无 appcmd.exe功能处于 Pending 或管理脚本工具未安装重启后重新安装 IIS-ManagementScriptingTools
500.19 / 0x80070021PHP handlers 配置节仍被 IIS 7.5 锁定重新运行仓库 IIS 部署器;部署器会安全解除该节锁定,禁止手工覆盖主配置
500.0 FastCGIPHP 路径、32 位池或扩展错误核对两个 D 盘 PHP、应用池 Enable32BitAppOnWin64=true
502.3Node 后台未运行或端口错误检查 D2109Admin/D2113Admin 与 4139/4143
404IIS 应用路径、域名绑定或物理目录错误核对三个 Host Header、/d2109、/d2113、/docs 应用
中文乱码PHPWind 文件被保存为 UTF-8恢复 GBK 文件,不在编辑器中批量转码
80 端口冲突IIS 默认站点或旧入口仍占用标准部署会移除空的默认站点;若存在其他业务站点,先迁移其绑定再执行
服务器本机访问 80 正常,公网连接后立即断开云安全组或云防火墙在 IIS 之前拦截在云控制台放通入站 TCP 80;IIS 日志没有请求时不要反复修改 PHP 或站点代码
域名跳转到 DNSPod webblock.html云厂商的备案或域名接入策略拦截在域名/云服务器控制台核对备案与接入;这不是 IIS 站点 301,也不能靠改 PHP 解决
证书签发提示 CAA、DNSSEC 或 secondary validation 超时权威 DNS 或 ACME 多节点查询暂时失败不要连续重试超过限额;先确认三个 A 记录均为 121.5.48.184、无错误 AAAA/CAA,等待后再运行 HTTPS 部署器
443 已监听但浏览器证书名称错误IIS 7.5 误绑了单域证书重新运行 HTTPS 部署器,确保 HTTP.sys 只绑定一张包含三个域名的 SAN 证书
GM113 或 GM109 提示重定向次数过多共享 443 入口把旧的 /gm113/ 或 /gm109/ 路径原样转发给后台,后台又跳回同一路径重新运行 IIS 部署器;入口必须先把旧路径规范为 /login.html 等无版本前缀路径,再转发给对应后台
论坛文字能显示但样式和图片丢失PHPWind 的 db_bbsurl 缓存或数据库仍指向旧域名、HTTP 地址重新运行 IIS 部署器更新 pw_config.db_bbsurl 与 data/bbscache/config.php;随后确认页面 <base> 为 https://AH.ZHIYESHI.CN/

仅供 CNBN D2 服务管理与开发人员使用