У меня Apache работает под управлением Solaris с использованием модуля mpm, и он прослушивает порт 8080. Время от времени кто-нибудь запускает экземпляр Tomcat на том же хосте. Эффект направляет весь трафик на Tomcat. После завершения работы Tomcat трафик возобновляется на Apache. Я бы хотел, чтобы Apache привязывал исключительно этот сокет, чтобы другие процессы получали ошибку. Это возможно?
Обратите внимание: это окно разработчика, поэтому невозможно ограничить, кто входит в систему или какие программы они запускают. Да, можно и довольно легко изменить порт Tomcat. Проблема в том, что это дефолт порт tomcat. Итак, разработчик разворачивает Tomcat, запускает его, а затем я замечаю, что получаю ошибку Tomcat 404 вместо содержимого Apache. Это приводит меня к тому, что я выслеживаю разработчика и говорю им изменить порт по умолчанию. В идеале Tomcat просто потерпит неудачу.
Когда Java связывает порт, она связывает его в монопольном режиме, и другой процесс не может прослушивать тот же порт. Кажется, что Apache связывает порт в общем режиме. Я бы не подумал, что это потребуется для модуля mpm, но, похоже, это значение по умолчанию. Я ищу параметр компилятора или параметр конфигурации, который привяжет порт в монопольном режиме.
Вы можете повернуть порт 8080
в привилегированный порт, выполнив эту команду:
ndd -set /dev/tcp tcp_extra_priv_ports_add 8080
Это потребует от всех, кто хочет использовать порт 8080
иметь net_privaddr
привилегия (которую вы можете назначить своему smf(5)
метод запуска службы или rbac(5)
профиль, который вы назначаете себе.
Заметка что ndd
команда не сохраняется после перезагрузки, поэтому вам нужно либо создать свой собственный smf(5)
service или используйте устаревший сценарий rc.
Слушатели на самом деле не просто привязываются к порту - они связываются с адресом и портом. Возможно, apache привязан к 0.0.0.0:8080 (иногда пишется *: 8080), а tomcat привязан к порту 8080 на определенном интерфейсе. В этом случае обе привязки могут сосуществовать, и привязка, специфичная для интерфейса, будет иметь приоритет над привязкой с подстановочными знаками. Это может быть то, что с вами происходит.
Самым простым исправлением было бы, чтобы apache выполнял привязку для конкретного интерфейса, а не (или в дополнение) к привязке с подстановочными знаками.
Короче, ищите Listen
строки в вашей конфигурации apache. Если вы видите такую строку:
Listen 8080
или
Listen 0.0.0.0:8080
Добавьте еще одну строку, например:
Listen 1.2.3.4:8080
где 1.2.3.4
IP-адрес хоста.
Вы должны открыть этот порт для прослушивания каким-нибудь небольшим приложением. Сценарий запуска Apache убьет это приложение и запустится нормально :))
Обычно, когда экземпляр Tomcat запускается или перезапускается, он также перезапускает Apache, что приводит к тому, что Apache теряет все ранее связанные порты, если Tomcat получает их первым. В этом случае вам нужно будет отредактировать файл tomcat.conf, чтобы прослушивать порт, который Apache не будет использовать. Скорее всего, это будет означать, что вам также необходимо изменить конфигурацию Apache, чтобы он снова работал правильно с Tomcat.