Как мне запустить Node.js на порту 80?

Моя цель - запустить 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 лучшим способом для достижения этой цели?

Спасибо.

9 ответов

Решение

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

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

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

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

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

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

В настоящее время не рекомендуется запускать узел на порту 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

Ваш код выглядит как пример кода, в котором вы создаете прокси-сервер на основе узла от порта 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.

Если вы не являетесь пользователем root, вы не можете запускать или связываться с портами ниже 1024 (в системе Unix). Чтобы разрешить пользователю без полномочий root запускать узел на порте ниже 1024, используйте эту команду.

$ sudo setcap 'cap_net_bind_service=+ep' $(which node)

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

/questions/44404220/kak-ispolzovat-vhosts-vmeste-s-node-http-proxy/44404265#44404265

У меня была такая же проблема, я просто изменил свой порт на 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

Другие вопросы по тегам