web-dev-qa-db-ja.com

Node.jsをポート80で実行するにはどうすればよいですか?

私の目的は、ポート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をプロキシするにはどうすればよいですか?これにより、node.jsをポート80で実行できますか?そして、node-http-proxyがこれを達成する最良の方法ですか?

ありがとうございました。

65
Kit

実行する必要があるのは、実行しているサーバーのIPが2つあることです。 Apacheにはポート80にバインドされた1つのIPがあり、node.jsにはポート80にバインドされたもう1つのIPがあります。

Nodeとそのlistenディレクティブの使用には、2つの値があります。 .listen(80、NODEJS_IPまたはDNS NAME);

その他のアドバイス。

イベントが発生しないため、nodejsでApacheを使用しません。したがって、これは実際には推奨されません。 Nodeとのより良いペアリングとして、NGINXの使用を実際に検討します。

29
PaulM

ハイポート8080またはwhatevでアプリを実行します

Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

NgnixまたはApacheを使用していない場合

98
fullstacklife

最も簡単な解決策:ノードアプリをポート80で実行するように安全に設定します。

  • Sudo apt-get install libcap2-bin
  • Sudo setcap cap_net_bind_service=+ep /path/to/node
  • タダ!できました。

なぜ私はそれが好きですか?

  • Apacheまたはnginxを使用する必要はありません
  • ルートとしてアプリケーションを実行する必要はありません
  • ポートを転送する必要はありません(マシンを起動するたびに処理します)

参照リンク: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-an-ubuntu-vps (クラウドホスティングでノードアプリをセットアップする方法に関する優れた記事)。

28
Kyle Chadha

ノードをルートとして実行する必要があるため、現在ポート80でノードを実行することはお勧めしません。

あなたは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

18
Waquo

コードは、ポート80からポート9000にノードベースのプロキシを作成し、ポート9000にノードベースのHTTPサーバーを作成するコード例のように見えます(つまり、Node:80 -> Node:9000

Apacheがすでにポート80を使用しているため、Nodeを起動すると「使用中のアドレス」を取得しています。Apacheをプロキシに使用する場合は、Node =別のポート(たとえば9000)で、Apacheがポート80でリッスンし、ポート9000でNodeに要求を転送します。つまり、Apache:80 -> Node:9000

使用しているライブラリは、逆を行うためのものであるようです。プロキシとしてNodeを使用し、Apacheにリクエストを転送します。この場合、ポート80以外のポートで実行するようにApacheを構成する必要があります。(つまりNode:80 -> Apache:9000)。

Node:80 -> Apache:9000 または Apache:9000 -> Node:80、 最終的には?

コメント後に編集:Apache:80 -> Node:9000、使用できますmod_proxy ApacheでProxyPass/ProxyPassReverseディレクティブを使用します。

ProxyPass /nodeurls/ http://localhost:9000/
ProxyPassReverse /nodeurls/ http://localhost:9000/  

ここで、nodeurlsは、ApacheがNodeに転送するURLのファミリーです。

8
nicolaskruchten

私は同じ問題を抱えていましたが、ここでnode-http-proxyを使用してポート80でリッスンし、エクスプレスまたはApacheに転送する方法を解決しました。

https://stackoverflow.com/a/9645091/50027

3
uglymunky