You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在RHEL 7.2服务器上托管多域名Express站点的技术问询

多Express站点vhost托管方案(RHEL 7.2)

嘿,我来给你梳理下在RHEL 7.2上用vhost托管多个Express站点的靠谱方案,重点是让各个站点之间尽可能隔离、互不干扰。

1. 先把基础环境搞定

首先得确保服务器上的Node.js环境没问题,推荐用nvm来管理Node版本,能避免全局依赖打架的问题:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 18  # 选个和你的Express版本兼容的Node版本就行

然后主入口项目和每个站点都要装依赖:

# 主vhost入口项目目录下
npm install express vhost
# 每个单独的站点目录下
npm install express

2. 站点目录结构要清晰

为了减少干扰,每个站点必须放在独立的目录里,比如这样的结构:

/var/www/
├── vhost-gateway/     # 主入口,负责域名路由
│   └── server.js
├── site1-demo/        # site1.com的站点文件
│   ├── server.js
│   └── package.json
└── site2-demo/        # site2.com的站点文件
    ├── server.js
    └── package.json

3. 主入口server.js配置完善

你提到的代码片段可以补全成这样,核心是把每个站点的Express实例通过vhost绑定到对应域名:

const fs = require('fs');
const path = require('path');
const express = require('express');
const vhost = require('vhost');

const mainApp = express();

// 挂载site1.com的站点实例
const site1App = require('/var/www/site1-demo/server.js');
mainApp.use(vhost('site1.com', site1App));
// 如果要支持子域名,改成vhost('*.site1.com', site1App)就行

// 挂载site2.com的站点实例
const site2App = require('/var/www/site2-demo/server.js');
mainApp.use(vhost('site2.com', site2App));

// 监听端口,这里注意:直接监听80需要root权限,嫌麻烦的话后面可以用nginx反向代理
mainApp.listen(80, () => {
  console.log('主vhost网关已启动,正在监听80端口');
});

4. 单个站点的server.js要规范

每个站点的server.js必须是独立的Express实例,不要自己调用listen(),把实例导出交给主vhost管理:

const express = require('express');
const app = express();

// 这里写你站点的路由、中间件逻辑
app.get('/', (req, res) => {
  res.send('欢迎访问site1.com!');
});

// 导出实例,交给主vhost调度
module.exports = app;

5. 强化站点隔离的关键措施

光靠vhost还不够,得从权限、进程层面进一步隔离:

  • 用户隔离:给每个站点创建独立的系统用户,比如useradd site1,然后用这个用户来管理站点的文件和进程,防止一个站点出问题影响其他站点。
  • 文件权限锁死:每个站点目录的所有者设为对应用户,权限设为750,文件设为640,这样其他站点的用户根本读不到、改不了这个站点的文件。
  • 用pm2管理进程:pm2能帮你稳定运行Node进程,还能做进程隔离。安装后启动主网关,设为开机自启:
    npm install -g pm2
    pm2 start /var/www/vhost-gateway/server.js --name vhost-main
    pm2 startup
    pm2 save
    
  • 可选但推荐:nginx反向代理:如果不想让Node进程跑root权限监听80,用nginx做反向代理最合适。它不仅能转发请求,还能帮你处理SSL、静态资源缓存,示例配置如下:
    server {
        listen 80;
        server_name site1.com;
    
        location / {
            proxy_pass http://localhost:3000;  # 主Node进程监听3000端口
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
    server {
        listen 80;
        server_name site2.com;
    
        location / {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    

6. 最后验证下效果

  • 把域名解析到服务器IP,或者在本地hosts里加对应映射。
  • 分别访问两个域名,确认各自返回站点的内容,没有串站的情况。
  • 用pm2 list看看进程状态,确保主网关稳定运行。

内容的提问来源于stack exchange,提问作者inderpreet saini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:12:26