注:以下所有操作均在CentOS 6.5 x86_64位系统下完成。

#准备工作#

前段时间PHP官方发布了一个重要的安全升级公告,修复了两个unserialize函数的严重漏洞,目前受影响的版本有:

  • <5.4.36
  • <5.5.20
  • <5.6.4

这里我们直接下载5.6.4的版本进行安装配置,并且在这之前需要先把MysqL和Apache已经安装好,最好Nginx也先安装好.

#PHP的安装#

开始下载PHP并进行编译安装:

# wget http://cn2.PHP.net/distributions/PHP-5.6.4.tar.gz
# tar zxf PHP-5.6.4.tar.gz
# cd PHP-4
# export LD_LIBRARY_PATH=/usr/local/MysqL/lib
# ./configure --prefix=/usr/local/PHP-4 --with-config-file-path=/usr/local/PHP-4/etc --with-MysqL=/usr/local/MysqL --with-pdo-MysqL=/usr/local/MysqL --with-MysqLi=/usr/local/MysqL/bin/MysqL_config --with-apxs2=/usr/local/apache/bin/apxs --enable-fpm --enable-shared --enable-zip --with-bz2 --enable-ftp --with-jpeg-dir --with-png-dir --with-freetype-dir --with-libxml-dir --with-xmlrpc --with-zlib-dir --with-gd --with-gmp --enable-gd-native-ttf --with-curl --with-regex=PHP --with-pic --with-xsl --enable-wddx --with-iconv --with-gettext --with-pear --enable-ctype --enable-calendar --enable-mbstring --enable-bcmath --enable-sockets  --enable-exif --disable-rpath  --with-mcrypt --with-mhash  --with-openssl --enable-sysvsem --enable-sigchild --enable-sysvshm --enable-soap  --disable-fileinfo --enable-opcache=no
...
Thank you for using PHP.

config.status: creating PHP5.spec
config.status: creating main/build-defs.h
config.status: creating scripts/PHPize
config.status: creating scripts/man1/PHPize.1
config.status: creating scripts/PHP-config
config.status: creating scripts/man1/PHP-config.
config.status: creating sapi/cli/PHP.
config.status: creating sapi/fpm/PHP-fpm.conf
config.status: creating sapi/fpm/init.d.PHP-fpm
config.status: creating sapi/fpm/PHP-fpm.service
config.status: creating sapi/fpm/PHP-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/cgi/php-cgi.
config.status: creating ext/phar/phar.
config.status: creating ext/phar/phar.phar.
config.status: creating main/PHP_config.h
config.status: executing default commands

# make
...
Build complete.
Don't forget to run 'make test.

# make install
...
Installing PHP SAPI module:       apache2handler
/usr/local/apache-2.4.10/build/instdso.sh SH_LIBTOOL=/usr/local/apr/build-1/libtool' libPHP5.la /usr/local/apache-10/modules
/usr/local/apr/build-1/libtool --mode=install install libPHP5.la /usr/local/apache-10/modules/
install .libs/libPHP5.so /usr/local/apache-10/modules/libPHP5.so
install .libs/libPHP5.lai /usr/local/apache-libPHP5.la
libtool: install: warning: remember to run `libtool --finish /usr/local/src/PHP-4/libs'
chmod 755 /usr/local/apache-libPHP5.so
[activating module `PHP5 in /usr/local/apache-2.4.10/conf/httpd.conf]
Installing PHP CLI binary:        /usr/local/PHP-4/bin/
Installing PHP CLI man page:      /usr/local/PHP-4/PHP/man/man1/
Installing PHP FPM binary:        /usr/local/PHP-4/sbin/
Installing PHP FPM config:        /usr/local/PHP-4/etc/
Installing PHP FPM man/man8/
Installing PHP FPM status page:   /usr/local/PHP-4/PHP/fpm/
Installing PHP CGI binary:        /usr/local/PHP-
Installing PHP CGI 
Installing build environment:     /usr/local/PHP-4/lib/PHP/build/
Installing header files:          /usr/local/PHP-4/include/PHP/
Installing helper programs:       /usr/local/PHP-
  program: PHPize
  program: PHP-config
Installing man pages:             /usr/local/PHP-
  page: PHPize.
  page: PHP-config.
Installing PEAR environment:      /usr/local/PHP-4/lib/PHP/
[PEAR] Archive_Tar    - installed: 1.3.12
[PEAR] Console_Getopt - installed: 
[PEAR] Structures_Graph- installed: 1.0.
[PEAR] XML_Util       - installed: 1.2.3
[PEAR] PEAR           - installed: 1.9.5
Wrote PEAR system config file at: /usr/local/PHP-pear.conf
You may want to add: /usr/local/PHP-4/lib/PHP to your PHP.ini include_path
/usr/local/src/PHP-4/build/shtool install -c ext/phar/phar.phar /usr/local/PHP-4/bin
ln -s -f /usr/local/PHP-4/bin/phar.phar /usr/local/PHP-phar
Installing PDO headers:          /usr/local/PHP-4/include/PHP/ext/pdo/

# ln -s /usr/local/PHP-4/ /usr/local/PHP

给PHP的upload和session添加目录支持:

# mkdir -p /data/PHP/upload
# mkdir -p /data/PHP/session

至此,PHP已经安装完毕。

#PHP-FPM的启动/关闭/重启#

自PHP-5.3.3开始,PHP源码中包含了PHP-fpm,不需要再单独通过布丁的方式来安装PHP-fpm,在编译的时候加入参数--enable-fpm即可。

FPM(FastCGI Process Manager)用于替换PHP FastCGI的大部分附加功能,对于高负载网站非常有用。

首先将bin/PHP-fpm加入到系统PATH中:

# vim /etc/profile

export PHP_HOME=/usr/local/PHP
export PATH=$PATH:$PHP_HOME/bin:$PHP_HOME/sbin

$ source /etc/profile

$ PHP -version
PHP 4 (cli) (built: Jan  3 2015 11:16:17)
copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0,copyright (c) 1998-2014 Zend Technologies

然后复制默认的配置文件:

# cp /usr/local/src/PHP-4/PHP.ini-production /usr/local/PHP-PHP.ini
# cp /usr/local/PHP-4/etc/PHP-fpm.conf.default /usr/local/PHP-4/etc/PHP-fpm.conf

接下来修改默认配置文件:

# vim /usr/local/PHP/etc/PHP.ini

date.timezone = Asia/Shanghai

# vim /usr/local/PHP/etc/PHP-fpm.conf

[global]
pid = /usr/local/PHP-4/var/run/PHP-fpm.pid
error_log = /usr/local/PHP-4/var/log/PHP-fpm.log
log_level = error

[www]
user = www
group = www
listen = 127.0.0.1:9000
listen.owner = www
listen.group = www
listen.mode = 0666

添加启动脚本,之后可以使用service来启动PHP-fpm程序,并且设置开机自启动:

# 4/sapi/fpm/init.d.PHP-fpm /etc/init.d/PHP-fpm
# chmod +x /etc/init.d/PHP-fpm
# service PHP-fpm
Usage: /etc/init.d/PHP-fpm {start|stop|force-quit|restart|reload|status}
# chkconfig PHP-fpm on

启动PHP-fpm:

# service PHP-fpm start
Starting PHP-fpm  done

如果启动的时候出现错误(实际操作中发现存在该情况):

Starting PHP-fpm /usr/local/PHP-4/sbin/PHP-fpm: error while loading shared libraries: libMysqLclient.so.18: cannot open shared object file: No such file or directory
 Failed

则将MysqL的so库文件copy到系统下:

# cp /usr/local/MysqL/lib/libMysqLclient.so.18 /usr/lib64/

再来重新启动PHP,这次启动成功。

#PHP+Nginx#

现在来编辑Nginx.conf以支持PHP解析,查看当前PHP环境是否可以正常运行:

# vim /usr/local/Nginx/conf/Nginx.conf

http {
    server {
        listen       80;
        server_name  localhost;
        root         html;
        index        index.html index.PHP;
        location ~ \.PHP$ {
            try_files      $uri = 404;
            include        fastcgi.conf;
            fastcgi_pass   ;
            fastcgi_index  index.PHP;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
    }
}

然后编写一个简单的PHP文件,用来显示当前PHP环境信息:

# vim /usr/local/Nginx-1.6.2/html/PHPinfo.PHP

<?PHP
PHPinfo();
?>chown -R www:www /usr/local/Nginx-2

启动Nginx,并打开浏览器访问地址http://youripaddress/PHPinfo.PHP应该可以看到:

至此,Nginx与PHP已经可以正常协同工作。

#PHP的扩展安装#

很多时候我们还需要给PHP安装各种扩展支持,比如memcache、redis、mongodb等,下面用几个例子来说明下。

1、安装memcache扩展:

# pecl.PHP.net/get/memcache-2.2.7.tgz
# tar zxf memcache-2.2.7.tgz
# cd memcache-
# /usr/local/PHP-PHPize
# ./configure --with-PHP-config=/usr/local/PHP-4/bin/PHP-config
# make && 
Installing shared extensions:     /usr/local/PHP-4/lib/PHP/extensions/no-debug-zts-20131226/

2、安装memcached扩展(支持SASL):

1)首先可以使用yum安装SASL环境:

# yum install cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib

2)然后下载并安装libmemecached:

# wget https:launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
# tar zxf libmemcached-18..gz
# cd libmemcached-18
# ./configure --prefix=/usr/local/libmemcached-18 --enable-sasl
# install

3)最后再安装memcached扩展:

# pecl.PHP.net/get/memcached-2.2.0.tgz
# tar zxf memecached-0.tgz
# cd memecached-4/bin/PHP-config --with-libmemcached-dir=/usr/local/libmemcached-18 --enable-memcached-20131226/

注:前面安装的libmemcached必须支持SASL,否则可能出现如下错误:

configure: error: no,libmemcached sasl support is not enabled. Run configure with --disable-memcached-sasl to disable this check

3、安装redis扩展:

# pecl.PHP.net/get/redis-2.2.7.tgz
# tar zxf redis-.tgz
# cd redis-20131226/

扩展安装完之后,还要打开PHP.ini文件编辑如下:

# vim /usr/local/PHP-PHP.ini

extension=memcache.so
extension=memcached.so
extension=redis.so

#PHP的安全配置#

1、控制脚本访问权限。由于PHP默认配置允许PHP脚本程序访问服务器上的任意文件,为避免PHP脚本访问不该访问的文件,需要设置PHP只能访问网站目录或其他必须可访问的目录。比如:

# vim /usr/local/PHP/etc/PHP.ini

open_basedir=/data/PHP/uploads:/data/www/proj1:/data/www/proj2

2、禁止使用PHP危险函数,这些函数都是PHP木马常用的,比如:

# vim /usr/local/PHP/etc/PHP.ini

disable_functions = dl,assert,exec,popen,system,passthru,shell_exec,proc_close,proc_open,pcntl_exec

3、关闭注册全局变量(PHP-5.3.*和PHP-5.4.*中已废除)

register_globals = Off

4、开启magic_quotes_gpc(PHP-5.3.*和PHP-5.4.*中已废除),由于magic_quotes_gpc会把引用的数据中包含单引号'和双引号"以及反斜线 \自动加上反斜线,自动转译符号,确保数据操作的正确运行,magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据,可以有效的防止sql注入漏洞。

magic_quotes_gpc = On

5、关闭错误信息提示,因为这些错误信息可能泄漏服务器的路径信息和数据库信息等。

display_errors = Off

6、开启错误日志记录,可以考虑跟Web服务器的日志放在一起,比如:

log_errors = On
error_log = /data/logs/PHP/PHP_error.log

7、禁止访问远程文件,因为访问URL远程资源使得程序的漏洞变得更加容易被利用,关闭之,如果要访问远程服务器建议采用其他方式比如libcurl库。

allow_url_fopen = Off
allow_url_include = Off

8、开启PHP安全模式(PHP-5.3.*和PHP-5.4.*中已废除)

safe_mode = On

9、补上Nginx文件解析漏洞。

cgi.fix_pathinfo = 0

10、确保PHP(FastCGI)以非root权限启动。如果是php-cgi进程,需要su道普通用户再启动;PHP-fpm进程默认已是非root用户进行,配置中配置即可,不能修改为root运行。比如这里:

root     28953  0.0  1.1 196060  5736 ?        Ss   12:21   0:00 PHP-fpm: master process (/usr/local/PHP-4/etc/PHP-fpm.conf)                                                        
www      28954  1.0 5504 ?        S    00 PHP-fpm: pool www                                                                                                            
www      28955  fpm: pool www                                                                                                               
root     28974  0.1 103252   836 pts/0    S+   22   00 grep PHP-fpm

注:这里只有master是root用户权限,其他两个pool中的进程都是www用户,这是正确的。

#PHP的性能配置#

性能配置主要是为了让PHP能够运行得更好,这里很多时候需要根据业务的需求和当前系统的配置来设置,以下的配置只作为参考作用。

1、配置上传文件大小限制(一般不超过2MB)

# vim /usr/local/PHP/etc/PHP.ini

file_uploads = On
upload_tmp_dir = /data/PHP/upload
upload_max_filesize = 5M
post_max_size = 8M

max_execution_time = 30
max_input_time = 60
memory_limit = 32M

2、使用阿里云的OCS(memcache)来代替文件作为session的存储(这里需要前面安装memcached的扩展库,并且支持SASL),比如:

# vim /usr/local/PHP/etc/PHP.ini

;session.save_handler = files
;session.save_path = "/tmp"
;session.save_path = /data/PHP/session
;session.gc_maxlifetime = 1440

session.save_handler = memcached
session.save_path = something.m.cnszalist3pub001.ocs.aliyuncs.com:11211
session.gc_maxlifetime = 3600

[memcached]
memcached.use_sasl = On
memcached.sess_binary = On
memcached.sess_sasl_username = yourusername
memcached.sess_sasl_password = yourpassword
memcached.sess_locking = Off
memcached.sess_prefix = memc.sess.key."

注:使用其他的诸如memcache或redis缓存也是类似上面的配置。

可以编写一个简单的OCS的PHP代码来进行测试,比如:

# vim ocs.PHP

<?PHP
$mem = new Memcached(ocs);
$mem->setoption(Memcached::OPT_COMPRESSION,false);
$mem->setoption(Memcached::OPT_BINARY_PROTOCOL,255)">true);
$mem->addServer(something.m.cnszalist3pub001.ocs.aliyuncs.com",11211);
$mem->setSaslAuthData();

$key = key;
$mem->set($key,0)">ocs cache value);
$cache = $mem->get($key);
if (empty($cache)) {
    echo Oh,No!;
} else {
    Thanks God,the cache value is '{$cache}';
}
?>

CentOS安装PHP-5.6.4+扩展安装+安全配置+性能配置的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  3. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  4. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. ios – Swift 4添加手势:覆盖vs @objc

    我想在我的视图中添加一个手势,如下所示:但是,在Swift4中,我的编译器给出了以下错误:建议添加@objc以将此实例方法公开给Objective-C.实现此目的的另一个选项将覆盖touchesBegan()函数并使用它来处理点击.我试图以“Swift”的方式做到这一点,而不必带入Obj-C.有没有纯粹的Swift方式来添加这个轻击手势而不使用@objc?

  6. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  7. ios – 以编程方式在Swift中添加联系人

    我想在Swift中以编程方式添加联系人.我发现了一些Objective-C示例,但我没有让它们工作,甚至在Objective-C中也没有.我不希望这涉及到AddressBookUI,因为我想从我自己的UI中获取值.解决方法这是在Swift中添加联系人的快速方法.我在我的iPhone5iOS7.1上验证了它,因为我发现模拟器并不总是与我的手机对AB的东西相同.您可以添加一个按钮并指向此方法:顺便说一下–它假设你已经分配了一个地址簿var,你可以通过覆盖viewDidAppear来打开视图.它也会执行安全提示

  8. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  9. ios – 为目标c中的方法传递未知类型的参数,可能吗?

    是否可以将未知类型的参数传递给objective-C方法?在C#中你可以写实现这一点,但我知道Objective-C没有泛型,所以有没有其他方法可以在Objective-C中实现这一点?我需要这个,因为我想创建一个方法来改变不同对象的文本颜色,如UITextField和UIButton的占位符文本.所以我的计划是创建一个名为textWhite的方法,然后在此方法中检查对象的类型,然后运行匹配的代码以使文本颜色变为白色.解决方法是的,可以传递未知类型的参数.见下面的例子.请参考使用id对象的链接作为参数Us

  10. ios – Swift指针算术和解除引用;将一些类似C的地图代码转换为Swift

    我有一点似乎没有工作的Swift代码……解决方法您正在指定locationPointer指向新位置,但仍在下一行中使用ptr,并且ptr的值尚未更改.将您的最后一行更改为:或者你可以改变指向var的指针并推进它:

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部