我的目标是在端口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是实现这一目标的最佳方式吗?
谢谢。
答案 0 :(得分:98)
在高端口8080或whatev上运行您的应用程序
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
如果您不使用ngnix或apache
答案 1 :(得分:29)
您需要做的是为您正在运行的服务器安装2个ip。 Apache有1个ip绑定到端口80,然后node.js将另一个ip绑定到端口80。
使用node及其listen指令有2个值,例如。 .listen(80,NODEJS_IP或DNS NAME);
其他一些建议。
我不会将apache与nodejs一起使用,因为它没有被解决。所以这真的不推荐。我实际上会考虑使用NGINX作为与Node更好的配对。
答案 2 :(得分:28)
最简单的解决方案:安全地将您的节点应用配置为在端口80上运行。
sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /path/to/node
为什么我喜欢它?
参考链接:https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps(关于如何在云托管上设置节点应用的精彩文章)。
答案 3 :(得分:18)
目前不建议在端口80上运行节点,因为这需要以root身份运行节点。
你对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文档:
答案 4 :(得分:8)
您的代码看起来像示例代码,您在其中创建从端口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的URL系列。
答案 5 :(得分:3)
我遇到了同样的问题,这是我如何使用node-http-proxy解析端口80,然后转发到express或apache。
答案 6 :(得分:0)
如果您是非root用户,则不能使用低于1024的端口运行或绑定(在Unix系统中)。要允许非root用户在低于1024的端口上运行节点,请使用此命令。
$ sudo setcap 'cap_net_bind_service=+ep' $(which node)
答案 7 :(得分:-3)
如果你只是在开发环境模式
你可以su root
,然后
node index.js
或./node_modules/coffee-script/bin/coffee index.coffee