在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
相关产品推荐
相关产品推荐

