我需要将已建立的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。
有办法吗?
答案 0 :(得分:0)
我使用grep的PERL正则表达式来实现这样的目标。
$ PID_TO_KILL=`netstat -anp | grep "client_ip_address" | grep ESTABLISHED | grep -Po "(?<=ESTABLISHED).*(?=\/nginx)"`
$ kill -9 $PID_TO_KILL
答案 1 :(得分:0)
我想也许你会混淆进程ID和连接。 Nginx启动一个主进程,然后生成一些工作进程。在一个相当繁忙的系统中,你可能只有(比方说)5名工人。
当连接进入时,nginx唤醒,其中一个工作人员被分配到该连接。从那时起,任何流量的TCP流量都会从远程客户端传递到该工作进程。工人可以各自处理大量的连接。大多数HTTP连接只持续几秒钟,因此当它们关闭时,它们为工作者提供了更多新连接的空间。
所以......如果你试图使用shell命令'kill',那么你所能做的最好的事情就是终止一个工作进程,这会关闭(可能)大量的连接。 / p>
如果您的目标是断开一个客户端,同时让所有其他客户端保持联系,那么您将失去运气。使用shell命令无法做到这一点。如果您的HTTP连接闲置很长时间(例如Websockets),那么您可以在应用程序端编写一些内容,以便关闭您不喜欢的连接。
您可能想到的另一件事是关闭您不喜欢的地方的连接(某种“垃圾邮件”拦截器)。更常见的方法是拒绝外部连接,以便尽可能少地使用您的资源。同样,这是您可以在应用程序端动态执行的操作,或者您可以将Naxsi(https://github.com/nbs-system/naxsi/wiki)和fail2ban放在一起(https://github.com/nbs-system/naxsi/wiki/A-fail2ban-profile-for-Naxsi)。