[问题]Meteor多APP合并(Nodejs环境相关问题)
[问题]Meteor多APP合并(Nodejs环境相关问题)
谁有做过或者看过使用Meteor
做的多个APP项目然后将他们通过http-proxy
或者nginx反向代理
整合成一个项目的?
多个Meteor
项目分别用不同端口,例如APP0:3000
、APP1:4000
、APP2:5000
、APP3:6000
。然后让APP0映射到:80/
,APP1
映射到:80/app1
子目录,APP2
映射到:80/app2
子目录,APP3
映射到:80/app3
子目录。
求高手指点!
要将多个 Meteor 应用程序整合到一个项目中,并通过不同的路径访问它们,可以使用 Nginx 作为反向代理来实现。这里提供一个基本的步骤和配置示例。
步骤概述
- 保持每个 Meteor 应用独立运行:确保每个 Meteor 应用程序都在各自的端口上运行(如
APP0
在 3000 端口,APP1
在 4000 端口等)。 - 安装和配置 Nginx:使用 Nginx 来处理请求并根据 URL 将请求转发到相应的 Meteor 应用程序。
- 配置 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应用运行在不同的端口上:
APP0
在3000
端口APP1
在4000
端口APP2
在5000
端口APP3
在6000
端口
在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;
}
}
解释
-
监听80端口:Nginx将监听80端口上的所有HTTP请求。
-
location块:定义了不同的路径规则。例如:
/
路径将代理到运行在3000端口的应用。/app1
路径将代理到运行在4000端口的应用。/app2
路径将代理到运行在5000端口的应用。/app3
路径将代理到运行在6000端口的应用。
-
proxy_pass指令:将请求转发到指定的后端服务器。
-
设置代理头:确保Meteor应用能够正确处理这些头信息,以便正确地处理请求和响应。
保存配置文件后,重启Nginx服务以应用更改:
sudo systemctl restart nginx
这样,你就可以通过不同的路径访问不同的Meteor应用了。