Как мне запустить Node.js на порту 80? - PullRequest
65 голосов
/ 24 мая 2011

Моя цель - запустить Node.js на порту 80. Это связано с тем, что я обнаружил, что node.js заблокирован в определенных сетях, которые не допускают трафик от других портов.

Похоже,лучший способ сделать это, прокси Apache через Node.js.Я попытался использовать 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. Должно быть, я что-то не так делаю.* Как мне прокси-сервер Apache через node.js, используя node-http-proxy?Позволит ли это мне запускать node.js на порту 80?И является ли node-http-proxy лучшим способом для достижения этой цели?

Спасибо.

Ответы [ 7 ]

98 голосов
/ 27 июля 2011

запустите ваше приложение на старшем порту 8080 или whatev, затем

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

Если вы не используете ngnix или apache

29 голосов
/ 24 мая 2011

Что вам нужно сделать, это иметь 2 IP-адреса для сервера, на котором вы работаете. Apache имеет 1 ip, привязанный к порту 80, а затем для node.js другой ip, связанный с портом 80.

Использование node и его директивы listen имеет 2 значения, например. .listen (80, NODEJS_IP или DNS NAME);

Несколько других советов.

Я бы не использовал apache с nodejs, поскольку он не выровнен. Так что это действительно не рекомендуется. На самом деле я бы хотел использовать NGINX, так как он намного лучше соединяется с Node.

28 голосов
/ 06 января 2015

Самое простое решение: безопасно настроить приложение узла для работы на порту 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 (отличная статья о том, как настроить приложение вашего узла на облачном хостинге).

18 голосов
/ 24 мая 2011

В настоящее время не рекомендуется запускать узел на порту 80, поскольку для этого требуется запуск узла в качестве пользователя root.

Насколько вы привязаны к apache? Прокси-узел через nginx - это проверенное и верное решение с конфигурацией nginx, такой как это:

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

8 голосов
/ 24 мая 2011

Ваш код выглядит как пример кода, в котором вы создаете прокси-сервер на основе узла с порта 80 на порт 9000, а затем создаете HTTP-сервер на основе узла на порту 9000. (т.е. Node:80 -> Node:9000)

Вы получаете «используемый адрес» при запуске Node, потому что Apache уже использует порт 80. Если вы хотите использовать Apache для прокси, вы должны использовать Node на другом порту (скажем, 9000) и 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, вы можете использовать mod_proxy в Apache и использовать директивы ProxyPass / ProxyPassReverse, что-то вроде

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

, где nodeurls - это семейство URL, которые вы хотите, чтобы Apache перенаправлял на Node.

3 голосов
/ 10 марта 2012

У меня возникла та же проблема, вот как я решил ее, используя node-http-proxy для прослушивания через порт 80, а затем переадресацию на экспресс или apache.

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

0 голосов
/ 19 июня 2014

если вы просто в режиме разработки среды

вы можете su root, то

node index.js или ./node_modules/coffee-script/bin/coffee index.coffee

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...