服务器|云|数据中心

服务器|云主机|vps|站群

分类目录服务器教程

服务器的w3wp.exe进程占用cpu100%的完美解决方案

LUCN机房机器,在非受到攻击的情况下。在IIS6下,如果美国服务器经常出现w3wp.exe的内存及CPU占用不能及时释放,从而导致服务器响应速度很慢。可以有以下一些方法解决。

解决CPU占用过多:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。
2、设置应用程序池的CPU监视,不超过25%(服务器为4CPU),每分钟刷新,超过限制时关闭。

根据w3wp取得是哪一个应用程序池:
1、在任务管理器中增加显示pid字段。就可以看到占用内存或者cpu最高的进程pid
2、在命令提示符下运行iisapp -a。注意,第一次运行,会提示没有js支持,点击确定。然后再次运行就可以了。这样就可以看到pid对应的应用程序池。(iisapp实际上是存放在C:\windows\system32目录下的一个VBS脚本,全名为iisapp.vbs,如果你和我一样,也禁止了Vbs默认关联程序,那么就需要手动到该目录,先择打开方式,然后选“Microsoft (r) Windows Based scrīpt Host”来执行,就可以得到PID与应用程序池的对应关系。)
3、到iis中察看该应用程序池对应的网站,就ok了,做出上面的内存或CPU方面的限制,或检查程序有无死循环之类的问题。

解决内存占用过多,可以做以下配置:
1、在IIS中对每个网站进行单独的应用程序池配置。即互相之间不影响。 
2、设置应用程序池的回收时间,默认为1720小时,可以根据情况修改。再设置当内存占用超过多少(如500M),就自动回收内存。
我的设置如下:
首先是对CPU的限制:在启用cpu监视后,我设置该应用程序池最大的cpu使用率为50%。设置刷新cpu时间为1分钟,设置操作为“关闭”。最大工作进程数设置为1。这个意思是,IIS刷新检测该独立池的CPU使用情况时间为1分钟,如果超过设置的cpu限制50%,就会发出关闭池的指令,要求池在指定的时间内关闭。如果池成功在这个时间内关闭,IIS会重启动一个新池,此段时间很短,一般不会有什么感觉,池就重新开启了,对于访问网站的人基本是不会有感觉的。但如果池没有在指定时间内关闭,IIS就会强行关闭它一个刷新CPU时间。在这个停止的时间内,网站无法访问,提示“Service Unavaliable”。 


关闭时间和启动时间间隔设置:设短一些比如10秒,这样当您的网站程序大量占用系统资源时IIS自动快速回收进程并且快速启动进程,您的网站暂时还可以将就着工作。

对内存的限制及进程回收时间的设置:我设置为内存占用超过800M就自动回收内存,虚拟内存没有做限制。进程回收时间我保持默认没有修改。各位可以根据自己的情况设置更短的时间。对应用程序池最大虚拟内存也可以在此进行设置,超过了设置的最大虚拟内存,该池会就被回收。 

总结一些需要注意的问题:

1、 要限制一个站点的CPU使用,必须将该站点设置为独立应用程序池,共用应用程序池是无法限制单个站点的。IIS独立应用程序池,就需要独立的进程,非常消耗内存。独立池越多,就有越多的W3WP进程。对于每个站点均要独立应用程序池的服务器,在一般的普通P43.0 2G内存 的普通服务器上,建议不要超过50个站点,最好30以内,不然服务器压力非常大。在配置上,我一般把资源消耗较大的网站独立一个池,一般普通BBS或者生成Html的系统大概5个站一个池。普通网站以及一些企业站点均共用一个池。

2、根据经验,在服务器硬件允许的情况下,一般不要限制站点内存使用,这样能够保证网站运行,不会出现用户掉线情况。需要限制某站的最大虚拟内存不要小于64M,不然可能出现一些未知的错误。 

3、这些都不是根本解决办法,它的根本问题是网站程序有问题,要解决根本问题还要从程序查起。根据本文开头提到的方法查到具体的应用程序池,找到使用此应用程序池的网站,解决网站程序存在的问题,如死循环之类。

4、除了w3wp.exe, 在调用数据库进行大量查询操作的时候,也会大量占用CPU资源,这是难免的(数据库方面的语句及结构优化不在本文讨论范围之内)。个人认为,只要不是CPU长时间占用100%, 一般在75%左右都是正常的。

Nginx 502 bad gateway问题的解决方法

Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关。


常见的原因可能是php-cgi进程数不够用、php执行时间长(mysql慢)、或者是php-cgi进程死掉,都会出现502错误。

1. 在安装好的环境中,运行一段时间出现502问题,一般是因为默认php-cgi进程是5个,可能因为phpcgi进程不够用而造成502,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。

2. php执行超时,修改/usr/local/php/etc/php.ini 将max_execution_time 改为300

3. 磁盘空间不足,可以使用 # df -h命令查看磁盘使用量

4. php-cgi进程死掉了。


通常的排查方法如下:

1、查看php fastcgi的进程数(max_children值)

# netstat -anop | grep php-cgi | wc -l
# netstat -anpo | grep php-fpm | wc -l

1.JPG

假如显示是5

2、查看当前进程
# ps aux | grep php-fpm 观察fastcgi/php-fpm进程数,假如使用的进程数等于或高于5个,说明需要增加。

02

3、调整/usr/local/php/etc/php-fpm.conf 的相关设置

pm.max_children = 5
request_terminate_timeout = 60

03

04

max_children最多5个进程,按照每个进程20MB内存,最多100MB。也就是1分钟。max_children增多,则php-cgi的进程多了就会处理的很快,排队的请求就会很少。 但是设置max_children也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右。根据自己服务器购买的内存来实际决定。
request_terminate_timeout执行的时间为60秒,request_terminate_timeout值可以根据服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。

4. 部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}

03

Centos系统下php对外DDOS攻击如何防范处理

前段时间有个客户租用了台CentOS系统的服务器,不停地向外发包,网络带宽一直很高,导致机器经常卡死 无法远程操作。检查发现可能是php程序被植入了PHP-DDoS攻击脚本,被触发后会不停地对外攻击其他服务器,所以导致了网络的瘫痪.
 
特征:用PHP代码调用sockets,直接用服务器的网络攻击别的IP。 PHP脚本DDOS攻击的原因及php脚本部分源码:
$fp = fsockopen(“udp://$host”, $port, $errno, $errstr, 5);
if($fp){
fwrite($fp, $out);
fclose($fp);
}
 
php脚本中的 fsockopen 函数,对外部地址,通过UDP发送大量的数据包,攻击对方。
 
解决方案:
可通过 php.ini 禁用 fsockopen、 fwrite、 fclose这三个函数
一、禁用fsockopen函数
在php.ini里禁用如下函数:
disable_functions=gzinflate,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,
proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,
symlink,popepassthru,stream_socket_server,fsocket,fsockopen,fwrite,fclose
 
在php.ini里禁用
fopen allow_url_fopen = Off
 
 
二、通过iptables禁止向外发包
iptables -I OUTPUT -p udp –dport 53 -d 8.8.8.8 -j ACCEPT  #允许需要UDP服务的端口(如DNS)
iptables -A OUTPUT -p udp -j DROP  #禁止本机对外发送UDP包
#“53”,为DNS所需要的UDP端口,“8.8.8.8”部分为DNS IP,根据您服务器的设定来定。
#若您不知您当前服务器使用的DNS IP,可在SSH中执行以下命令获取:
cat /etc/resolv.conf 或者查看网卡配置文件 ifcfg-eth0

Win 2008允许多用户登入设置

服务器安装windows server 2008系统时,默认只有一个用户登陆的,如需要多用户登陆,则需要做以下设置:

打开控制面板-管理工具,终端服务-终端服务配置 
1、连接:RDP-tcp 点右键,属性。网络适配器-最大连接数2.。

默认情况下如果你不添加终端服务功能,最大只能调整为同时2个连接

2、终端服务器授权模式:点右键,属性。常规,限制每个用户只能使用一个会话,去掉勾,确定。

到这里就可以多登录了。如果没有设置生效,重启一下。

3、防止恶搞,阻止远程用户终止控制台管理员。 
运行-gpedit.msc ,计算机配置-管理模板-Windows组件-终端服务。终端服务器-连接。 
配置:拒绝将已经登录到控制台会话的管理员注销,设置启用。 
重启生效。

Windows2008系统IIS7出现“无法加载站点/服务”问题的解决方法

问题现象

Windows2008系统IIS7启动站点出现“无法加载站点/服务”的报错。

解决方案

解决这个问题需要给NETWORK SERVICE 加上访问IIS服务的权限,具体方法如下:

1. 开始 – 控制面板 – 管理工具 – 组件服务。

2.JPG

2. 计算机 – 我的电脑 – DCOM 配置。

1.JPG

3. 选择“IIS ADMIN SERVICE”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“NETWORK SERVICE ” 给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS。

3.JPG

4. 重启IIS重新访问测试。