












node app.js 启动,管理起来混乱。因此,用专门的“进程管理 + 反向代理/域名映射 + 服务管理”方案,会比“自己手动多窗口启动 + port + 记笔记”靠谱很多。
下面是几种常见且适合 Windows Server + 多个 Node/Vue 项目的方案 / 工具/组合:
优点:启动/停止/重启统一管理;后台运行;日志统一;支持不同 Node 版本。
适合:你有多个纯 Node 后端服务 + 希望简单管理 + 不依赖 Docker 的场景。
优点:外部访问统一、域名/子域管理方便、支持 HTTPS(如果配置);隐藏真实端口;更标准/生产环境友好。
适合:多个项目都要对外服务,希望用域名/标准端口访问 + SSL + 域名管理。
这是目前最常见也比较推荐的组合方式:
这种方式既有进程管理,也有统一对外访问,适合生产环境 / 多项目管理。很多社区教程也推荐这种组合。 (CSDN)
鉴于你之前有用 Docker 的经验(你提到你喜欢 Docker + Flask/Streamlit 项目部署),若将每个 Vue+Node 项目都封装成 Docker 容器:
优点:隔离、标准、便于扩容/移植/迁移/分布式部署。
适合:你项目多、想标准化管理/未来可能迁移到云端/希望用 Docker 的场景。
考虑到你之前就有用 Docker/云部署经验,同时也可能希望灵活管理多个项目/长期运行/自动化部署/开机启动——我建议你采用 Docker + 反向代理 + 容器化 + (必要时 PM2) 的方式,但如果你暂时不想切 Docker,也可以先从 PM2 + Nginx(或 IIS) 入手。
npm install -g pm2 (Oryoy)pm2 start server.js --name project1https://your-domain.com/app1 或 app1.your-domain.com 转发到 localhost:3000,app2 转发到 localhost:4000,等等。 参考 Nginx 的配置方式。 (维基百科)因为你:
所以强烈建议你 Docker 化 + 容器 + 反向代理 + 域名/SSL 管理 —— 长期来看可维护性、可扩展性、隔离性都更好。
如果你目前只是几个小项目、想先稳定运行 → 可以直接用 PM2 + Nginx
下面是 完整可直接用 的 Windows Server 多项目模板,包括:
只要把目录、端口、域名改一下即可上线运行。
D:\
├── webapps\
│ ├── app1\
│ │ ├── dist\ # Vue 编译后的前端文件
│ │ └── server.js # Node 后端
│ ├── app2\
│ │ ├── dist\
│ │ └── server.js
│ └── app3\
│ ├── dist\
│ └── server.js
├── pm2\
│ └── ecosystem.config.js
└── nginx\
└── conf\
└── nginx.conf
把以下内容保存为:
D:\pm2\ecosystem.config.js
module.exports = {
apps: [
{
name: "app1-backend",
cwd: "D:/webapps/app1",
script: "server.js",
instances: 1,
exec_mode: "fork",
watch: false,
env: {
NODE_ENV: "production",
PORT: 3001
}
},
{
name: "app2-backend",
cwd: "D:/webapps/app2",
script: "server.js",
instances: 1,
exec_mode: "fork",
watch: false,
env: {
NODE_ENV: "production",
PORT: 3002
}
},
{
name: "app3-backend",
cwd: "D:/webapps/app3",
script: "server.js",
instances: 1,
exec_mode: "fork",
watch: false,
env: {
NODE_ENV: "production",
PORT: 3003
}
}
]
}
管理员 CMD 运行:
cd D:\pm2
pm2 start ecosystem.config.js
pm2 save
pm2 startup
这样所有项目会:
查看所有项目:
pm2 list
适合以下两种情况:
请把下面模板写入:
D:\nginx\conf\nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# -------------------------
# 站点:app1
# -------------------------
server {
listen 80;
server_name app1.example.com;
# Vue 前端
root D:/webapps/app1/dist;
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:3001/;
}
location / {
try_files $uri $uri/ /index.html;
}
}
# -------------------------
# 站点:app2
# -------------------------
server {
listen 80;
server_name app2.example.com;
root D:/webapps/app2/dist;
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:3002/;
}
location / {
try_files $uri $uri/ /index.html;
}
}
# -------------------------
# 站点:app3
# -------------------------
server {
listen 80;
server_name app3.example.com;
root D:/webapps/app3/dist;
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:3003/;
}
location / {
try_files $uri $uri/ /index.html;
}
}
}
app1.example.com
app2.example.com
app3.example.com
你也可以用路径模式:
/app1//app2/我也可以给你生成“多项目 → 路径访问”的 Nginx 配置。
PM2 已经定义:
| 项目 | 端口 |
|---|---|
| app1 | 3001 |
| app2 | 3002 |
| app3 | 3003 |
你只需保持一致即可。
Nginx 中写了:
root D:/webapps/app1/dist;
按需要替换。
nginx.exe
nginx.exe -s reload
nginx.exe -s stop
| 项目 | 访问方式 | 代理到 |
|---|---|---|
| app1 | http://app1.example.com | Node 端口 3001 |
| app2 | http://app2.example.com | Node 端口 3002 |
| app3 | http://app3.example.com | Node 端口 3003 |
对外展示统一,内部端口隔离。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。