当前位置: 首页 > 后端技术 > PHP

【PHP】-性能优化-Fcgi进程及PHP解析优化(一)

时间:2023-03-29 18:17:06 PHP

1.PHP引擎缓存加速的四种常用软件:1.eAccelerator2.Zendcache3.xcache4.apc5.zendopcachephp5.5自带2.使用tmpfs作为缓存加速cache的文件目录[root@web02~]#mount-ttmpfstmpfs/dev/shm-osize=256m[root@web02~]#mount-ttmpfs/dev/shm//tmp/eaccelerator/[root@web02~]#df-hFilesystemSizeUsedAvailUse%Mountedon/dev/sda36.6G3.9G2.5G62%//dev/sda1190M36M145M20%/boottmpfs256M0256M0%/dev/shm/dev/shm238M0238M0%/tmp/eaccelerator提示:上传图片缩略图临时处理目录/tmp2。其他加速器临时目录/tmp/eaccleratortmpfs是一个基于内存的文件系统,它类似于虚拟磁盘ramdisk,但又不完全相同,tmpfs和ramdisk一样,可以使用RAM但也可以使用swap分区进行存储。而且,传统的ramdisk是块设备,必须用mkfs格式化才能真正使用;而tmpfs是文件系统,不是块设备,安装即可使用。tmpfs是最好的基于RAM的文件系统。更多解释3.php.ini参数调优无论是apache还是nginx,php.ini都是合适的。而php-fpm.conf适合nginx+fastcgi配置。首选产品环境的php.ini(php.ini-production)[root@web02~]#ls/home/oldboy/tools/php-5.5.32|grepphp.iniphp.ini-developmentphp.ini-production两者区别:生产场景下php.ini的日志全部关闭或者输出到文件。因此,在我们的复现场景中,关闭或隐藏非程序(php引擎)的输出3.1开启php安全模式php安全模式是php内嵌的一个非常重要的安全机制,可以控制php中一些函数的执行,比如和system()一样,同时控制着很多文件操作函数的权限。安全模式=开;是否启用安全模式。;打开时,PHP会检查当前脚本的属主是否与正在操作的文件的属主相同访问文件的推荐设置为:safe_mode_gid=Off如果不设置,我们可能无法操作文件在我们服务器网站的目录下,比如我们需要操作文件的时候。php5.3.27默认为safe_mode_gid=Off。提示:5.5这个参数没有了。3.3禁用危险功能。如果开启了安全模式,功能禁止就没有必要了,但是出于安全考虑我们还是设置了。例如,如果我们觉得不想执行可以执行包括system()在内的命令的php函数,或者phpinfo()等可以查看php信息的函数,那么我们就禁止它们。disable_functions=system,passthru,exec,shell_exec,popen,phpinfo如果要禁止任何文件和目录操作,可以关闭很多文件操作disable_functions=chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fpus,fwrite,chgrp,chmod和chown只是上面列出的一些常用的文件处理函数。也可以把上面的执行命令函数和这个函数结合起来,就可以抵挡大部分phpshell企业面试题:下面的PHP函数中,有没有会对系统造成安全隐患,降低安全性的函数?A.md5()B.phpinfo()C.shell_exec()D.exec()答案:B、C、D3.4关闭http头中PHP版本信息的泄露为了防止黑客获取php版本服务器中的信息,你可以在httpheader中关闭这个信息expose_php=Off;是否暴露服务器安装PHP的事实(加在http前面);不会有直接的安全风险,但是会让客户端知道服务器安装了PHP例子:优化后3.5关闭全局变量的注册在PHP中提交的变量,包括使用POST或者GET提交的变量,都会被自动注册作为全局变量,可以直接访问,这对服务器来说是非常不安全的,所以我们如果不能将其注册为全局变量,关闭注册全局变化选项register_globals=Off;是否将E、G、P、C、S变量注册为全局变量;打开此命令可能会导致严重的安全问题,除非您的脚本经过非常仔细的检查。;推荐使用预定义的超全局变量:$_ENV.$_GET,$_POST,$_COOKIE,$_SERVER;该指令受variables_order指令的影响。Tips:这个参数5.5没有3.6开启magic_quotes_gpc防止SQL注入。SQL注入是一个非常危险的问题。少则网站后台被入侵,大则整个服务器都被攻陷,小心为上。magic_quotes_gpc=Off默认关闭。如果开启,它会自动将用户提交的查询转换成sql,比如转换'to\'等,这对防止sql注入有很大的作用。magic_quotes_gpc=OnPrompt:5.5hasnoSQLinjectionprevention:Nginx可以使用WA来防止SQL注入(nginx基于lua模块开发WAF)Apache使用mod_security和mod_evasive来防止SQL注入3.7错误信息控制一般php连接不上数据库或者其他一些情况下,会有错误提示。一般错误信息会包含php脚本当前路径信息或查询sql语句等信息。此类信息提供给黑客后是不安全的,所以一般服务器建议禁止错误提示。display_errors=Off;是否将错误信息作为输出的一部分显示给最终用户,可以在应用程序调试时开启,方便查看错误;在最终发布的网站上,强烈建议您关闭此功能并使用错误日志而不是将其设置为display_errors=Off(php5.3.27默认为display_errors=Off)如果您真的想显示错误信息,您必须设置显示错误的级别,并且只显示警告以上的信息。Message:error_reporting=E_WARNING&E_ERROR当然最好关闭错误提示。3.8错误日志建议关闭display_errors后记录错误信息,以便查找服务器运行的原因:log_errors=On(php5.3.27默认log_errors=On)同时设置错误日志存放路径的目录,建议rootapache日志一起存在error_log=/app/logs/php_error.log注意:该文件必须允许apache用户组有写权限。日志切割可以使用cp清除。4、部分资源限制参数优化1、设置每个脚本运行的最大时间当大文件无法上传或后台备份数据经常超时时,需要调整如下:max_execution_time=30;脚本可能消耗的最大内存量(128MB);每个脚本允许的最大执行时间(秒),0表示不限制;此参数有助于防止质量差的脚本无休止地占用服务器资源。;这条指令只影响脚本本身的运行时间,以及脚本运行之外的任何其他事件;如果使用system()/sleep()函数、数据库查询、文件上传等,则不包括在内;在安全模式下,你不能在运行时使用int_set()来改变这个设置2.每个脚本使用的最大内存memory_limit=128M;一个脚本最多可以申请的内存字节数(可以以K/M为单位);这有助于防止不良脚本消耗服务器上的所有内存。;为了能够使用这个指令,你必须在编译时使用“--enable-memory-limit”配置选项;如果要取消内存限制,必须设置为-1;设置该指令后,memory_get_usage()函数将变为3.每个脚本等待输入数据的最长时间max_input_time=-1;每个脚本解析输入数据(POST、GET、上传)的最大允许时间(秒);-1表示没有限制。设置为max_input_time=604。上传文件的最大允许大小。上传较大文件时,需要调整以下参数:upload_max_filesize=2M;;上传文件的最大允许大小,自己改,有些图片论坛需要这个较大的值。五、一些安全优化参数1、禁止开启远程地址,例如:phpinclude的漏洞。就是在一个php程序中包含变量,那么入侵者就可以利用这个控制服务器在本地执行远程php程序,那么入侵者就可以利用这个控制服务器在本地执行远程php程序,比如phpshell,所以我们关闭thisallow_url_fopen=Off2.设置:cgi.fix_pathinfo=0防止类似Nginx文件的错误解析漏洞设置了最新的配置。  昨天,80Sec爆料Nginx存在严重的0day漏洞,详见《Nginx文件类型错误解析漏洞》。只要用户拥有上传图片权限的Nginx+PHP服务器,就有被入侵的可能。  其实这个漏洞不是Nginx的漏洞,而是PHPPATH_INFO的漏洞。详见:http://bugs.php.net/bug.php?i...  比如某用户上传了一张照片,访问地址为http://www.domain.com/images/...,而test.jpg文件中的内容其实是PHP代码,通过http://www.domain.com/images/.... 网上提供的临时解决方案是:  方法①,修改php.ini,设置cgi.fix_pathinfo=0;然后重新启动php-cgi。此修改将影响使用PATH_INFO伪静态的应用程序。比如我上一篇博文的网址:http://blog.zyan.cc/read.php/...无法访问。  方法②,在nginx配置文件中添加如下内容后重启:if($fastcgi_script_name~../.php){return403;}。这个匹配会影响像http://www.domain.com/softwar...(5.0是一个目录),http://www.domain.com/goto.ph...这样的URL访问。  方法③。对于存放图片的位置{...},或者虚拟主机服务器{...},只允许纯静态访问,不配置PHP访问。例如在金山逍遥网论坛和SNS上传的图片和附件,会被发送到一个专门的图片和附件存储服务器集群(pic.xoyo.com)。这组服务器提供纯静态服务,没有任何动态PHP配置。各大网站几乎都有独立的图片服务器,所以Nginx的这个漏洞对大型网站影响不大。本文转载6.调整php会话信息session.save_handler=files的存储类型和位置;存储和检索与会话关联的数据的处理程序的名称,默认为文件(“文件”);如果你想使用自定义处理器(比如基于数据库的处理器),你可以使用“user”;设置为“memcached”,就可以使用memcached作为会话处理器(需要指定“--enable-memcache-seesion”编译选项);session.save_path="/tmp";传递给存储处理器的参数,对于文件处理器,这个值是创建会话数据文件的路径。可以直接使用memcached作为php的session.save_handler。修改为如下配置:session.save_handler=memcachesession.save_path="tcp://10.0.0.18:11211"提示:1)10.0.0.18:11211为memcached数据库缓存的IP和端口。2)以上适用于LNMP和LAMP环境。3)memcached服务器也可以通过hash来调度。php5.3配置ini*配置php.ini*为重点,setline338tosafe_mode=On#启用安全模式,setline435toexpose_php=Off#closeversioninformationline538,setdisplay_errors=Off#错误信息控制,在测试时,错误报告的级别在第521行默认设置为error_reporting=E_ALL&~E_DEPRECATED。log_errors=Oninline559#打开日志,设置error_loginline643toerror_log=/app/logs/php_errors.log#日志路径(需要log_errors为On才能生效)*703行设置为register_globals=Off#关闭全局变量(默认是关闭的,一定不要开启)*756行设置为magic_quotes_gpc=On#PreventSQLinjection902行设置为allow_url_fopen=Off#Openremoteopen(禁止)854行设置为cgi.fix_pathinfo=0#防止Nginx文件类型错误解析漏洞,可修改参数444max_execution_time=30#单个脚本最大运行时间,单位秒(**开发插入程序时可能需要增加该值)454max_input_time=60#单个脚本等待输入的最长时间465memory_limit=128M#单个脚本最大使用内存,单位为K或M(128M稍大,可适当调整)891upload_max_filesize=2M#上传文件的最大权限894max_file_uploads=20#单次请求最多可以上传的文件数php-fpm.conf优化配置PHP优化前后对比图修改前pid=/app/log/php-fpm.piderror_log=/app/日志/php-fpm.loglog_level=错误事件。机制=epolllisten.owner=wwwlisten.group=wwwpm.max_children=1024pm.start_servers=14pm.min_spare_servers=5pm.max_spare_servers=20pm.process_idle_timeout=15s;pm.max_requests=2048slow=/app/logs/$pool.log.querrelimit_files=32710;pid=run/php-fpm.pid;error_log=log/php-fpm.log;log_level=notice;events.mechanism=epoll;listen.owner=www;listen.group=wwwpm.max_children=5pm.start_servers=2pm.min_spare_servers=1pm.max_spare_servers=3;pm.process_idle_timeout=10s;;pm.max_requests=500;slowlog=log/$pool.log.slow;rlimit_files=1024;request_slowlog_timeout=0优化参数引入error_log=/app/logs/php-fpm.log#指定pid路径log_level=error#开启日志,日志级别为errorevents.mechanism=epoll#使用epoll方式listen.owner=www#使用php用户listen.group=wwwpm.max_children=1024#php子进程数pm.start_servers=14#php初始启动子进程数pm.min_spare_servers=5#php最小空闲进程数pm.max_spare_servers=20#php最大空闲进程数pm.process_idle_timeout=15s;#进程超时时间pm.max_requests=2048#每个子进程退出前可以发出的请求数slowlog=/app/logs/$pool.log.slow#开启慢查询日志(执行程序时间长了可以查看)rlimit_files=32768#开启文件描述符个数request_slowlog_timeout=10#慢查询超时时间,超时10秒业务要操作,否则会有问题!修改配置文件前,运行前一定要备份!操作前必须备份!操作前必须备份!