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

63

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

Спасибо.

Теги:
proxy
websocket

7 ответов

27
Лучший ответ

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

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

Некоторые другие советы.

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

  • 0
    @PaulM. Благодарю. Как мне связать вторичный IP с портом 80 и node.js, а не с Apache?
  • 0
    С вашими днс есть что-то вроде www.domain.com для 1 ip и chat.domain.com для другого ip. В apache слушай первый ip адрес: Слушай vvv.xxx.yyy.zzz: 80. Затем с узлом сделайте .listen (80, chat.domain.com). Это настройка, которую я использую, и у меня не было проблем с корпоративными брандмауэрами и т. Д.
Показать ещё 5 комментариев
99

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

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

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

  • 0
    Благодарю. Очень полезно.
  • 1
    Также было бы полезно узнать, как отменить это. «- к порту 80» Я не думаю, что это идеальное решение. Это все еще должно справиться с этой привязкой.
Показать ещё 6 комментариев
25

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

  • 0
    Слава за то, что не только предоставил самое элегантное решение, но и предоставил легальную ссылку.
  • 0
    Это как раз то, что мне было нужно. Я потратил некоторое время, ломая голову, пытаясь понять, почему я могу запустить свой сервер Express HTTP в узле на каждом порту, кроме 80.
Показать ещё 4 комментария
18

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

Как вы привязаны к апачу? Проксирование node через 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

  • 4
    Многие люди запускают узел на порту 80. Проксирование через nginx требует некоторых накладных расходов. Также вам не нужен root для запуска через порт 80. Для получения дополнительной информации см. Здесь: comments.gmane.org/gmane.comp.lang.javascript.nodejs/8959 Я не запускаю узел через root самостоятельно.
  • 0
    Спасибо Waquo. Я смотрю на мои варианты банкомата. Nginx может быть путь вперед.
Показать ещё 2 комментария
8

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

При запуске Node вы получаете "адрес в использовании", потому что Apache уже использует порт 80. Если вы хотите использовать Apache для прокси, вы должны использовать Node на другом порту (скажем, 9000) и иметь Apache прослушивает порт 80 и перенаправляет запросы на Node на порт 9000. (т.е. Apache:80 -> Node:9000)

Похоже, что используемая вами библиотека предназначена для противоположного: использование Node в качестве прокси-сервера и пересылки запросов на Apache. В этом случае вы должны настроить Apache на другой порт, чем порт 80. (т.е. Node:80 -> Apache:9000).

Вы хотите сделать Node:80 -> Apache:9000 или Apache:9000 -> Node:80, в конце?

EDIT после комментариев: Если вы хотите сделать Apache:80 -> Node:9000, вы можете использовать mod_proxy в Apache и использовать директивы ProxyPass/ProxyPassReverse, что-то вроде

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

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

  • 0
    Спасибо. Я не слишком уверен. Сожалею! Я хочу, чтобы узел работал на apache: 80. Итак .. Узел: 9000-> Апач: 80. Не слишком уверен, что это правильно.
  • 0
    Если вы хотите запустить Apache на порту 80, то вы должны запустить Node на другом порту, скажем, на порту 9000. В этом случае вы должны настроить Apache для пересылки некоторых его запросов на Node. Я написал бы это как Apache:80 -> Node:9000 чтобы продолжить то, что я написал выше.
Показать ещё 5 комментариев
3

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

https://stackoverflow.com/questions/9368794/how-to-use-vhosts-alongside-node-http-proxy

-2

если вы только что создали режим среды

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

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

  • 3
    Я не являюсь сетевым администратором, но ради безопасности я бы настоятельно рекомендовал не запускать сервер с привилегиями root.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню