分类 PHP 下的文章

CentOS6.5安装为PHP安装memcached扩展

PHP环境版本

CentOS6.5的PHP版本为5.6.21通过yum方式安装的, memcache扩展已经通过yum 方式安装好了

首先需要下载并安装libmemcached

因为memcached扩展是基于libevent的事件处理的, 首先需要安装libmemcached
下载地址
解压并安装:

tar zxf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached --with-memcached//注意:--with-memcached这个选项一定要加上
make
make install

注意:如果需要适用sasl, 也可以在安装libmemcahced前安装cyrus-sasl-devel:

yum install cyrus-sasl-devel

安装memcached扩展

首先下载memcached扩展, 下载地址
解压并安装:

tar zxf memcached-2.2.0.tgz
cd zxf memcached-2.2.0
phpize
./configure --with-php-config=/usr/bin/php-config --disable-memcached-sasl --with-libmemcached-dir=/usr/local/libmemcached
make
make test
make install

注意:如果不使用--disable-memcached-sasl安装过程中会提示

error 'configure: error: no, sasl.h is not available. Run configure with --disable-memcached-sasl to disable this check '

至此php的memcached扩展安装完毕, 重启php-fpm 即可生效。

关于PHP cURL:SSL certificate error: unable to get local issuer certificate 问题

Window下PHP调用curl接口访问https网址时报错:

<blockquote>

SSL certificate error: unable to get local issuer certificate


</blockquote>

尝试关闭SSL_VERIFY验证,也可以解决问题,但是强烈不建议用该方法:

<blockquote>

curl_setopt($this->ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);


</blockquote>

最好的解决办法是添加certificate认证文件并修改PHP.ini配置

认证文件下载地址:https://github.com/bagder/ca-bundle/blob/e9175fec5d0c4d42de24ed6d84a06d504d5e5a09/ca-bundle.crt|2b139d4ba4badaafc96e53f33cca535411|

php.ini 修改如下:

<blockquote>

curl.cainfo="C:/wamp/ca-bundle.crt"
openssl.cafile="C:/wamp/ca-bundle.crt"


</blockquote>

问题彻底解决

关于PHP的Memcache扩展get方法返回数据格式为serialize的问题

问题描述

这两天网站页面中城市名称显示的地方不正常,但是有些地方也正常。调用城市代码用了Memcache缓存,扩展是Memcache。 经过调试后发现调用城市数据的时候有些城市数据返回的是:

string(398) "a:18:{s:2:"id";i:4;s:4:"name";s:6:"重庆";s:5:"alias";s:9:"chongqing";s:4:"bjdx";s:2:"cq";s:4:"type";i:1;s:8:"parentid";i:0;s:8:"haschild";i:1;s:4:"path";s:1:"4";s:6:"domain";s:9:"chongqing";s:5:"quhao";s:3:"023";s:6:"chepai";s:29:"渝A,渝B,渝C,渝F,渝G,渝H";s:5:"color";s:6:"0000FF";s:5:"cs_id";i:35;s:5:"level";i:4;s:5:"class";i:1;s:10:"bdcitycode";i:132;s:6:"status";i:1;s:7:"version";i:1;}"
string(398) "a:18:{s:2:"id";i:4;s:4:"name";s:6:"重庆";s:5:"alias";s:9:"chongqing";s:4:"bjdx";s:2:"cq";s:4:"type";i:1;s:8:"parentid";i:0;s:8:"haschild";i:1;s:4:"path";s:1:"4";s:6:"domain";s:9:"chongqing";s:5:"quhao";s:3:"023";s:6:"chepai";s:29:"渝A,渝B,渝C,渝F,渝G,渝H";s:5:"color";s:6:"0000FF";s:5:"cs_id";i:35;s:5:"level";i:4;s:5:"class";i:1;s:10:"bdcitycode";i:132;s:6:"status";i:1;s:7:"version";i:1;}"

这个问题是memcache->get返回的数据没有经过unserialize处理,就直接返回了,所以导致页面中$array['key']调用的时候显示异常。

目前仍旧无法分析出来具体原因, 先记录下来以后再分析。目前可以确定如下情况:

  • 最近没有升级过服务器和相关服务;
  • 缓存设置的地方是正常的;
  • 只有部分城市出现过问题;
  • 重启过memcached服务, 并不解决问题;
  • PHP版本5.4.45

LNMP服务器安全指南

平时工作中需要维护一些Linux服务器, 有时候也需要自己配置下服务器, 一般主要是配置LNMP服务。整理了一些服务器安装配置方面的知识,现在就总结下。

  • Linux最低权限安全配置
    Nginx、MySQL、PHP-FPM三者都应该是以最低权限用户组运行。
    网站目录的文件用户组和PHP运行用户属主应该区分开, 设置PHP对网站文件只有可执行权限, 对于静态文件都交给Nginx处理。比如PHP-FPM的用户组为php-fpm:php-fpm, 网站目录www.lezhizhe.net其用户组为www:www, 文件属性为644,也就是说php合nginx在网站根目录只有读权限。对于文件上传目录和缓存目录, 可以设置777权限, 生成的文件要设置为644属性, 禁止上传的文件具有可执行权限。
    对于PHP使用open_basedir限制虚拟主机跨目录访问(网上有说在php.ini文件中修改open_basedir, 经测试不生效)。不过可以在nginx的每个站点的con.f文件中设置PHP的open_basedir属性(注意如果在某个站点设置了该属性其它站点未设置, 会造成其它站点打不开的情况):
fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/";
  • Linux防火墙及端口配置
    1、禁止SSH密码登陆方式, 采用公钥方式登陆。
    2、开启iptables。只开放必要的端口出来。iptable配置如下:
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [46:7024]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT //DNS端口
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT //HTTP端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4000 -j ACCEPT //FTP端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4355 -j ACCEPT //SSh端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 30000:60000 -j ACCEPT //FTP被动模式端口
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
  • PHP安装配置
    1.禁用不安全PHP函数
    disable_functions = show_source,system,shell_exec,passthru,exec,popen,proc_open,proc_get_status,phpinfo
    2.关闭错误日志防止输出错误信息, 记录log方便程序调试
    display_errors = Off
    log_errors=On
    error_log=/var/log/php-fpm/sie-error.log

    3.关闭远程代码执行。如果启用,PHP可以通过allow_url_fopen,在file_get_contents()、include、require中获取诸如FTP或网页内容这些远程数据。如果忘记了对输入数据进行过滤,而这些函数调用了这些数据,则形成了注入漏洞。
    allow_url_fopen=Off

    4.防止PHP信息泄露, 不轻易透露自己php版本信息,防止黑客针对这个版本的php发动攻击.
    expose_php = Off

    5.禁止动态加载链接库:
    enable_dl = Off

    6.将文件上传到远程服务器, 例如nfs等。当然也可以调用你们写好的php接口。 即使有上传漏洞,那么文件也被传到了静态服务器上。木马等文件根本无法执行。

  • Nginx限制访问
    有些目录存放的是一些类库文件或者模板文件, 不需要用户访问的,可以在该目录访问限制返回404。如lib类文件目录和template模板目录:
    location ~ ^/(lib|template)/ {
    return 404;
    }

    对于静态文件(如js、css、图片等)限制通过PHP执行:
    location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
    expires 0d;
    break;
    }
    }

    对于PHP程序文件,一般都是很少的几个入口文件, 可以直接限制这几个PHP文件的执行。例如现在只有index.php、user.php、admin.php三个入口文件,那我们只把这三个PHP文件交给fast-cgi文件去执行。
    location ~ ^/(index|user|admin)\.php {
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(/?.+)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/";
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
    }

Pure-FTP安装配置

Pure-FTPd 是一款免费(BSD)的,安全的,高质量和符合标准的FTP服务器。 侧重于运行效率和易用性。 这篇文章介绍如何在CentOS下安装Pure-FTP服务, 并且使用MySQL存储虚拟FTP用户。

安装Pure-FTP

  • yum方式安装
yum -y install pure-ftpd
  • 编译安装方式,下载地址,为了方便起见,我在这里使用了几个基本的编译命令来配置编译一个全功能版本的程序
# ./configure --prefix=/usr/local/pure-ftpd/ --with-language=simplified-chinese --with-everything
# make && make check && make install
  • 设置Pure-FTP开机启动
chkconfig --add pure-ftpd
chkconfig --level 2345 pure-ftpd on
  • 配置Pure-FTP
ChrootEveryone              yes         # 启用chroot, 将每个用户限制在自己的home目录下
BrokenClientsCompatibility yes # 兼容不同客户端, 默认:no
Daemonize yes # 后台运行
MaxClientsNumber 20 # 最大用户连接数
MaxClientsPerIP 4 # 每个ip最大连接数
VerboseLog yes # 记录日志
DisplayDotFiles no # 显示隐藏文件
AnonymousOnly no # 只允许匿名用户访问
NoAnonymous yes # 不允许匿名用户连接
SyslogFacility none # 不将日志在syslog日志中显示
DontResolve yes # 不进行客户端DNS解析
MaxIdleTime 5 # 最大空闲时间
LimitRecursion 2048 16 # 浏览限制,文件2000,目录8层
AnonymousCanCreateDirs no # 匿名用户可以创建目录
MaxLoad 4 # 如果系统负载超过下面所给的数字,那么匿名用户将无法下载
PassivePortRange 45000 60000 # 被动模式端口范围
#AnonymousRatio 1 10 # 匿名用户上传/下载比率
#UserRatio 1 10 # 所有用户上传/下载比率
AntiWarez yes # 禁止下载匿名用户上传但未经验证的文件
#AnonymousBandwidth 200 # 匿名用户带宽限制(KB)
UserBandwidth 128 # 所有用户最大带宽(KB)
Umask 133:022 # 创建文件/目录默认掩码
MinUID 100 # 验证登录用户的最小UID
AllowUserFXP no # 仅运行用户进行FXP传输
AllowAnonymousFXP no # 对匿名用户和非匿名用户允许进行匿名 FXP 传输
ProhibitDotFilesWrite no # 不能删除/写入隐藏文件
ProhibitDotFilesRead no # 禁止读取隐藏文件
AutoRename no # 有同名文件时自动重新命名
AnonymousCantUpload yes # 不允许匿名用户上传文件
AltLog clf:/var/log/pureftpd.log # clf格式日志文件位
MySQLConfigFile /etc/pure-ftpd/pureftpd-mysql.conf # 用户数据库文
MaxDiskUsage 99 # 当磁盘使用量打到99%时禁止上传
CreateHomeDir yes # 如果虚拟用户的目录不存在则自动创建#需要ftp根目录权限为755 chmod 775 /data/ftpdata/
CustomerProof yes # 防止命令误操作

安装免费开源的Pure-ftp Web管理工具vftp

  • 下载地址
  • 上传到Web目录以后安装, 执行安装, 根据提示安装相应的PHP模块, 配置/etc/pure-ftpd/pureftpd-mysql.conf 文件即可。配置好以后就可以通过web界面新建FTP虚拟用户了
#php安装php-posix, 安装以后需要重启web服务器
yum -y install php-process