[问题]Meteor多APP合并(Nodejs环境相关问题)

[问题]Meteor多APP合并(Nodejs环境相关问题)

谁有做过或者看过使用Meteor做的多个APP项目然后将他们通过http-proxy或者nginx反向代理整合成一个项目的? 多个Meteor项目分别用不同端口,例如APP0:3000APP1:4000APP2:5000APP3:6000。然后让APP0映射到:80/,APP1映射到:80/app1子目录,APP2映射到:80/app2子目录,APP3映射到:80/app3子目录。 求高手指点!


8 回复

要将多个 Meteor 应用程序整合到一个项目中,并通过不同的路径访问它们,可以使用 Nginx 作为反向代理来实现。这里提供一个基本的步骤和配置示例。

步骤概述

  1. 保持每个 Meteor 应用独立运行:确保每个 Meteor 应用程序都在各自的端口上运行(如 APP0 在 3000 端口,APP1 在 4000 端口等)。
  2. 安装和配置 Nginx:使用 Nginx 来处理请求并根据 URL 将请求转发到相应的 Meteor 应用程序。
  3. 配置 Nginx:编写 Nginx 配置文件以实现反向代理。

示例配置

假设你已经在服务器上安装了 Nginx。接下来,你需要编辑或创建一个新的 Nginx 配置文件,通常位于 /etc/nginx/sites-available/default 或类似的路径。

Nginx 配置文件示例

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /app1 {
        proxy_pass http://localhost:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /app2 {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /app3 {
        proxy_pass http://localhost:6000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解释

  • listen 80;:监听 80 端口,这是 HTTP 默认端口。
  • location /:匹配根路径 /,将请求转发到 localhost:3000
  • proxy_pass:将请求转发到指定的后端服务器。
  • proxy_set_header:设置必要的 HTTP 头信息,以便后端服务器能够正确处理请求。

启动和测试

保存配置文件后,重启 Nginx 服务以应用更改:

sudo systemctl restart nginx

现在,当你访问 yourdomain.com 时,会看到 APP0 的内容;访问 yourdomain.com/app1 时,会看到 APP1 的内容,依此类推。

这样就实现了通过 Nginx 反向代理整合多个 Meteor 应用程序的目标。


没帮你搞定,顶起来~

尝试了很久,用如下方式解决了!

搭建MutilMeteorApps

通过Meteor官网的项目示例,我们可以很快做出我们的Web应用。但是在实际的开发当中,我们往往由多人开发,每个人可能负责开发几个项目,却发布在一个服务器应用中。这种是如何实现的呢?通常我们可以使用服务器的反向代理机制将不同的Web项目映射到同一个端口中,现在我们就来实现搭建一个MutilMeteorApps。

首先,我们创建一个文件夹MutilMeteorApps,里面会有很多单独的MeteorApp。

$ mkdir MutilMeteorApps
$ cd MutilMeteorApps

接着,我们创建一个frame项目,这个项目作为整个MutilMeteorApps的框架项目。

$ meteor create frame

因为frame项目仅仅为集群项目提供框架,我们删除所有默认文件,新建/lib/config.js文件。

__meteor_runtime_config__.serverId = "myServerId";

然后我们新建一个/client/frame.html

<head>
  <title>项目主框架</title>
</head>
<body>
  <div>
    <a href="/app1" target="showFrame">app1</a>    
    <a href="/app2" target="showFrame">app2</a>    
    <a href="/app3" target="showFrame">app3</a>    
  </div>
  <div id="main">
      <iframe frameborder=0 width="100%" height="800" marginheight=0 marginwidth=0 scrolling=no src="/app1" name="showFrame">
  </div>
</body>

接下来我们就来构造我们的三个app项目,这三个项目我们不用自己做,我们就用Meteor官方提供的项目就可以了:

$ meteor create --example leaderboard
$ meteor create --example todos
$ meteor create --example wordplay

Meteor内部就提供了node的一个modules,名字叫http-proxy,这是一个用node做的http代理模块。我们在MutilMeteorApps文件夹新建如下文件和文件夹:

/MutilMeteorApps
      |-- /proxy
            |-- proxy.js
            |-- node_modules

http-proxy模块复制到node_modules文件夹中,然后修改proxy.js文件:

var proxy = require('http-proxy');
var options = {
  replaceRelativePath:true,
  pathnameOnly:true,
  router:{
    //package和sockjs从框架中找
    '/packages':'192.168.30.100:3000/packages',
    '/sockjs':'192.168.30.100:3000/sockjs',
    //各个项目从不同端口找
    '/app1':'192.168.30.100:4000/',
    '/app2':'192.168.30.100:5000/',
    '/app3':'192.168.30.100:6000/',
    //设置根目录
    '/':'192.168.30.100:3000/',
  }
};
proxy.createServer(options).listen(80);

需要注意的是,host尽量配置为本机ip地址或者域名ip地址。这样,我们就将不同端口的项目代理到同一端口80下了。接着我们运行所有的项目以及proxy.js这个node程序:

## 启动frame项目 ##
$ meteor --port 3000
## 启动leaderboard项目 ##
$ meteor --port 4000
## 启动todos项目 ##
$ meteor --port 5000
## 启动wordplay项目 ##
$ meteor --port 6000
## 启动proxy代理 ##
$ node proxy.js

我们可以试一试每个项目单独启动能否成功,答案是显然的,因为端口都没有冲突。然后我们试着访问http://127.0.0.1,点击这些链接。先不管为什么frame为什么没出来,但是我们发现点出来的项目虽然出来了,但是不停的再刷新。

这是为什么呢?其实我也不知道,但是我发现他刷新的速度和socket刷新的速度是一致的。于是我猜测,可能他认为这是几个不同的项目,所以出现这种不断比较不断刷新的递归现象,时间长了自然会对服务器有影响。还记得我们之前为frame配置的lib目录吗,这是我花了很久才找到的配置方法,中间走了不少弯路。只要将这个目录为你所有的项目中添加,告诉他们之间其实是同一个项目即可。

此时,三个项目都没出现刷新的问题,但是因为没有数据,所以三个显示的都不怎么好看。思考了一下,可能是三个都是连接各自的数据库,因此,我们统一数据库好了,设置环境变量set MONGO_URL=mongodb://192.168.30.100:27017,再次运行所有项目。

依然没有达到我们都目的,好的,我们再来做大胆的尝试。我觉得是因为不同端口的项目都在尝试连接80端口的项目,而80端口被映射到了3000端口上。因此,我们将所有项目拆解为client/server/public/collections几个文件夹来试一试。最后,将所有的服务器资源(public、server)统统放到frame项目中去。

最后成功!但是使用nodejs启动有点麻烦,如果Meteor框架frame自己能启动就最好了。很简单,Meteor虽然不能使用nodejs代码,但是能通过全局变量Npm获取nodejs模块,使用方法为Npm.require(),之后改动就很简单了吧!

虽然解决了,但是老大并不满意。他需要通过反向代理的方式实现各个app独立分离,减少服务器一次性的开销,我的这个解决方案虽然解决了标(分离和反向代理),但是没解决本(减少服务器开销)。不知道其他人还有没有更好的点子?我现在是已经没辙了!

  • 我也遇到了这个问题。。mark 研究一下LZ

没遇到过。用Meteor的人不少哦。 我们是直接分成不同模块 资源一次性加载 。确实不好。

后来怎么解决的?

要实现将多个Meteor应用合并到一个项目中,并通过不同的路径访问这些应用,可以使用Nginx作为反向代理来实现。以下是如何配置Nginx来实现这一点:

示例配置

首先确保你的Nginx已经安装并配置好。假设你已经有四个Meteor应用运行在不同的端口上:

  • APP03000 端口
  • APP14000 端口
  • APP25000 端口
  • APP36000 端口

在Nginx的配置文件中(通常位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/default),添加或修改以下配置:

server {
    listen 80;
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    location /app1 {
        proxy_pass http://localhost:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /app2 {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /app3 {
        proxy_pass http://localhost:6000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

解释

  1. 监听80端口:Nginx将监听80端口上的所有HTTP请求。

  2. location块:定义了不同的路径规则。例如:

    • / 路径将代理到运行在3000端口的应用。
    • /app1 路径将代理到运行在4000端口的应用。
    • /app2 路径将代理到运行在5000端口的应用。
    • /app3 路径将代理到运行在6000端口的应用。
  3. proxy_pass指令:将请求转发到指定的后端服务器。

  4. 设置代理头:确保Meteor应用能够正确处理这些头信息,以便正确地处理请求和响应。

保存配置文件后,重启Nginx服务以应用更改:

sudo systemctl restart nginx

这样,你就可以通过不同的路径访问不同的Meteor应用了。

回到顶部