1

Я использую приложение node.js на порт 80 127.0.0.2:80

server.listen(80, '127.0.0.2', function() {...

И я хочу использовать Apache на порту 80 другого IP-адреса, скажем, 127.0.0.3:80 , поэтому у меня есть это в моем httpd.conf

Listen 127.0.0.3:80
ServerName 127.0.0.3:80

Но это дает мне ошибку

Порт Apache (80) уже используется другим приложением!

Почему Apache заботится о случайном порте 80 независимо от того, на каком IP-адресе 80 он сам запрограммирован для прослушивания? Насколько это необходимо, порт 80 на 127.0.0.3:80 все еще свободен.

Я даже пошел дальше и попробовал это с другими сериями IP (192.xxx, 122.xxx), но Apache хочет, чтобы порт 80 был свободным, полная остановка.

Странно то, что если я сначала запускаю Apache, он запускается без проблем, а затем я могу даже запустить node.js с одинаковой конфигурацией, описанной выше, и они оба работают нормально. Но драгоценный Apache по какой-то причине не любит, когда кто-либо слушает порт 80 любого IP-адреса до того, как его высочайший шанс сможет начать сначала.

Я неправильно понимаю, что если приложение прослушивает 127.0.0.2:80 то только 80-й порт IP-адреса должен быть занят, а другой 80-й порт должен быть свободным 127.0.0.3:80? Или Apache плохо себя ведет?

1 ответ1

2

Обратите внимание, у меня есть предложенное базовое решение в конце этого ответа.

HTTP использует TCP по умолчанию, и хотя UDP поддерживает привязку нескольких программ к одному порту, TCP обычно этого не делает. Таким образом, порт 80 может показаться свободным для данного IP-адреса в этом случае, так как, скорее всего, может быть только одна программа, использующая порт 80 (TCP) с этим IP-адресом одновременно на локальном компьютере.

Что касается отдельных IP-адресов обратной связи, помните, что весь сетевой блок 127.xxx зарезервирован для локальной обратной связи. Таким образом, 127.0.0.1 относится к тому же компьютеру (то есть локальному хосту), что и 127.0.0.2 (или 127.0.0.3 или 127.127.127.127 и т.д.). А поскольку вы используете адрес обратной связи 127.xxx, а не "реальные" IP-адреса (т. Е. Те, которые идентифицируют отдельные реальные или виртуальные сетевые адаптеры), порт 80 с данным IP-адресом может уже использоваться другим приложением при запуске второго.

И да, в то время как Apache может делать виртуальный хостинг с локальными IP-адресами обратной связи (т. Е. 127.0.0.1 и 127.0.0.2 могут возвращать разные страницы), процесс Apache по-прежнему привязан к порту 80 (TCP) глобально по умолчанию.

Странно то, что если я сначала запускаю Apache, он запускается без проблем, а затем я могу даже запустить node.js с одинаковой конфигурацией, описанной выше, и они оба работают нормально.

Я не уверен, что здесь ссылается на «работает [нормально]», но после запуска Apache, после попытки запустить http-сервер Node.js на порту 80 (npm install http-server -g), я получил ошибку, даже если был указан адрес, такой как 127.0.0.4.

образ http-сервера node.js, который не запускается

В моем конфигурационном файле я должен был убедиться, что Apache специально слушал 127.0.0.1:80, а http-сервер слушал 127.0.0.4:80. Если у меня только что был Listen 80 в Apache, http-сервер не работал. Apache отказывается запускаться совершенно нормально, как для самого Apache, так и с точки зрения принципа только одной комбинации TCP IP/ порт на процесс.

Решение

Простым решением этой проблемы является запуск нескольких сетевых карт на одном компьютере (каждый со своим уникальным IP-адресом). Таким образом, каждый сетевой адаптер может иметь собственную привязку порта 80 (IP+ порт = полный адрес назначения). Другая возможность состоит в том, чтобы попробовать "виртуальные интерфейсы" для NIC (чтобы вы могли назначить два "виртуальных" IP-адреса одному и тому же NIC).

https://stackoverflow.com/questions/1694144/can-two-applications-listen-to-the-same-port

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .