<bash> 获取所有活动的 nginx 连接的 PID 并杀死单个连接

<bash> Get PID of all active nginx connections and kill single one

我需要从已建立的到工作进程的 nginx 连接中终止进程 ID。

有没有办法从所有 nginx 建立的连接中获取 PID?

如果我在 nginx 工作进程上执行 netstat,我将从工作进程获取 pids,这些进程在我终止与其连接的进程后需要保持活动状态。

我试过 netstat -anp | grep "client_ip_address" | grep ESTABLISHED

我得到这个:

tcp   0  0  client_ip:dest_port  client_ip:source_port   ESTABLISHED 15925/nginx: worker

所以 15925 将是当我终止与它的连接时需要保持活动状态的进程 ID。

有办法吗?

我使用 grep 的 PERL 正则表达式来实现这样的事情。

$ PID_TO_KILL=`netstat -anp | grep "client_ip_address" | grep ESTABLISHED | grep -Po "(?<=ESTABLISHED).*(?=\/nginx)"`
$ kill -9 $PID_TO_KILL

我想您可能混淆了进程 ID 和连接。 Nginx 启动一个主进程,然后产生一些工作进程。在一个相当繁忙的系统上,您可能只有(比如说)5 个工作人员。

随着连接的到来,nginx 被唤醒,其中一个 worker 被分配给该连接。从那时起,任何从远程客户端流向该工作进程的 TCP 流量。每个工人可以处理大量的连接。大多数 HTTP 连接只持续几秒钟,因此当它们关闭时,它们使工作人员 space 可以接受更多新连接。

所以...如果您尝试使用 shell 命令 'kill',您能做的最好的事情就是终止其中一个工作进程,该进程将关闭(可能) 大量连接。

如果您的目标是断开一个客户端的连接,同时让所有其他客户端保持连接状态,那您就太不走运了。使用 shell 命令无法做到这一点。如果您的 HTTP 连接长时间挂起(例如 Websockets 所做的),那么您可以在应用程序端编写一些东西,允许您关闭您不喜欢的连接。

您可能正在考虑的另一件事是关闭与您不喜欢的地方的连接(一种 'spam' 拦截器)。更常用的方法是直接拒绝连接,这样它会使用尽可能少的资源。同样,这是您可以在应用程序端动态执行的操作,或者您可以放置​​类似 Naxsi (https://github.com/nbs-system/naxsi/wiki) and fail2ban together (https://github.com/nbs-system/naxsi/wiki/A-fail2ban-profile-for-Naxsi).

的内容