Php 如何使用iptables模拟不在端口中侦听的mysql?
我使用php中的mysql\u nd连接到mysql数据库,并在多个从服务器和主服务器之间进行故障切换,因此当mysql不在服务器上运行时,一切正常,所有查询都转到其他服务器 我需要让mysql服务器启动并在服务器中运行,但阻止所有传入的连接,以便php中的mysql\u nd驱动程序认为服务器已关闭。我以为一个简单的拒绝与potables将是足够的,但不是;数据包被拒绝,没有建立mysql连接,但php应用程序的行为不同,php线程等待并增加,直到达到最大值 如果mysql服务关闭,mysql会立即检测到它,请求会转发到其他服务器,不会减速,也不会在web服务器上堆积php线程 即使在mysql服务运行的情况下,只要我添加或插入带有reject的iptbles规则,请求也会转发到其他服务器,但php会堆积起来,就好像与mysql的连接出于任何原因保持打开一样,因此,我假设将带有iptables的数据包拒绝到一个端口,返回的结果不同于在该端口中没有任何侦听的linux内核Php 如何使用iptables模拟不在端口中侦听的mysql?,php,mysql,iptables,Php,Mysql,Iptables,我使用php中的mysql\u nd连接到mysql数据库,并在多个从服务器和主服务器之间进行故障切换,因此当mysql不在服务器上运行时,一切正常,所有查询都转到其他服务器 我需要让mysql服务器启动并在服务器中运行,但阻止所有传入的连接,以便php中的mysql\u nd驱动程序认为服务器已关闭。我以为一个简单的拒绝与potables将是足够的,但不是;数据包被拒绝,没有建立mysql连接,但php应用程序的行为不同,php线程等待并增加,直到达到最大值 如果mysql服务关闭,mysql
有没有办法在iptables上实现这种行为?一个服务器如果公开了一个关闭的端口,就会拒绝连接。在我看来,这似乎很好地由iptables拒绝规则建模。如果你的应用程序服务器在启动时尝试连接到数据库,但还没有准备好,那么这也可能是你得到的,因此这是一个需要处理的有效案例,尽管你可能不得不不遗余力地复制。您可能也应该让这个响应起作用 但是,完全没有响应的服务器不能发送拒绝连接或拒绝任何类型的数据包。iptables丢弃可以更好地模拟这种行为,它简单地丢弃数据包而不需要额外的响应。连接最终在客户端超时,从而对客户端请求引入一些限制
您可以在这里了解更多关于拒绝和删除之间的区别,但出于您的目的,只需说明无法响应(不存在或不起作用)的服务器是由drop建模的,而不会响应(不侦听端口或显式拒绝)的服务器是由reject建模的 我在回答我自己的问题;经过一些挖掘,在linux中我需要使用特定的tcp标志进行拒绝,否则php线程将保持打开状态并等待php超时 适当的iptables线路应为: iptables-A输入-s xx.xx.xx.xx-p tcp-m tcp--dport 3306-j拒绝--通过tcp重置拒绝
这样,当使用mysql的php客户端立即检测到服务关闭并将查询重定向到剩余的从属服务器时,我可以正确地关闭从属服务器上的mysql服务。为什么不在php代码中执行查询:
Select 1
检查服务器是否已启动。