我的目标是在端口 80 上运行 Node.js。这是因为我发现 node.js 被某些不允许来自任何其他端口的流量的网络阻止。
似乎最好的方法是通过 Node.js 代理 Apache。我曾尝试使用 node-http-proxy 来执行此操作,但我没有任何运气。
我正在使用的代码在这里:
var util = require('util'),
http = require('http'),
httpProxy = require('http-proxy');
httpProxy.createServer(9000, 'localhost').listen(80);
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
res.end();
}).listen(9000);
但是我不断收到端口 80 的错误“正在使用的地址”。我一定是做错了什么。
如何使用 node-http-proxy 通过 node.js 代理 Apache?这将使我能够在端口 80 上运行 node.js 吗? node-http-proxy 是实现这一目标的最佳方式吗?
谢谢你。
在高端口 8080 上运行您的应用程序或其他什么
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
如果您不使用 ngnix 或 apache
最简单的解决方案:安全地将您的节点应用程序配置为在端口 80 上运行。
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /path/to/node
达达!你完成了。
为什么我喜欢它?
您不必使用 apache 或 nginx
您不必以 root 身份运行您的应用程序
您不必转发端口(并在每次机器启动时处理)
参考链接:https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps(一篇关于如何在云托管上设置节点应用程序的精彩文章)。
您需要做的是为您正在运行的服务器提供 2 个 ip。 Apache 将 1 个 ip 绑定到端口 80,然后 node.js 将另一个 ip 绑定到端口 80。
使用节点及其监听指令有 2 个值,例如。 .listen(80, NODEJS_IP 或 DNS 名称);
其他一些建议。
我不会将 apache 与 nodejs 一起使用,因为它没有发生。所以这个真的不推荐。我实际上会考虑使用 NGINX 作为它与 Node.js 的更好配对。
目前不建议在端口 80 上运行 node,因为这需要以 root 身份运行 node。
你对 apache 的依恋程度如何?通过 nginx 代理节点是一个久经考验的真正解决方案,其 nginx-config 如下所示:
upstream node_cluster {
ip_hash;
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
server {
listen 0.0.0.0:80;
server_name foo;
access_log /var/log/nginx/foo.log;
location / {
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_pass http://node_cluster/;
proxy_redirect off;
}
}
Nginx 文档:
http://wiki.nginx.org/HttpProxyModule
http://wiki.nginx.org/HttpUpstreamModule
nginx
不太熟悉,以确保它实际上是可能的......
您的代码类似于示例代码,您在其中创建从端口 80 到端口 9000 的基于节点的代理,然后在端口 9000 上创建基于节点的 HTTP 服务器。(即 Node:80 -> Node:9000
)
当您启动 Node 时,您会得到“正在使用的地址”,因为 Apache 已经在使用端口 80。如果您想使用 Apache 进行代理,您必须在不同的端口(比如 9000)上使用 Node,并让 Apache 在端口 80 上侦听并转发在端口 9000 上对节点的请求。(即 Apache:80 -> Node:9000
)
看起来您正在使用的库是为了做相反的事情:使用 Node 作为代理并将请求转发到 Apache。在这种情况下,您必须将 Apache 配置为在端口 80 以外的另一个端口上运行。(即 Node:80 -> Apache:9000
)。
你到底是想做Node:80 -> Apache:9000
还是Apache:9000 -> Node:80
?
评论后编辑:如果您想做 Apache:80 -> Node:9000
,您可以在 Apache 上使用 mod_proxy
并使用 ProxyPass
/ProxyPassReverse
指令,例如
ProxyPass /nodeurls/ http://localhost:9000/
ProxyPassReverse /nodeurls/ http://localhost:9000/
其中 nodeurls
是您希望 Apache 转发到 Node.js 的 URL 系列。
Apache:80 -> Node:9000
以继续我上面所写的内容。
Apache:80 -> Node:9000
而不是 Node:80 -> Node:9000
。
我遇到了同样的问题,这是我使用 node-http-proxy 在端口 80 上侦听,然后转发到 express 或 apache 的方法。
https://stackoverflow.com/a/9645091/500270
如果您是非 root 用户,则不能使用低于 1024 的端口运行或绑定(在 Unix 系统中)。要允许非 root 用户可以在低于 1024 的端口上运行节点,请使用此命令。
$ sudo setcap 'cap_net_bind_service=+ep' $(which node)
我有同样的问题,我只是将我的端口更改为 8080 并且它工作。
httpsServer.listen(8080, () =>
console.log(chalk.rgb(208, 60, 240)(`Server listening on port: 8080`))
);
如果您只是处于开发环境模式
您可以su root
,然后
node index.js
或 ./node_modules/coffee-script/bin/coffee index.coffee