同时使用node.js和Apache-利用反向代理

软件工程大作业使用J2EE来做的,对java的web开发不太熟,一直在想怎么用node.js来做分给我的一部分任务。当然首先要处理的问题是Node.js和Tomcat怎么同时对80端口进行处理,一般想到的就是反向代理咯。怎么感觉标题有点出入,这问题变成了同时使用node.js和Tomcat哟。。。

导航目录

  1. Apache放在前监听80端口
  2. Node.js放在前监听80端口

Apache放在前监听80端口,反向代理Node.js

Apache、Nignx等服务器软件默认是通过80端口处理Web请求的,我们想要的是多个服务器软件共存并处理80端口的不同请求(忽略负载均衡),这时Apache的两个功能:URL地址重写和配置反向代理,都可以实现。

Apache可以通过.htaccess文件,使用地址重写功能(如何开启地址重写)来实现对Node的Web请求:

<IfModule mod_rewrite.c>
    RewriteEngine on

    #Redirect a whole subdirectory:
    RewriteRule ^node/(.+) http://examples.jim0.com:3000/$1 [P]
</IfModule>

之前说了使用Tomcat,所以除了重写URL,还可以使用Apache将80端口请求反向代理到不同端口,分别分发给Tomcat或者Node.js处理。比如我的Node服务器监听着3000端口,这时配置一个来自node.jim0.com域名的请求,全部转发到3000端口:

<VirtualHost *:80>
    ServerName node.jim0.com
    ServerAlias *.node.jim0.com
    DirectoryIndex index.html news.html index.htm index.php
    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

此时访问node.jim00.com的请求将全部由node处理。

以上两种方式都是把Apache放在前面处理80端口,每次请求都必然经过Apache,正如《Node学习指南》中说:

这两种实现方式的共同问题在于所有的请求都需要通过Apache,对每一个请求,Apache都需要创建进程来进行处理。Node的重点在于避免这部分开销过大。

如果你服务器上的Node是主要处理程序并想要大量使用,可以使用Node在前Apache在后的实现方式。

Node.js放在前监听80端口

正如之前所说,如果想要使用Node处理大部分请求,并将部分请求转发给Apache、Tomcat等其他服务,首先你需要root权限来修改Apache的默认端口,编辑/etc/httpd/conf/httpd.conf文件,找到

Listen 80

修改为你想要的端口,比如79

Listen 79

然后使用Node.js创建一个代理服务器分发80端口的请求。Node有很多实现代理的模块,这里使用http-proxy,将对子目录public的请求转发给apache处理,对node的请求转发给监听3000端口的node服务器处理:

var httpProxy = require('http-proxy');

var options = {
    router: {
        'jim0.com/pulic_html': '127.0.0.1:79',
        'jim0.com/node': '127.0.0.1:3000'
    }
};

var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);

标签: apache, tomcat, node.js, 反向代理, 地址重写

添加新评论