PHP7与PHP5共存于CentOS7

服务器上除了小部分应用比较老,只能在PHP5下跑,其他应用都能在PHP7下跑,所以在复习建造师考试的空余就折腾了一下共存。思路很简单:PHP5是通过yum安装的在/usr/,套接字在/var/run/php-fpm.socket,PHP7自己编译装在/usr/local/php7,套接字在/var/run/php7-fpm.socket,nignx根据应用需要跑的环境指定fastcgi_pass。

编译并安装PHP7

先通过yum来安装编译需要的各种依赖包

    yum install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel -y

接着到官网下载最新的PHP源码(现在是7.1.8),解压

    cd ~
    wget http://am1.php.net/distributions/php-7.1.8.tar.gz
    tar xvf  php-7.1.8.tar.gz
    cd php-7.1.8

然后设置编译参数,这里有几个事情要提一下:

  1. 为了减少后续因为权限导致的问题,建议将nginx和php-fpm用相同的用户和用户组即(--with-fpm-user=nginx --with-fpm-group=nginx)。
  2. 为了减少多网卡等复杂网络环境造成的问题,在不使用ipv6网络的情况下关闭ipv6的支持(--disable-ipv6)。
  3. 开启mysql数据库的API扩展(--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd )
  4. 开启opcache扩展(--enable-opcache)

完整的编译参数如下:

    ./configure \
    --prefix=/usr/local/php7 \
    --with-config-file-path=/usr/local/php7/etc \
    --with-config-file-scan-dir=/usr/local/php7/etc/php.d/ \
    --disable-ipv6  \
    --enable-fpm \
    --with-fpm-user=nginx  \
    --with-fpm-group=nginx \
    --enable-inline-optimization \
    --disable-debug \
    --disable-rpath \
    --enable-shared  \
    --enable-soap \
    --with-libxml-dir \
    --with-xmlrpc \
    --with-openssl \
    --with-mcrypt \
    --with-mhash \
    --with-pcre-regex \
    --with-sqlite3 \
    --with-zlib \
    --enable-bcmath \
    --with-iconv \
    --with-bz2 \
    --enable-calendar \
    --with-curl \
    --with-cdb \
    --enable-dom \
    --enable-exif \
    --enable-fileinfo \
    --enable-filter \
    --with-pcre-dir \
    --enable-ftp \
    --with-gd \
    --with-openssl-dir \
    --with-jpeg-dir \
    --with-png-dir \
    --with-zlib-dir  \
    --with-freetype-dir \
    --enable-gd-native-ttf \
    --enable-gd-jis-conv \
    --with-gettext \
    --with-gmp \
    --with-mhash \
    --enable-json \
    --enable-mbstring \
    --enable-mbregex \
    --enable-mbregex-backtrack \
    --with-libmbfl \
    --with-onig \
    --enable-pdo \
    --with-mysqli=mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --with-zlib-dir \
    --with-pdo-sqlite \
    --with-readline \
    --enable-session \
    --enable-shmop \
    --enable-simplexml \
    --enable-sockets  \
    --enable-sysvmsg \
    --enable-sysvsem \
    --enable-sysvshm \
    --enable-wddx \
    --with-libxml-dir \
    --with-xsl \
    --enable-zip \
    --enable-mysqlnd-compression-support \
    --with-pear \
    --enable-opcache

设置检查通过之后就是喜闻乐见的make和make install了,有兴趣的可以在make install之前make test一下。

配置PHP7

make install无错安装成功之后就开始进行配置,首先将默认配置复制到指定位置,

    cp php.ini-production /usr/local/php7/etc/php.ini
    cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
    cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
    cp -R ./sapi/fpm/php-fpm.service /usr/lib/systemd/system/php7-fpm.service

然后按照需求进行修改,必须修改的内容有:

  1. /usr/local/php7/etc/php-fpm.d/www.conf中:
    listen = /var/run/php7-fpm.socket

listen的位置就是nignx中fastcgi_pass的unix套接字地址。

  1. /usr/local/php7/etc/php.ini中:
    pdo_mysql.default_socket=/var/lib/mysql/mysql.sock

由于PHP从5.x开始,PHP连接MYSQL无论使用哪种方式都是使用的mysqlnd驱动,且PHP7已经正式移除了mysql扩展,由于新特性的原因,PHP7针对数据库主机地址为localhost和127.0.0.1时分别会采用unix domain socket和TCP/IP两种不同的方式连接MySQL服务。

而采用unix domain socket方式时PHP7会使用默认的/tmp/mysql.sock作为套接字,但是CentOS7默认MySQL服务MariaDB的套接字位置为/var/lib/mysql/mysql.sock,于是即使是所有数据库连接信息都正确的情况下也会出现诸如“mysqli::real_connect(): (HY000/2002): No such file or directory ” 和 “Error establishing a database connection”之类的错误提示。

为了避免这个莫名其妙的问题,请将pdo_mysql.default_socket修改为MySQL服务的socket地址。

    cgi.fix_pathinfo=0

默认cgi.fix_pathinfo=1,这是一个曾经产生了大面积安全风险的默认设置项,虽然现在PHP-FPM已经做了安全过滤,但是出于安全考虑还是在php.ini中也关闭吧。pathinfo功能在nginx里可以通过正则来实现。

    date.timezone ="Asia/Hong_Kong"

修改时区,避免时间混乱的情况。

    disable_functions = exec,passthru,popen,proc_open,shell_exec,system,assert,chroot,delete,rmdir,rename,chgrp,chmod,chown,copy,mkdir

关闭部分可能带来危险的函数,如果没有特殊需求的话建议加上。

    zend_extension=/usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/opcache.so
    [opcache]
    opcache.force_restart_timeout=3600
    opcache.memory_consumption=128
    opcache.optimization_level=1
    opcache.max_accelerated_files=4096
    opcache.revalidate_freq=60
    opcache.fast_shutdown=1
    opcache.enable=1
    opcache.enable_cli=1

Zend OPcache通过opcode缓存和优化避免重复编译,减少CPU和内存开销提供更快的PHP执行速度,作为PHP7的高性能扩展之一,不开可惜哦~ 这部分内容可以单独形成ini文件放在/usr/local/php7/etc/php.d/目录下,也可以直接添加在php.ini中,启用之后最好在phpinfo中确认Zend OPcache状态正常。

其他日志权限之类的常规配置就不再赘述,配置完了就添加自启并启动PHP-FPM服务

    systemctl enable php7-fpm.service
    systemctl start  php7-fpm.service

配置Nginx

这个不多说,对能够在PHP7上跑的vhost,将其fastcgi_pass改到PHP7的套接字上就好了

    fastcgi_pass  unix:/var/run/php7-fpm.socket;

对了,在nginx中实现pathinfo之后,记得在fastcgi_params中加上

    try_files $uri = 404;

用来阻止不必要的数据传到后端php7-fpm,先这样吧,下次再来填坑。


相关文章

已有 2 条评论
  1. liwanglin12

    赶紧去加上了 try_files = =

    liwanglin12 回复
  2. hans

    不错,学习了~

    hans 回复
发表新评论