如何防止另一个进程监听与 Apache 相同的端口

如何防止另一个进程监听与 Apache 相同的端口

我有一个使用 mpm 模块运行 Solaris 的 Apache,它监听端口 8080。每隔一段时间,有人会在同一台主机上启动 Tomcat 实例。这会导致所有流量都流向 Tomcat。一旦 Tomcat 关闭,流量就会恢复到 Apache。我希望 Apache 独占地绑定此套接字,这样其他进程就会出错。这可能吗?

请注意,这是一个开发框,因此无法限制谁登录或他们运行什么程序。是的,可以更改 Tomcat 端口,而且非常容易。问题是这是默认tomcat 端口。因此,开发人员解压 Tomcat 并启动它,然后我注意到我收到的是 Tomcat 404 错误而不是 Apache 内容。这让我追踪开发人员并告诉他们更改其默认端口。理想情况下,Tomcat 会失败。

当 Java 绑定端口时,它会以独占模式绑定它,而另一个进程无法侦听同一端口。Apache 似乎以共享模式绑定端口。我不认为 mpm 模块需要这样做,但它似乎是默认的。我正在寻找一个编译器选项或配置选项,它将以独占模式绑定端口。

答案1

侦听器实际上并不只是绑定到端口 - 它们还绑定到地址和端口。可能是 apache 绑定到 0.0.0.0:8080(有时写为 *:8080),而 tomcat 绑定到特定接口上的端口 8080。在这种情况下,两种绑定可以共存,并且特定于接口的绑定将优先于通配符绑定。这可能就是您遇到的情况。

最简单的修复方法是让 apache 执行特定于接口的绑定,而不是(或除了)执行通配符绑定。

简而言之,查找ListenApache 配置中的行。如果您看到类似这样的行:

Listen 8080

或者

Listen 0.0.0.0:8080

添加另一行,例如:

Listen 1.2.3.4:8080

其中,1.2.3.4是主机的 IP 地址。

答案2

您可以8080通过运行以下命令将端口转变为特权端口:

ndd -set /dev/tcp tcp_extra_priv_ports_add 8080

这将要求任何想要使用端口的人8080都有net_privaddr权限(您可以将其分配给您的smf(5)服务启动方法,或者rbac(5)分配给您自己指定的配置文件。

笔记ndd命令在重启后不会继续存在,因此您需要创建自己的smf(5)服务或使用旧的 rc 脚本。

答案3

您应该打开此端口,让一些小应用程序监听。Apache 启动脚本将终止该应用程序,并正常启动 :))

答案4

通常,当 Tomcat 实例启动或重新启动时,它也会重新启动 Apache,这将导致 Apache 丢失它之前绑定的任何端口(如果 Tomcat 首先获取这些端口)。在这种情况下,您需要编辑 tomcat.conf 文件以监听 Apache 不会使用的端口。这可能意味着您还需要更改 Apache 配置,以便它再次与 Tomcat 正确配合使用。

相关内容