# 一台 Windows 服务器跑 PHP、Java、Node、Python：共存模型

> 一个公网边缘 IIS/Nginx 占 443，运行时藏在内部端口；每应用一个监管者、身份、日志和可审计的端口表。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29

## 一句话结论

一个公网边缘，多个私有运行时：

```text
443  IIS/Nginx（TLS、路由、日志）
      ├─ app-a.local  -> 127.0.0.1:3000  Node
      ├─ app-b.local  -> 127.0.0.1:8080  Tomcat
      ├─ app-c.local  -> 127.0.0.1:8000  Python/Waitress
      └─ php.local    -> FastCGI          PHP
```

只有边缘监听 80/443。其他绑 `127.0.0.1`（或私网 IP），通过反代/FastCGI 访问。

## 必须写下来的映射

| 应用 | 运行时 | 内部端点 | 监管者 | 身份 | 日志 |
|---|---|---|---|---|---|
| app-a | Node 20 | 127.0.0.1:3000 | WinSW | svc-app-a | C:\logs\app-a |
| app-b | Tomcat/JDK 17 | 127.0.0.1:8080 | Tomcat 服务 | svc-app-b | C:\tomcat\...\logs |
| app-c | Python 3.11 | 127.0.0.1:8000 | NSSM | svc-app-c | C:\logs\app-c |
| php | PHP 8.4 | FastCGI pipe/port | IIS FastCGI | 应用池 | C:\inetpub\logs |

两行共用端口，必有一个起不来，或反代打错进程。

## 隔离规则

- **一个应用一个服务身份。** 不要全部 LocalSystem。
- **一个应用一个日志目录。** 共享日志让事故不可读。
- **一个应用一棵依赖树。** Node `node_modules`、Python venv、Java `WEB-INF/lib`；不要共享全局包。
- **一个应用一个版本。** 固定绝对路径；不要全局 PATH 切换。
- **一个应用一个监管者。** 不要让 IIS HPH 和 Windows 服务同时启动同一进程。

## 边缘选择

- **IIS + ARR**：已有 IIS、需要 Windows 认证、想用 IIS 日志。
- **Nginx**：想要简单 `server` 块和更小配置面。
- 不要在 443 同时跑两者。选一个边缘，另一个只做内部。

TLS 在边缘终止；后端 localhost 走 HTTP；不要把后端端口开防火墙。PHP 的 FastCGI 不是 HTTP 端口，是 IIS/Nginx 与 `php-cgi` 之间的管道/端口。

## 启动顺序

1. 边缘（IIS/Nginx）可先起；后端没起时返回 502。
2. 后端服务自动启动。
3. 健康检查区分“边缘活着、应用挂了”和“全挂”。

502 有用：说明边缘活着、上游没起。443 连接被拒：边缘挂了。

## 验证映射

```powershell
Get-NetTCPConnection -State Listen |
  Where-Object LocalPort -in 80,443,3000,8000,8080 |
  Select-Object LocalAddress,LocalPort,OwningProcess
Get-CimInstance Win32_Process -Filter "Name='node.exe' OR Name='java.exe' OR Name='python.exe'" |
  Select-Object ProcessId,Name,ExecutablePath,CommandLine
```

交叉核对 PID → 应用 → 端口 → 主机名。端口属于错误 PID，别再猜，改服务定义。

> **警告: 不要把端口表只放在脑子里**
>
> 只存在于脑中的端口映射就是一次待发生的故障。把表放进仓库，带服务名和负责人。

## 实验室边界

E1。实验室分别验证了 IIS/PHP 和 Nginx；没有把 Node/Java/Python 放在同一套边缘后。映射是 Server 2025 上待验证的设计。

## 来源

- [Microsoft Learn — ARR 反向代理](https://learn.microsoft.com/zh-cn/iis/extensions/url-rewrite-module/reverse-proxy-with-url-rewrite-v2-and-application-request-routing)
- [nginx — 反向代理](https://nginx.org/en/docs/http/ngx_http_proxy_module.html)
- [Microsoft Learn — IIS 应用程序池](https://learn.microsoft.com/zh-cn/iis/configuration/system.applicationhost/applicationpools/)

---

来源页面: https://winbook.fyi/zh/server/runtimes/multi-runtime/
