[node.js] 同时运行 Node.JS 和 Apache

Nederlandstalig? U woont in Vlaanderen? Bezoek Vlakbij.me en kom in contact met de beste handelaars in je buurt

通过 Apache 托管 Node.js 网站

我最近花了一些时间研究如何通过 Apache 托管 Node.js 网站,所以我想写一篇文章分享一下我的实现方法。当然,这种方法只有在您已经拥有一台运行 Apache 的服务器,并且希望在对服务器影响/更改最小的情况下添加 Node.js 网站时才有意义。如果您还没有使用 Apache,只是想发布一个 Node.js 网站,最好直接使用 Node.js 来托管,或者在它前面放置 Nginx,因为它比 Apache 更轻量级。但无论如何,这里是如何通过 Apache 实现它的方法。

首先,您需要一种在系统启动时自动启动 Node.js 进程,并在系统关闭时将其关闭的方法。这取决于您运行的服务器类型。就我而言,这是一台 Debian 服务器,所以我直接使用了 Nico Kaiser 的 sysv init 脚本 。另一个流行的替代方案是 upstart 实用程序,如果您使用的是 Ubuntu,它已经预装了。一旦您有了 start|stop|restart 脚本,您还需要一些东西来监控 Node.js 进程,以便在它挂掉时重启它。一个易于使用的工具是 monit 。Nico Kaiser 在 Github 上也为 Node.js 提供了一个很好的示例脚本。

一旦您有了 sysv init 或 upstart 脚本以及 monit,您的 Node.js 进程就可以在服务器上保持运行。当然,您可能将其设置为监听除 80 端口之外的其他端口,因为那是您的 Apache 服务器正在监听的端口。因此,现在您唯一要做的就是配置 Apache,将所有通过 URL 进入 80 端口的 Node.js 网站请求代理到您本地的 Node.js 进程。您首先需要安装 mod_proxy mod_proxy_http 。之后,实现它的配置非常简单:

< VirtualHost 109.74.199.47:80>
ServerAdmin davy.brion@thatextramile.be
ServerName thatextramile.be
ServerAlias www.thatextramile.be
ProxyRequests off
< Proxy *>
Order deny,allow
Allow from all
</ Proxy >
< Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</ Location >
</ VirtualHost >

就是这样。每个进入 http://thatextramile.be 或 http://www.thatextramile.be 的请求都将转发到 Node.js 正在监听的 http://localhost:3000。请注意,ProxyPassReverse 是必需的,以确保所有 HTTP 响应标头都包含代理 URL 而不是真实 URL (localhost)。

如果您需要 Node.js 提供的原始吞吐量,这种解决方案远非最佳。每个通过 Apache 进入的请求都会导致 Apache 线程等待/阻塞,直到从您的 Node.js 进程返回响应。这本质上与通过 Apache 托管 PHP 或 Ruby 时相同,所以这不是问题,但它确实消除了使用 Node.js 的好处之一。同样,这种方法只有在您已经使用 Apache 托管其他网站,并且只想以最小的影响将 Node.js 网站添加到服务器时才适用。

由 Davy Brion 编写,发布于 2012-01-15 15:23:09

参考资料: http://thatextramile.be/blog/2012/01/hosting-a-node-js-site-through-apache/

在 Apache 内部设置代理,

并将以该服务器名称 (ServerName) 进入的所有请求发送到相应的端口。

AD