![如何防止另一个进程监听与 Apache 相同的端口](https://linux22.com/image/499724/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%E5%8F%A6%E4%B8%80%E4%B8%AA%E8%BF%9B%E7%A8%8B%E7%9B%91%E5%90%AC%E4%B8%8E%20Apache%20%E7%9B%B8%E5%90%8C%E7%9A%84%E7%AB%AF%E5%8F%A3.png)
我有一个使用 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 执行特定于接口的绑定,而不是(或除了)执行通配符绑定。
简而言之,查找Listen
Apache 配置中的行。如果您看到类似这样的行:
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 正确配合使用。