跳转到内容

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

核验于 2 分钟阅读

一个公网边缘 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 访问。

应用 运行时 内部端点 监管者 身份 日志
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 连接被拒:边缘挂了。

终端窗口
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 上待验证的设计。

来源