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



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

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

如果我在nginx工作进程上执行netstat,我将从工作进程中获得pid,这些工作进程在我杀死连接到它的进程后需要保持活动状态。

我试过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,当我终止与它的连接时,它需要保持活动状态。

有办法做到吗?

我认为您可能混淆了进程ID和连接。Nginx启动一个主进程,然后派生出一些辅助进程。在一个相当繁忙的系统中,你可能只有5名员工。

当连接进入时,nginx会唤醒,其中一个worker被分配给该连接。从那时起,任何TCP流量都会从远程客户端流到该工作进程。每个工人都可以处理大量的连接。大多数HTTP连接只持续几秒钟,所以当它们关闭时,它们会为工作人员腾出空间来接受更多的新连接。

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

如果你的目标是断开一个客户端的连接,而让所有其他客户端都保持连接,那你就倒霉了。使用shell命令无法做到这一点。如果您的HTTP连接挂起很长时间(例如,像Websockets一样),那么您可以在应用程序端编写一些内容,允许您关闭不喜欢的连接。

你可能会想到的另一件事是关闭你不喜欢的地方的连接(一种"垃圾邮件"拦截程序)。更常见的方法是拒绝连接,这样它就可以尽可能少地使用您的资源。同样,这是您可以在应用程序端动态执行的操作,或者您可以放置类似Naxsi的东西(https://github.com/nbs-system/naxsi/wiki)和故障2一起(https://github.com/nbs-system/naxsi/wiki/A-fail2ban-profile-for-Naxsi)。

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

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

最新更新