购买若干服务器很容易,然后在这些服务器上运行一些 Node 进程。But how can these distinct servers be coordinated such that they form part of a single application? One aspect of this problem concerns clustering multiple identical servers around a single entry point. How can client connections be shared arcoss a pool of servers?
1、Forward and reverse proxies
A proxy is someone or something acting on behalf of another.
A forward proxy normally works on behalf of clients in a private network,brokering requests to an outside network,such as retrieving data from the Internet.
网络管理员当需要限制对外界的访问时就需要用到 forward proxies。如果用户通过 e-mail 附件下载恶意软件,管理员就可以阻止对那个地址的访问。在一个办公室网络中可能会限制对社交网站的访问。一些国家会通过这种方式限制对外界网站的访问。
A reverse proxy,一点也不奇怪,工作方式正好相反,它接受来自公共网络的请求 and serving those requests within a private network the client has little much visibility into. Direct access to servers by clients is first delegated to a reverse proxy:
This is the type of proxy we might use to balance requests from clients across many Node servers.
我们将会在扩展 Node 时看看怎样实现 reverse proxies,讨论一些实现,如利用 Nginx 以及 利用 native Node modules。
2、Nginx 作为 proxy
当把 Node 服务器隐藏在一个 proxy 后面时,Nginx 是一个受欢迎的选择。Nginx 是一个非常受欢迎的高性能 web 服务器,它常常被用作为一个 proxy 服务器。
【 Nginx 使用很少的资源就能够每秒处理更多的请求,就是因为它的架构。它有一个 master process,该 process 将工作委托给一个或更多个 worker processes。每个 worker 都是以 event-driven 或 asynchronous 的方式处理多个请求,它利用了来自 Linux 内核的特殊功能(epoll/select/poll)】。
Nginx 还让简单的负载均衡变得容易。在例子中,我们会讲解如何用 Nginx 作为代理,同时还开箱即用得支持负载均衡。
假设你已经安装了 Nginx,这个时候要修改 nginx.conf,特别是其中的 http 部分。目标就是创建一个 Nginx 服务器,它的唯一责任就是均匀地将请求分发到一组 Node 服务器。这样整个系统的容量就扩充了,同时又不需要改动关于一个客户端如何或应当连接到我们的应用程序的任何东西。
在 nginx.conf 中的 http 部分定义了一些 upstream servers that will be candidates for redirection:
http {
...
upstream app_myservers {
server first.example.com;
server second.example.com;
server third.example.com;
}
...
}
现在,我们已经建立好了 the candidate pool, 我们就需要配置 Nginx,让它将请求转发到它的其中一个成员。
server {
listen 0.0.0.0:80;
server_name example.com my_website;
...
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://app_myservers/;
proxy_redirect off;
}
}
关键的一行是:proxy_pass http://app_myservers/; 它和我们的 upstream 定义是一样的。发生什么事情这个时候应该很清楚了:一个 Nginx 服务器监听 80 端口,将会将请求传递到 app_myservers 中的一个服务器定义。如果 upstream 定义中只有一个服务器,那个服务器就会接管所有的 traffice。如果定义了多个服务器,则 Nginx 会尝试均匀地分发 traffic。
【也可以用上述方法负载均衡多个本地服务器。你只需要在不同的端口上运行不同的 Node 服务器,例如 127.0.0.1:8001,127.0.0.1:8002】
因为我们很可能想要更精确地控制 traffice 是如何在 upstream servers 上分发的。所以有一些指令可以被运用到我们的 upstream server 定义上。
为了控制 traffice 分发的相对权重,要用到 weight 指令:
upstream app_myservers {
server first.example.com weight=1;
server second.example.com weight=2;
server third.example.com weight=4;
}
还有2个有用的指令,它们一起管理着连接的失败:
.max_fails:This is the number of times communication with a server fails
prior to marking that server as inoperative. The period of time within which
these failures must occur is defined by fail_timeout.
.fail_timeout:The time slice during which max_fails must occur, indicating
that a server is inoperative. This number also indicates the amount of time
after a server is marked inoperative that Nginx will again attempt to reach
the flagged server.
例如:
upstream app_myservers {
server first.myservers.com weight=1 max_fails=2 fail_
timeout=20s;
server second.myservers.com weight=2 max_fails=10 fail_
timeout=5m;
server third.myservers.com weight=4;
}
相关推荐
- 可以通过配置该插件生成多个HTML页面,适应多页应用的需求。 6. **打包与部署**: - 在生产环境中,使用`--mode=production`标志启动Webpack,它会启用各种优化,如代码压缩、去除注释等。 - 部署时,将...
标题提及的 "Node.js-GridControl 将多个服务器链接在一起组成一个网格" 指的是 GridControl 提供了一种方法,将多个独立的服务器节点连接成一个统一的计算网格。这种网格结构能够有效地分配任务、负载均衡,并且...
它利用了Node.js的异步I/O特性,能够高效地处理多个并发请求,并且可以通过扩展来支持更多的功能,比如路由、模板渲染等。通过这个项目,你可以深入理解Web服务器的工作原理,并提升你的Node.js技能。
**NodeRed一机多端口实例创建和无网部署** ...通过以上步骤,你可以在一台机器上高效地管理和运行多个独立的NodeRed实例,并在无网络环境中稳定运行。这对于开发、测试或生产环境都是十分有用的。
在IT行业中,Node.js是一个非常流行的JavaScript运行环境,它允许开发者使用JavaScript进行后端开发。本教程将聚焦于如何利用Node.js搭建一个简单的静态资源服务器,这对于开发和测试前端项目非常实用。 首先,我们...
在这个名为 "Node.js-使用Node编写的一系列RESTAPI已运行在我自己的服务器中可直接调用同时提供https支持" 的项目中,开发者构建了一套基于 RESTful 风格的 API 服务,这些服务通过 Node.js 实现,并部署在个人...
游戏服务器的基本设计应包含多个核心模块,例如用户认证、状态管理、游戏逻辑处理、网络通信等。在HTTP方式可用的前提下,我们可以利用Node.js的内置http模块来处理客户端的请求,实现游戏数据的交互。此外,描述中...
【Node.js】:Node.js是基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript编写代码,提供了一个高效的事件驱动、非阻塞I/O模型,非常适合处理并发连接,如聊天服务器。 【Express】:...
OWT媒体服务器的核心功能在于其能力将单个WebRTC流分发到多个端点,这意味着可以同时为众多用户提供高质量的视频会议体验,极大地扩展了WebRTC的应用场景。不仅如此,它还内置了媒体分析功能,允许对媒体流进行实时...
在IT行业中,Node.js是一个非常流行的JavaScript运行环境,它允许开发者使用JavaScript进行后端开发,构建高效、可扩展的网络应用程序。本知识点将详细讲解如何使用Node.js搭建一个Web服务器,以及处理请求URL不正确...
`uptimey` 是一个基于 `Node.js` 的开源服务器正常运行时间监视器,专为跟踪和确保服务的高可用性而设计。它允许开发者轻松地监控他们的服务器和应用程序,确保在出现故障时能够及时收到警报,从而提高系统的稳定性...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者可以用 JavaScript 语言编写服务器端程序。由于其轻量级、高效的特点,Node.js 成为了搭建本地 Web 服务器的首选工具之一。在本文中,我们将...
Node.js是一个开放源代码、跨平台的JavaScript运行环境,它允许开发者使用JavaScript编写服务器端应用,极大地提升了开发效率和应用性能。 **Node.js的诞生与理念** Node.js由Ryan Dahl于2009年创立,其核心理念是...
描述中的“多人Minecraft社区”意味着该服务器旨在吸引和容纳多个玩家同时在线,提供了一个共享的游戏空间。这种社区通常会设立自己的规则、活动和特色功能,比如排行榜、市场、PvP区域等,以增加游戏的可玩性和社区...
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...
这个软件包通常包含了NVM(Node Version Manager),它是一个方便的工具,可以让你在一台机器上安装并轻松切换多个Node.js版本。 NVM(Node Version Manager)是Node.js版本管理器的简称,它最初为Unix-like系统...
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...
Node.js是目前非常流行的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行开发。然而,随着Node.js的频繁更新,不同项目可能需要支持不同的版本,这给开发和维护带来了挑战。为了解决这个问题,社区...
Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 Node.js 内部使用 Google V8 JavaScript 引擎来执行代码;大部分基本模块都是用...