NodeJS HTTP - прослушивать другой порт, кроме 80 - PullRequest
0 голосов
/ 22 октября 2018

Я запускаю XAMPP в Windows для размещения сервера Apache на порту 80. Теперь я пытаюсь запустить скрипт NodeJS в фоновом режиме, но проблема в том, что он может прослушивать только порт 80. Если это так, всеработает как надо, но у меня не может быть запущен Apache одновременно, потому что Apache имеет приоритет и обслуживает только мой сайт.Скрипт NodeJS даже не слушает.

Мой вопрос: как мне переключить порт прослушивания скрипта NodeJS (конкретный порт на самом деле не имеет значения), чтобы Apache все еще мог работать на порте80, и я могу получить доступ к скрипту NodeJS со всего мира.

Часть кода NodeJS:

const http = require('http');

const port = 8080;
const host = '0.0.0.0';




server = http.createServer( function(req, res) {
    if (req.method == 'POST') {
        var body = '';
        req.on('data', function (data) {
            body += data;
            doStuff(body);
        });
        res.writeHead(200, {'Content-Type': 'text'});
        res.end('received request successfully');
    }
    else {
        res.writeHead(405, {'Content-Type': 'text'});
        res.end('not allowed method ' + req.method + ', try again with GET or POST');
    }

})

server.listen(port, null, function(error){
  if(!!error){
    console.log("\x1b[41m%s\x1b[0m", "error while initializing listener on port " + port + ": " + error);
   }
   else{
    console.log("\x1b[32m%s\x1b[0m", "started listener at 'http://" + host + ':' + port + "'");}
 });

Дополнительная информация есть в моем другом вопросе, который помечен как дубликат.

Ответы [ 6 ]

0 голосов
/ 29 ноября 2018

Если я хочу использовать Apache и Nodejs в одном порту: npm http-proxy-middleware

1.Установите порт Apache = 81

[apache dir] /conf/httpd.conf

~ 59: прослушивание 81

2.Установите порт APP nodejs = 3050

server.listen (3050);// на портах linux <1000 требуется привилегия root </p>

3.Использовать третье прокси-приложение (http-proxy-middleware)

  // https://www.npmjs.com/package/http-proxy-middleware
  var express = require('express');
  var proxy = require('http-proxy-middleware');

  // proxy middleware options
  var options = {
      target: 'http://localhost:81', // target host ROOT
      changeOrigin: true, // needed for virtual hosted sites
      ws: true, // proxy websockets
      pathRewrite: {
          // '^/api/old-path' : '/api/new-path',     // rewrite path
          // '^/api/remove/path' : '/path'           // remove base path        
      },
      router: {
          // Examples:
          // when request.headers.host == 'dev.localhost:3000',
          // override target 'http://www.example.org' to 'http://localhost:8000'
          // 'dev.localhost:3000' : 'http://localhost:8000',
          // 'localhost:9000': 'localhost:9002/sub',                 
          // '/sub': 'http://localhost:9002',

          'localhost': 'http://localhost:81',         //Root to Apache
          'sub.localhost': 'http://localhost:3050',  // internal
          'sub.mydomain.com': 'http://localhost:3050', //external
      },
  };

  // create the proxy (without context)
  // var proxy_wp = proxy(options_wp);
  var proxy_node = proxy(options);

  // mount `exampleProxy` in web server
  var app = express();
  app.use(proxy_node);
  app.listen(80);

Затем:

  1. localhost: 80 - это сайт apache
  2. sub.localhost: 80 - узел
  3. localhost: 80 / подузел, если вы установите

для бегуна задач, я использую npm PM2

0 голосов
/ 28 ноября 2018

Это тот же сценарий, что и при использовании NodeJ в Shared Hosting.Я написал блог об этом здесь

Позвольте мне дать выдержку.

  1. Просто запустите сервер NodeJS, скажем, 8080 порт.

  2. Теперь предположим, что ваш Apache обслуживает http://example.com,, создайте папку в вашем public_html или www.скажем, имя server.Итак, ваш новый путь к папке - http://example.com/server

  3. , создайте .htaccess файл в папке сервера
  4. и добавьте следующие строки,

    RewriteEngine On
    RewriteRule ^$ http://127.0.0.1:8080/ [P,L] #which is your node server ip:port
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ http://127.0.0.1:8080/$1 [P,L] #same ip:port
    

Это перенаправит все запросы с http://example.com/server на ваш сервер Node.

0 голосов
/ 28 ноября 2018

Кажется, что-то уже работает на вашем 8080 порту.Просто перейдите на другой порт.Например, 7000 И убедитесь, что все запросы, которые вы вызываете для приложения nodejs, как это

localhost:7000 // Normal we run at port 80 url simply localhost without port
0 голосов
/ 28 ноября 2018

Я не совсем понял, что вы имели в виду, что вы не получаете никакого ответа, потому что я запустил тот же код, и он прекрасно работает для меня.

Я только заметил кое-что здесь (я сохранил примечаниедля вас в комментарии)

server = http.createServer( function(req, res) {
    if (req.method == 'POST') {
        var body = '';
        req.on('data', function (data) {
            body += data;
            doStuff(body); //you haven't defined doStuff so you will end up with a error message on this line, but you sever will still run fine
        });
        res.writeHead(200, {'Content-Type': 'text'});
        res.end('received request successfully'); 
    }
    else {
        res.writeHead(405, {'Content-Type': 'text'});
        res.end('not allowed method ' + req.method + ', try again with GET or POST');
    }

})

Postman image

При выполнении вашего почтового запроса, не забудьте добавить "" в ваш body area, выберите raw , затем выберите JSON (application / json) .Это должно работать нормально для вас, за исключением того, что вы можете получить reference error, как показано ниже, но вы все равно должны получить ответ received request successfully.

error

            doStuff(body);
            ^

ReferenceError: doStuff is not defined

Убедитесь, что вы делаете то же самое, и дайте нам знать, если ваша проблема решена.

0 голосов
/ 23 ноября 2018

Глядя на ваш другой вопрос , который был помечен как дубликат этого, у вас есть некоторая дополнительная информация, которая, вероятно, поможет выяснить, что вам нужно.В частности, вы упоминаете следующее:

Я хочу разместить несколько серверов http с NodeJS, которые все получают и отправляют запросы http.В то же время я хочу, чтобы Apache работал, который занимает порт 80. Если я отключу Apache и позволю NodeJS работать на порту 80, он будет работать, но я не могу запустить их одновременно.

Этот сценарий будет запускаться и получать запросы локально на порту 8081, но я не могу отправить ему запрос AJAX через Интернет, даже после переадресации порта с помощью моего маршрутизатора:

Я думаю, что @ ankit-agarwal, вероятно, прав в том, что вам нужна настройка обратного прокси-сервера для перенаправления трафика в разные бэкэнды.Предполагая, что у вас есть внешний IP-адрес, вы должны иметь доступ к каждому из ваших бэкэндов, используя порты, которые они прослушивают.Например, если открытый публичный IP-адрес вашего компьютера равен 100.120.110.43:

+---------+------+-------------------------------------+
| Backend | Port |             Web Address             |
+=========+======+=====================================+
| Apache  |   80 | 100.120.110.43 or 100.120.110.43:80 |
| Node1   | 8080 | 100.120.110.43:8080                 |
| Node2   | 8081 | 100.120.110.43:8081                 |
+---------+------+-------------------------------------+

Если вы хотите получить доступ к каждому бэкэнду без указания порта, вам нужно каким-то образом сообщить свой внутреннийсеть, которая обслуживает сервер на основе запроса.Один из способов сделать это - использовать маршрутизацию на основе пути, где вы настраиваете свой обратный прокси-сервер для маршрутизации трафика в разные бэкэнды на основе пути в URL.Вы не опубликовали свою конфигурацию Apache, но вы можете использовать свой текущий сервер Apache для этого, используя директивы ProxyPass и ProxyPassReverse , аналогичные приведенным ниже:

ProxyPass "/node1"  "http://100.120.110.43:8080/"
ProxyPassReverse "/node1"  "http://100.120.110.43:8080/"

ProxyPass "/node2"  "http://100.120.110.43:8081/"
ProxyPassReverse "/node2"  "http://100.120.110.43:8081/"

Крутая вещь в использовании обратного прокси-сервера заключается в том, что вам не нужно показывать серверные части вашего узла.Давайте предположим, что вы этого не сделали, и они доступны только из внутренней сети по адресу 0.0.0.0:port.

Listen 80
<VirtualHost *:80>
    DocumentRoot /www/apache
    ServerName www.apachefrontend.com
    ProxyRequests off
    ProxyPass /node1  http://0.0.0.0:8080/
    ProxyPassReverse /node1  http://0.0.0.0:8080/
    ProxyPass /node2  http://0.0.0.0:8081/
    ProxyPassReverse /node2  http://0.0.0.0:8081/
</VirtualHost>

Вы также можете указать на разные хосты / ips, к которым есть доступ только у вас.

Наконец, вы также можете использовать VirtualHost и ServerName, если у вас есть разные записи DNS для указания на разные бэкэнды.

Listen 80
<VirtualHost *:80>
    DocumentRoot /www/apache
    ServerName www.apachefrontend.com
</VirtualHost>
<VirtualHost *:80>
    ServerName www.nodebackend1.com
    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location />
        ProxyPass /  http://0.0.0.0:8080/
        ProxyPassReverse /  http://0.0.0.0:8080/
    </Location>
</VirtualHost>
<VirtualHost *:80>
    ServerName www.nodebackend2.com
    ProxyRequests off
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
    <Location />
        ProxyPass /  http://0.0.0.0:8081/
        ProxyPassReverse /  http://0.0.0.0:8081/
    </Location>
</VirtualHost>

Чтобы все вышеперечисленное работало, вам необходимо включить mod_proxy и mod_proxy_http в apache.

Вероятно, это не самые надежные примеры, и я их не проверял, но они должны продемонстрировать идею.Вы можете узнать больше здесь .

0 голосов
/ 22 октября 2018

Просто измените свой порт сервера node.js следующим образом:

var server = app.listen(8080, function() {
    console.log('Ready on port %d', server.address().port);
});

, где 8080 - это новый порт сервера node.js.

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