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