一台 Windows 服务器跑 PHP、Java、Node、Python:共存模型
一个公网边缘 IIS/Nginx 占 443,运行时藏在内部端口;每应用一个监管者、身份、日志和可审计的端口表。
测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1- 版本号
- 26100.33650
- 版本
- Standard / Datacenter
- 架构
- x64
- 支持
- 文档(E1)
- 证据
- E1官方文档
- 核验日期
- 2026-10-29
- 页面类型
- 概念
一个公网边缘,多个私有运行时:
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 访问。
必须写下来的映射
Section titled “必须写下来的映射”| 应用 | 运行时 | 内部端点 | 监管者 | 身份 | 日志 |
|---|---|---|---|---|---|
| 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、JavaWEB-INF/lib;不要共享全局包。 - 一个应用一个版本。 固定绝对路径;不要全局 PATH 切换。
- 一个应用一个监管者。 不要让 IIS HPH 和 Windows 服务同时启动同一进程。
- IIS + ARR:已有 IIS、需要 Windows 认证、想用 IIS 日志。
- Nginx:想要简单
server块和更小配置面。 - 不要在 443 同时跑两者。选一个边缘,另一个只做内部。
TLS 在边缘终止;后端 localhost 走 HTTP;不要把后端端口开防火墙。PHP 的 FastCGI 不是 HTTP 端口,是 IIS/Nginx 与 php-cgi 之间的管道/端口。
- 边缘(IIS/Nginx)可先起;后端没起时返回 502。
- 后端服务自动启动。
- 健康检查区分“边缘活着、应用挂了”和“全挂”。
502 有用:说明边缘活着、上游没起。443 连接被拒:边缘挂了。
Get-NetTCPConnection -State Listen | Where-Object LocalPort -in 80,443,3000,8000,8080 | Select-Object LocalAddress,LocalPort,OwningProcessGet-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 上待验证的设计。