Обратите внимание, у меня есть предложенное базовое решение в конце этого ответа.
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.
В моем конфигурационном файле я должен был убедиться, что 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