Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用iptables模拟不在端口中侦听的mysql?_Php_Mysql_Iptables - Fatal编程技术网

Php 如何使用iptables模拟不在端口中侦听的mysql?

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

我使用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内核


有没有办法在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
检查服务器是否已启动。