Appearance
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 论坛 PHP | D:\AH.DIABLO2.COM.CN\forum-services\d2109\runtime\php |
| 113 论坛 PHP | D:\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 |
开始前
- 使用管理员账号通过 RDP 登录目标服务器。
- 打开“开始”,搜索 PowerShell,右键选择“以管理员身份运行”。
- 确认 D 盘剩余空间至少是现有论坛目录的两倍。
- 保留 SSH 会话和 RDP 会话,直到所有网址验收完成。
- 若 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/proxyARR 只做反向代理,不启用磁盘缓存。部署器设置 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 站点 | 绑定 | 应用 |
|---|---|---|---|
| 109 | GM109.ZHIYESHI.CN | *:80:GM109.ZHIYESHI.CN | 反代 127.0.0.1:4139 |
| 113 | GM109.ZHIYESHI.CN | *:80:GM109.ZHIYESHI.CN | 转发到独立 109 源站 |
| 113 | GM113.ZHIYESHI.CN | *:80:GM113.ZHIYESHI.CN | 反代 127.0.0.1:4143 |
| 113 | AH.ZHIYESHI.CN | *:80:AH.ZHIYESHI.CN | phpwind、交易、自助服务和 /docs/ |
| 113 | CNBN-IP-Compatibility | *:80:、*:443: | 80 兼容跳转;443 按 Host 分流三个公网域名 |
| 113 | AH.ZHIYESHI.CN-Internal | 127.0.0.1:4087 | D2GS/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 W3SVCPHP 5.6 配置
论坛是旧版 PHPWind,使用经过验证的 PHP 5.6.40 x86 NTS。PHP 已停止官方安全更新,因此只允许 IIS FastCGI 调用,不创建公网 FastCGI 端口,也不手工启动 php-cgi.exe -b。
两个 php.ini 至少配置:
| 参数 | 值 |
|---|---|
cgi.force_redirect | 0 |
cgi.fix_pathinfo | 1 |
fastcgi.impersonate | 1 |
fastcgi.logging | 0 |
date.timezone | Asia/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 --applyHTTPS 证书与自动续期
证书申请邮箱固定为 39641843@qq.com。部署器使用与 Windows Server 2008 R2 兼容的 ACME 客户端,通过 TLS-ALPN-01 在 443 上验证域名,不依赖被云平台拦截的 HTTP 验证。证书同时覆盖:
GM109.ZHIYESHI.CNGM113.ZHIYESHI.CNAH.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 sitepowershell
# 查看 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浏览器逐项检查:
https://GM109.ZHIYESHI.CN/login.htmlhttps://GM113.ZHIYESHI.CN/login.htmlhttps://AH.ZHIYESHI.CN/https://AH.ZHIYESHI.CN/d2109/d2109.phphttps://AH.ZHIYESHI.CN/d2113/d2113.phphttps://AH.ZHIYESHI.CN/docs/- 未登录访问两个后台的
/admin-api/session必须返回401,登录后必须返回200。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
IIS 安装后仍无 appcmd.exe | 功能处于 Pending 或管理脚本工具未安装 | 重启后重新安装 IIS-ManagementScriptingTools |
500.19 / 0x80070021 | PHP handlers 配置节仍被 IIS 7.5 锁定 | 重新运行仓库 IIS 部署器;部署器会安全解除该节锁定,禁止手工覆盖主配置 |
| 500.0 FastCGI | PHP 路径、32 位池或扩展错误 | 核对两个 D 盘 PHP、应用池 Enable32BitAppOnWin64=true |
| 502.3 | Node 后台未运行或端口错误 | 检查 D2109Admin/D2113Admin 与 4139/4143 |
| 404 | IIS 应用路径、域名绑定或物理目录错误 | 核对三个 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/ |