使用 node-http-proxy 从 NodeJS 到 Apache 的反向代理不起作用

Posted

技术标签:

【中文标题】使用 node-http-proxy 从 NodeJS 到 Apache 的反向代理不起作用【英文标题】:Reverse proxy from NodeJS to Apache using node-http-proxy does not work 【发布时间】:2014-01-03 23:18:05 【问题描述】:

在我的 vps 上试验 node.js 时,我偶然发现了一个我似乎无法解决的问题。

我有一个在 ubuntu 13.04 上与 node.js 一起运行的 apache 服务器。我的想法是使用 node-http-proxy 创建一个反向代理。可以找到有关此的足够信息,但我似乎有一个我找不到的错误。

首先我更改了 apache 端口:

NameVirtualHost *:9000
Listen 9000

然后我有我的 hello.js 文件:

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

var options = 
        router: 
                'somesite.com': '127:0:0:1:9000'
        


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

console.log("Proxy server running!");

最后是 apache somesite.com 配置:

<VirtualHost *:9000>
        ServerName somesite.com
        ServerAdmin info@somesite.com
        ServerAlias www.somesite.com

        DocumentRoot /var/www/somesite.com/public_html
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog $APACHE_LOG_DIR/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog $APACHE_LOG_DIR/access.log combined
</VirtualHost>

我在 public_html 中有一个基本的 html 文件,以确保一切正常。 当我启动两个服务器并访问 somesite.com 时,我只看到一个空白网页(如果我检查源代码,则什么都没有,而不是我自己的文件)。

如果我在另一个端口上启动一个简单的节点服务器并将流量路由到该端口,那可以正常工作,所以我假设我的问题与 apache 相关,但我不知道出了什么问题。

编辑 1: 显然我的代理只适用于 somesite.com 而不是 www.somesite.com。如果我访问 somesite.com,我会得到:

 An error has occurred: "code":"EINVAL","errno":"EINVAL","syscall":"connect"

编辑 2: 如果我检查来自 apache 的访问和错误日​​志,它似乎永远不会收到任何东西。找不到我的消息

编辑 3: 我更改了nodejs正在侦听的端口,认为可能以root身份运行与它有关,但即使在随机高端口上运行,它也无法正常工作。它似乎无法在自身和 apache 套接字之间建立连接(当我直接浏览到它时效果很好)。

【问题讨论】:

node-proxy 部分我认为没问题,它在我的机器上完美运行。你试过直接通过9000端口访问html文件吗? 这样可以正常工作 Ehi,你用你的错误“感染”了我;)因为我复制了代码。它不适用于 127.0.0.1,因为实际上你写的是 127:0:0:1:9000 哦,对不起 :) 【参考方案1】:

显然,在 hello.js 脚本中将 127.0.0.1 替换为 localhost 就可以了。不完全确定原因(我猜这与我的主机文件有关),但它可以工作。

【讨论】:

以上是关于使用 node-http-proxy 从 NodeJS 到 Apache 的反向代理不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用node-http-proxy POST,PUT请求报‘socket hang up’错误

通过 node-http-proxy 持久化基于 cookie 的会话

node-http-proxy修改响应结果

Node-http-proxy 动态路由表?

Heroku Node.js node-http-proxy 模块没有这样的应用程序错误

在一个端口上有一个应用程序的节点应用程序使用代理服务器(例如 node-http-proxy)有啥意义?