16、深入了解MeteorJS应用的构建、部署与扩展

深入了解MeteorJS应用构建、部署与扩展

深入了解MeteorJS应用的构建、部署与扩展

1. MeteorJS应用基础

MeteorJS借助自身的构建工具将应用打包成Node.js应用,不过它构建的并非传统的Node.js应用,而是使用Fibers的Node.js应用。若想了解Fibers,可访问其GitHub仓库:https://github.com/laverdet/node-fibers

通常,部署MeteorJS应用只需一台安装了Node.js和MongoDB的机器。但实际中,人们却觉得部署困难,这源于多方面的问题。例如,在Mac机器上使用 meteor build 命令构建应用,再部署到Linux机器时,应用可能无法正常运行,这就是跨平台问题。因为MeteorJS使用的Fibers包依赖于平台,所以将构建文件移植到目标托管环境后,需移除并重新安装Fibers包。应用中其他依赖平台的包也可能有相同问题。若不想在托管平台上进行这些操作,可在操作系统和处理器架构(32/64位)与托管平台相似的机器上构建应用。

2. MeteorJS应用的构建工具

MeteorJS应用有两种常用的构建工具:Isobuild和Demeteorizer。
- Isobuild :这是MeteorJS内置的构建工具,能将单一源文件转换为适用于目标平台(如Android、iOS、Web)的可运行程序。若使用MeteorJS开发跨平台应用,该构建过程也能为添加的移动平台创建构建文件。创建MeteorJS应用时,Isobuild会自动添加到应用中。当运行以下命令时,Isobuild会对源文件进行构建:
- meteor run
- meteor deploy
- meteor build
Isobuild能根据目标平台包含NPM包和PhoneGap包,它有自己的包格式Isopack,可在 .meteor/local 目录中看到。构建过程中,Isobuild会进行转译、压缩、生成源映射、解析包引用、打包资源等操作。若需要自定义功能,可通过插件扩展Isobuild。

运行 meteor build 命令时,需提供输出位置路径,例如: meteor build <path/to/some/directory> 。运行后,访问该位置并解压打包文件(tarball),会发现一个README文件,其中包含设置数据库、根URL、端口等环境变量的说明。还有一个 main.js 文件,它是应用的入口点,类似于Web服务器的 index.html 。要启动应用,需使用Node.js运行 main.js 文件。根据添加的目标平台(Android、iOS、Web),会看到相应的目录。若未添加移动平台,只会有 web.browser 目录和 server 目录,它们位于 programs 目录内。这个打包文件提供了服务器和客户端的源代码,若数据库已设置好,只需按照README文件中的说明设置环境变量,就可在任何地方运行该打包文件。

  • Demeteorizer :它基于 meteor build 命令创建构建文件,会将应用打包并添加 package.json 文件到打包文件中。打包文件会在应用根目录的 .demeteorizer 目录中创建,运行 demeteorizer 命令时,也可指定其他输出目录。使用 demeteorizer –debug 命令可在调试模式下构建应用,该模式不会压缩代码,便于调试。

使用Demeteorizer打包应用后,可按以下步骤将其作为Node.js应用在任何地方运行:
1. 进入 bundle/programs/server 目录,运行 npm install 命令。
2. 设置所需的环境变量( MONGO_URL ROOT_URL PORT )。
3. 使用 npm start 命令启动应用。

运行 npm install 命令时,它会读取之前创建的 package.json 文件,并安装应用所需的依赖包。Demeteorizer会将Fibers、semver等依赖的NPM包添加到 package.json 文件中,并从打包文件的 node_modules 目录中移除Fibers。在目标托管环境中运行 npm install 时,会重新安装Fibers包,以避免平台问题。安装完所有依赖后,可直接运行 main.js 文件,也可运行 npm start 命令,该命令同样会运行 main.js 文件。确保数据库和环境变量已设置好。更多详细信息可访问Demeteorizer的GitHub仓库:https://github.com/onmodulus/demeteorizer

3. MeteorJS应用的部署工具

MeteorJS有两种常用的部署工具:Meteor Up和Meteor Deployment Manager(MDM),它们都是NPM包,需使用NPM安装,并在终端中运行相应命令。
- Meteor Up :这是一款流行的MeteorJS部署工具,目前仅支持部署到Debian/Ubuntu Linux和Open Solaris目标机器。Mup是MeteorJS应用部署的完整解决方案,它使用 meteor build 命令构建应用,并在目标主机上运行应用前安装Fibers等依赖平台的包。

安装Mup可使用 npm install -g mup 命令。使用Mup完成部署有两个步骤:
1. 设置Mup :运行 mup setup 命令,会在运行该命令的目录中创建 mup.json settings.json 文件。 mup.json 文件有详细的注释,需在其中指定托管凭证。为避免暴露主机凭证,最好将Mup文件放在应用之外。
2. 部署应用 :在 mup.json 文件中,需提供托管服务器的IP地址、用户名和SSH登录密码。运行 mup deploy 命令时,Mup会尝试登录服务器,并将构建好的应用打包文件复制到主机。还可在 mup.json 文件中指定是否安装新的Mongo数据库、使用的Node.js版本,以及本地应用的路径。Mup会负责设置环境变量,但需在 mup.json 文件中提供这些变量。

在托管环境中,Mup会将应用放在 opt/<appName>/app 目录下。若 mup.json 文件中未指定 appName ,默认的 appName meteor 。Mup使用upstart监控应用的重启,upstart配置文件位于 /etc/init/<appName>.conf 。可在托管服务器上使用 start <appName> stop <appName> 命令启动和停止应用,应用日志位于 /var/log/upstart/<appName>.log 。若Mup创建了Mongo数据库,无法从外部访问,需通过SSH登录到托管服务器并访问数据库,数据库名称与 appName 相同。登录后,可运行 mongo <appName> 访问应用数据库。

Mup还提供了其他命令,可从本地机器控制应用。例如, mup reconfigure 命令可在需要更改环境变量或 settings.json 时重新配置托管服务器上的应用。还可使用 mup start mup stop mup restart 命令分别启动、停止和重启应用。Mup有许多功能,包括部署到多个服务器、支持SSL、使用SSH密钥连接主机和自定义Meteor二进制文件。更多信息可访问Mup的GitHub仓库:https://github.com/arunoda/meteor-up

  • Meteor Deployment Manager(MDM) :它与Mup非常相似,但要求应用是一个Git仓库。与 mup.json 类似,MDM需要一个 deploy.json 文件,可使用 mdm generate 命令生成,在该文件中可指定服务器详细信息。

使用MDM前,需在托管服务器上进行一些基本设置:
1. 安装Git、Nginx和MongoDB。
2. 创建一个非root用户来运行Node.js命令,使用 adduser 命令创建用户,并将其添加到sudoers列表中,允许该用户无需密码执行特定命令。例如,将以下行添加到 /etc/sudoers.d/<appName> 文件中:

meteor ALL = (root) NOPASSWD: /sbin/start <appName>, /sbin/stop <appName>, /sbin/restart <appName>
  1. 导出MongoDB连接字符串到环境变量,例如: export MONGO_URL="mongodb://localhost:27017"
  2. 设置Nginx作为代理,允许访问端口80。备份Nginx配置文件,并将其替换为以下内容:
events {
    worker_connections  1024;
}
http {
  include       mime.types;
  gzip  on;
  server {
    listen 80;
    server_name your-app.com *.your-app.com;
    location / {
      proxy_pass http://127.0.0.1:2000/;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
    }
  }
}

然后使用 service nginx start 命令启动Nginx。

  1. MDM也使用upstart管理应用,需在 /etc/init 目录中创建一个以应用名称命名的配置文件,并添加以下代码,根据应用情况进行修改:
#!upstart
description "Application Upstart"
env APP_NAME='<appName>'
env PORT='2000'
env ROOT_URL='http://www.your-app.com'
env NODE_BIN='/home/meteor/.nvm/v0.10.40/bin/node'
env SCRIPT_FILE="<path/to/>bundle/main.js" # Entry point for the nodejs app
env RUN_AS="meteor"#use we added before
start on (local-filesystems and net-device-up IFACE=eth0)
stop on shutdown
script
export LOG_FILE="/home/meteor/$APP_NAME/log/upstart.log"
touch $LOG_FILE
chown $RUN_AS:$RUN_AS $LOG_FILE
chdir /home/meteor/$APP_NAME/builds/current
exec sudo -u $RUN_AS sh -c " PORT=$PORT ROOT_URL='$ROOT_URL' $NODE_BIN $SCRIPT_FILE >> $LOG_FILE 2>&1"
end script
respawn
respawn limit 5 60
  1. 安装特定版本的Node.js,以新创建的用户身份登录并使用 nvm n 包安装upstart配置文件中指定的版本。同时,安装MeteorJS,以便MDM可以构建应用。
  2. 创建一个以应用名称命名的目录来克隆应用,MDM期望应用目录中包含 builds log working source 目录。在 source 目录中初始化Git,添加远程源并拉取最新代码。

在本地开发机器上,需使用NPM安装MDM,然后在应用内部运行 mdm generate 命令创建 deploy.json 文件。文件内容如下:

{
  "options": {
    "meteorite": false,
    "insecure": false,
    "meteorRelease": "1.2.0.1"
  },
  "environments": {
    "staging": {
      "hostname": "staging.your-app.com", //host ip or domain
      "port": 22, //port to login with
      "username": "meteor", //new user we created
      "password": "secure-password", //login password
      "deploymentDirectory": "<path/to>", //
      "gitBranch": "master",
      "taskName": "leaderboard"
    }
  }
}

taskName 属性必须与服务器上创建的upstart配置文件名称匹配, deploymentDirectory 必须是服务器上创建的应用目录的路径, gitBranch 属性用于指定要部署的分支。完成所有配置后,将本地代码推送到该分支,然后运行 mdm deploy 命令,接着运行 mdm start 命令,即可在指定服务器上部署并启动应用。更多信息可访问MDM的NPM页面:https://www.npmjs.com/package/meteor-deployment-manager

4. MeteorJS应用的扩展

前面讨论的内容适用于单实例应用。若应用的用户基数增大、流量增加,就需要对系统进行扩展。大多数情况下,可进行水平扩展,即添加更多实例,并将流量路由到当前负载较小的实例。使用 meteor cluster 等扩展解决方案,也可通过为服务器添加更多核心进行垂直扩展。下面详细介绍Nginx和 meteor cluster 如何帮助扩展MeteorJS应用。

  • 使用Nginx进行扩展 :使用Nginx扩展MeteorJS应用时,最好安装支持WebSocket的最新版本Nginx。Nginx可作为负载均衡器,根据每个实例的负载将请求重定向到应用实例。只需更改Nginx配置文件,以适应其他实例并启用粘性会话。

首先进行基本设置,将请求代理到实际应用。以下是Meteor平台打包后使用的基本配置示例:

# we're in the http context here
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}
# the Meteor / Node.js app server
server {
  server_name yourdomain.com;
  access_log /etc/Nginx/logs/yourapp.access;
  error_log /etc/Nginx/logs/yourapp.error error;
  location / {
    proxy_pass http://localhost:3000;
  # http://wiki.Nginx.org/HttpProxyModule
    proxy_set_header X-Real-IP $remote_addr;
  # pass the host header - 
  http://wiki.Nginx.org/HttpProxyModule#proxy_pass
    proxy_set_header Host $host;
    # recommended with keepalive connections - 
    http://Nginx.org/en/docs/http/ngx_http_proxy_module.html# 
    proxy_http_version
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
}

负载均衡配置如下:

upstream myAppName {
  ip_hash;               # for sticky sessions, more below
  server 10.0.0.1:3000;  # server 1, core 1
  server 10.0.0.1:3001;  # server 1, core 2
  server 10.0.0.2:3000;  # server 2, core 1
  server 10.0.0.2:3001;  # server 2, core 2
  # or whatever other appropriate combination
}
server {
  listen 80;
  server_name www.myapp.com
  # and all other "server" directives from previous section
  location / {
    # the "hostname" below must be same myAppName from upstream 
    directive above
    proxy_pass http://myAppName/;
    proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header Host $host;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
}

upstream 指令中使用 ip_hash 指令指定需要粘性会话,这可确保来自同一IP地址的请求下次仍发送到同一实例。根据配置,将有四个实例在不同端口运行,请求将在它们之间进行负载均衡。 proxy_pass 指令中必须使用与 upstream 指令相同的名称。

Nginx还有另一个作用。若想启用SSL,但不想让MeteorJS应用支持它,可配置Nginx支持SSL,并将请求作为非SSL请求传递给应用,这称为SSL终止,Nginx在解决此问题方面表现出色。

有了负载均衡器后,可根据需要运行任意数量的实例来扩展应用。但需注意,添加新实例并重新配置负载均衡器时,会重置现有的DDP连接。

综上所述,MeteorJS应用的构建、部署和扩展涉及多个方面,选择合适的构建工具、部署工具和扩展方法,可确保应用的顺利运行和高效扩展。

深入了解MeteorJS应用的构建、部署与扩展(续)

5. 构建、部署与扩展流程总结

为了更清晰地展示MeteorJS应用从构建到部署再到扩展的整个流程,我们可以通过以下表格和流程图进行总结。

阶段 操作内容 主要工具/命令
构建 使用Isobuild或Demeteorizer进行构建 Isobuild: meteor run meteor deploy meteor build ;Demeteorizer: demeteorizer demeteorizer –debug
部署 使用Meteor Up或Meteor Deployment Manager(MDM)进行部署 Meteor Up: npm install -g mup mup setup mup deploy ;MDM: mdm generate mdm deploy mdm start
扩展 使用Nginx或meteor cluster进行扩展 Nginx:修改Nginx配置文件;meteor cluster:相关配置命令(文中未详细提及,需进一步探索)

下面是对应的mermaid流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始构建应用]):::startend --> B{选择构建工具}:::decision
    B -->|Isobuild| C(运行meteor相关命令):::process
    B -->|Demeteorizer| D(运行demeteorizer相关命令):::process
    C --> E([完成构建]):::startend
    D --> E
    E --> F{选择部署工具}:::decision
    F -->|Meteor Up| G(安装mup并进行设置和部署):::process
    F -->|MDM| H(进行服务器设置并运行mdm命令):::process
    G --> I([完成部署]):::startend
    H --> I
    I --> J{是否需要扩展}:::decision
    J -->|是| K{选择扩展方式}:::decision
    J -->|否| L([结束流程]):::startend
    K -->|Nginx| M(修改Nginx配置文件):::process
    K -->|meteor cluster| N(进行相关配置):::process
    M --> O([完成扩展]):::startend
    N --> O
    O --> L
6. 关键技术点分析
  • Fibers包的影响 :Fibers包是MeteorJS应用中一个重要但又比较特殊的依赖。由于它是平台依赖的,在不同平台之间部署应用时可能会出现问题。例如,在Mac上构建的应用部署到Linux时,需要在目标托管环境中移除并重新安装Fibers包。Demeteorizer在处理这个问题上有一定的优势,它会将Fibers等依赖的NPM包添加到 package.json 文件中,并在目标托管环境中重新安装Fibers包,避免了平台问题。
  • 环境变量的设置 :在部署和运行MeteorJS应用时,环境变量的设置至关重要。无论是使用Meteor Up还是MDM,都需要正确设置诸如 MONGO_URL ROOT_URL PORT 等环境变量。在Meteor Up中,这些变量需要在 mup.json 文件中提供;在MDM中,需要在相关配置文件和命令中进行设置。
  • Nginx的多重作用 :Nginx在MeteorJS应用的扩展中扮演了重要角色。它不仅可以作为负载均衡器,将请求均匀地分配到多个实例上,还可以实现SSL终止,解决应用不支持SSL的问题。通过合理配置Nginx的 upstream server 指令,可以实现粘性会话和负载均衡,确保应用的高效运行。
7. 实际操作中的注意事项
  • 跨平台构建 :如前文所述,跨平台构建时要特别注意平台依赖的包,如Fibers。为了避免不必要的问题,建议在与目标托管环境相似的操作系统和处理器架构的机器上进行构建。
  • 部署工具的选择 :Meteor Up和MDM都有各自的优缺点。Meteor Up适用于Debian/Ubuntu Linux和Open Solaris目标机器,提供了完整的部署解决方案;而MDM要求应用是Git仓库,并且需要在托管服务器上进行一些额外的设置。在选择时,需要根据实际情况进行权衡。
  • 扩展时的连接问题 :使用Nginx进行扩展时,添加新实例并重新配置负载均衡器会重置现有的DDP连接。因此,在进行扩展操作时,需要提前做好规划,尽量减少对用户的影响。
8. 总结与展望

MeteorJS为开发者提供了一个强大的平台,使得构建、部署和扩展Web应用变得更加高效。通过合理使用Isobuild、Demeteorizer等构建工具,Meteor Up、MDM等部署工具,以及Nginx、meteor cluster等扩展方法,可以确保应用在不同阶段的顺利运行。

未来,随着技术的不断发展,MeteorJS可能会有更多的改进和优化。例如,可能会有更简单易用的部署工具出现,或者在扩展方面提供更强大的功能。开发者也可以进一步探索如何结合其他技术,如容器化技术(Docker)和编排工具(Kubernetes),来提升MeteorJS应用的部署和扩展效率。

总之,掌握MeteorJS应用的构建、部署和扩展技术,对于开发高性能、可扩展的Web应用具有重要意义。希望本文能够帮助开发者更好地理解和应用这些技术,在实际项目中取得更好的成果。

提供了一个基于51单片机的RFID门禁系统的完整资源文件,包括PCB图、原理图、论文以及源程序。该系统设计由单片机、RFID-RC522频射卡模块、LCD显示、灯控电路、蜂鸣器报警电路、存储模块和按键组成。系统支持通过密码和刷卡两种方式进行门禁控制,灯亮表示开门成功,蜂鸣器响表示开门失败。 资源内容 PCB图:包含系统的PCB设计图,方便用户进行硬件电路的制作和调试。 原理图:详细展示了系统的电路连接和模块布局,帮助用户理解系统的工作原理。 论文:提供了系统的详细设计思路、实现方法以及测试结果,适合学习和研究使用。 源程序:包含系统的全部源代码,用户可以根据需要进行修改和优化。 系统功能 刷卡开门:用户可以通过刷RFID卡进行门禁控制,系统会自动识别卡片并判断是否允许开门。 密码开门:用户可以通过输入预设密码进行门禁控制,系统会验证密码的正确性。 状态显示:系统通过LCD显示屏显示当前状态,如刷卡成功、密码错误等。 灯光提示:灯亮表示开门成功,灯灭表示开门失败或未操作。 蜂鸣器报警:当刷卡或密码输入错误时,蜂鸣器会发出报警声,提示用户操作失败。 适用人群 电子工程、自动化等相关专业的学生和研究人员。 对单片机和RFID技术感兴趣的爱好者。 需要开发类似门禁系统的工程师和开发者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值