tongyi007 发表于 2018-12-14 12:35:45

php配置——php.ini配置文件详解

  查找PHP配置文件
  ① 命令行(不推荐,服务器有多个php,httpd不一定加载的此模块)
  # /usr/local/php/bin/php -i | grep 'Loaded Configuration'
  Loaded Configuration File => /usr/local/php/etc/php.ini
  ② 调用php函数(推荐使用,精确)
  # vim /data/www/phpinfo.php
  
http://note.youdao.com/yws/res/5071/WEBRESOURCE77b8df7d56a5966281f22b5ba6da5999
  禁掉一些危险的函数
  ## 编辑配置文件,查找到disable_functions
  # vim /usr/local/php/etc/php.ini
  disable_functions = eval,assert,popen,passthru,escapeshellarg,\
  escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,\
  escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,\
  ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,\
  popepassthru,stream_socket_server,popen,proc_open,proc_close
  解释说明:
  配置disable_functions;
  exec,shell_exec这两个函数是调用linux命令非常危险必须禁用;
  有时候也会禁止phpinfo函数;
  #重启apache,再刷新网页可看到禁掉的函数
  # /usr/local/apache2/bin/apachectl restart
http://note.youdao.com/yws/res/5086/WEBRESOURCEc8f1508feeba86159cb36bcd8b329924
  配置PHP错误日志
  ## 关闭此选项,如果PHP代码有错,将不会提示错误信息直接显示白页
  # vim /usr/local/php/etc/php.ini
  display_errors = Off/On        ## 默认Off
  解释说明:
  虽然开启便于程序调试,但***获取到这些错误可能会发起***,不安全;
  ## 确认开启
  log_errors = On
  ## 配置错误日志
  error_log = /usr/local/php/logs/php_errors.log
  解释说明:
  配置的错误日志目录必须存在(mkdir /usr/local/php/logs)且必须写绝对路径
  chown -R daemon.daemon /usr/local/php/logs/或者chmod 777 /usr/local/php/logs(因为生成错误日志的用户是apache,所以要有写权限)
  ## 日志级别
  error_reporting = E_ALL & ~E_NOTICE
  解释说明:
  设置日志级别就是在过滤错误日志记录呢些内容;
  E_ALL 包含所有的错误和警告(且包含了PHP5.4版本中的E_STRICT);
  E_NOTICE 把所有的错误都显示,除了通知和代码的标准警告;
  & 并且;
  | 或者;
  ~ 取反;
  是指 E_ALL 为真,或者 非E_NOTICE 为真;
  ## 为了测试,故意php文件写错
  # cat /data/www/phpinfo.php
  
  ## 检查并重新加载
  # /usr/local/apache2/bin/apachectl -t
  Syntax OK
  # /usr/local/apache2/bin/apachectl graceful
  ## 解析并查看生成的错误日志
  # /usr/local/php/bin/php /data/www/phpinfo.php
  # tail /usr/local/php/logs/php_errors.log
   PHP Parse error:syntax error, unexpected T_STRING in /data/www/phpinfo.php on line 3
  配置open_basedir
  也是一个安全选项,它有什么意义呢,举个例子,咱们这个php,apache它要去访问一个网站,它要找到
  一个路径,我们有给它定义一个路径,比如说/data/www,那这个时候如果,假设这个你的环境,你的网站
  有一些漏洞,让不法分子获得了一些权限,他可以上传一个他自己的***,那他这个***呢可以获得你服务
  器上的一些信息,比如可以获得一些目录、一些文件,可以查看,那这个时候呢,我们应该想到一个策略,
  为了以防万一,我们应该把它限制死在某一个目录下,因为我们网站在/data/www下,那我们就应该给它
  限定死,你只能访问/data/www这个目录,其他的目录(比如根目录、etc目录),你是不可以查看的,如何
  去做呢
  ## 编辑配置文件
  # vim /usr/local/php/etc/php.ini
  open_basedir = /data/www/:/tmp/
  解释说明:
  /tmp/一般都会用到,就写上
  ## 不过为了测试,故意写错受限制路径(就出现了500错误)
  open_basedir = /data/www1/:/tmp/
  ## apache重新加载
  # /usr/local/apache2/bin/apachectl graceful
  ## 访问网页测试
http://note.youdao.com/yws/res/5159/WEBRESOURCE72860ff785a448dc9b4c96b3dda3f77f
  ## 命令行测试
  # curl -xlocalhost:80 www.test.com/phpinfo.php -I    
  HTTP/1.0 500 Internal Server Error
  Date: Sat, 05 Nov 2016 21:23:53 GMT
  Server: Apache/2.2.16 (Unix) DAV/2 PHP/5.3.28
  X-Powered-By: PHP/5.3.28
  Cache-Control: max-age=0
  Expires: Sat, 05 Nov 2016 21:23:53 GMT
  Connection: close
  Content-Type: text/html
  X-Pad: avoid browser bug
  ## 查看日志
  # /usr/local/php/bin/php /data/www/forum.php    ## 解析
  # tail /usr/local/php/logs/php_errors.log
   PHP Warning:require(): open_basedir restriction in effect. File(./source/class/class_core.php) is not within the allowed path(s): (/data/www1/:/tmp/) in /data/www/forum.php on line 15
   PHP Warning:require(./source/class/class_core.php): failed to open stream: Operation not permitted in /data/www/forum.php on line 15
   PHP Fatal error:require(): Failed opening required './source/class/class_core.php' (include_path='.:/usr/local/php/lib/php') in /data/www/forum.php on line 15
  备注:访问网页后,错误日志没有生成,我又自己解析的,这才出来错误日志。
  其实在apache里同样可以定义,假如说我们现在有多个虚拟主机,多个网站,多个网站你就应该去做多个
  open_basedir的限制,如果用php.ini去做,只能配置一句;你要是限定多个目录的话,不同的站点你是
  没有办法区分开的,所以我们可以针对apache的虚拟主机去做一些限制,每一个虚拟主机(VirtualHost)使用一个open_basedir(好处在于我们可以区分不同的虚拟主机),如何去配置?那先把php.ini的open_basedir先注释掉(注:php里;来作为注释),然后做下面的实验。
  ## 配置apache虚拟主机的open_basedir
  # vim /usr/local/apache2/conf/extra/httpd-vhosts.conf
  
      DocumentRoot "/data/tmp"
      ServerName tmp.com
      php_admin_value open_basedir "/tmp/tmp/"
  
  
      DocumentRoot "/data/www"
      ServerName www.test.com
      ServerAlias www.aaa.com
      ServerAlias www.bbb.com
      php_admin_value open_basedir "/data/www/:/tmp/"
  
  解释说明:
  在open_basedir时,一定要将目录/dir/(后面的/一定要加上)否则会包含www、www1、www2......
  ## 检查并重新加载
  # /usr/local/apache2/bin/apachectl -t
  Syntax OK
  # /usr/local/apache2/bin/apachectl graceful
  




页: [1]
查看完整版本: php配置——php.ini配置文件详解