• CentOS 7 安装php7


    CentOS 7源码编译安装 php7.2

    介绍:

    先安装php依赖包,否则在编译安装php7的过程当中会出现各种报错,安装完成后即可进入下一个环节。

    安装php依赖组件(包含Nginx依赖):

    $ yum -y install wget vim pcre pcre-devel openssl openssl-devel libicu-devel gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel krb5-devel libidn libidn-devel openldap openldap-devel nss_ldap jemalloc-devel cmake boost-devel bison automake libevent libevent-devel gd gd-devel libtool* libmcrypt libmcrypt-devel mcrypt mhash libxslt libxslt-devel readline readline-devel gmp gmp-devel libcurl libcurl-devel openjpeg-devel

    创建用户和组,并下载php安装包解压:

    $ cd /tmp
    $ groupadd www
    $ useradd -g www www
    $ wget http://am1.php.net/distributions/php-7.2.1.tar.gz
    $ tar xvf php-7.2.1.tar.gz
    $ cd php-7.2.1

    设置变量并开始源码编译【以下项目基本够用了】:

    $ cp -frp /usr/lib64/libldap* /usr/lib/
    $ ./configure --prefix=/usr/local/php 
    --with-config-file-path=/usr/local/php/etc 
    --enable-fpm 
    --with-fpm-user=www 
    --with-fpm-group=www 
    --enable-mysqlnd 
    --with-mysqli=mysqlnd 
    --with-pdo-mysql=mysqlnd 
    --enable-mysqlnd-compression-support 
    --with-iconv-dir 
    --with-freetype-dir 
    --with-jpeg-dir 
    --with-png-dir 
    --with-zlib 
    --with-libxml-dir 
    --enable-xml 
    --disable-rpath 
    --enable-bcmath 
    --enable-shmop 
    --enable-sysvsem 
    --enable-inline-optimization 
    --with-curl 
    --enable-mbregex 
    --enable-mbstring 
    --enable-intl 
    --with-libmbfl 
    --enable-ftp 
    --with-gd 
    --with-openssl 
    --with-mhash 
    --enable-pcntl 
    --enable-sockets 
    --with-xmlrpc 
    --enable-zip 
    --enable-soap 
    --with-gettext 
    --disable-fileinfo 
    --enable-opcache 
    --with-pear 
    --enable-maintainer-zts 
    --with-ldap=shared 
    --without-gdbm 

    若无报错执行下一步安装,如果编译过程中出现错误,根据报错安装依赖包,通常不会出现这种问题。

    开始安装:

    $ make -j 4 && make install

    完成安装后配置php.ini文件:

    $ cp php.ini-development /usr/local/php/etc/php.ini
    $ cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
    $ cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

    * 修改 php.ini 相关参数:

    $ vim /usr/local/php/etc/php.ini
    
    1、expose_php = Off 
    我们经常会在一个http头里发现这样的信息:X-Powered-By:PHP/5.2.11,将其设置为 Off 就隐藏php版本了。

    2、register_globals = Off
    PHP在进程启动时,会根据register_globals的设置,判断是否将$_GET、$_POST、$_COOKIE、$_ENV、$_SERVER、$REQUEST等数组变量里的内容自动注册为全局变量。

    3、allow_url_include =Off

    PHP通过此选项控制是否允许通过include/require来执行一个远程文件(如http://evil.com/evil.php或ftp://evil.com/evil.php)。

    4、magic_quotes_gpc = on[也可以off,注意自己过滤]

    举一个典型的SQL注入示例,假如SQL语句用如下方式拼接:

    
    

    select * from user where pass=’ “. $_GET[‘passwd’]. ”' and user='” . $_GET[‘username’] .”';

    
    

    假如用户提交一个login.php?passwd=p&username=’ or ‘1’=’1请求,代码中的SQL语句将变成:

    
    

    
    

    这就造成一个SQL注入漏洞。避免此问题出现的正确思路是开发者在拼接SQL语句之前过滤所有接收的数值,并严格执行这种编码规范,但是并不是所有的开发者都会意识到这种问题的存在,而此时,如果将php.ini的magic_quotes_gpc设置为On时,PHP将对所有GPC参数($_GET,$_POST,$_COOKIE)进行addslashes处理[既转义单引号、双引号、反斜线和nullbyte],该SQL语句将是:

    
    

    
    

    由于’已经被转义,SQL语句不能被成功执行,从而防止SQL注射。

    
    

    另外,以小节2中的http://HostA/test.php为例,当magic_quotes_gpc= Off的情况下,用户提交一个example.php?param=../../../etc/passwd%00请求,由于代码中限制的文件后缀(.php)将被%00截断,就会通过require_once尝试读取/etc/passwd文件。

    
    

    值得注意的是,magic_quotes_gpc配置为On时,有以下缺点:

    
    

    1、php此时会对所有GPC参数做addslashes处理,会有比较大的性能损耗。

    
    

    2、当GPC参数被用于其他操作如逻辑关系判断之前就必须先做strislashes处理,否则结果必然是不正确的。

    
    

    考虑到开启此选项带来的性能损耗和代码的复杂化,可以在使用时灵活设置,对于一些不规范或者无人维护的代码,可以开启此选项;更好的做法是将此值设置为Off,由开发者严格过滤来自用户的输入。

    
    

    5、display_errors = Off

    此控制项控制PHP是否将error、notice、warning日志打印出来,以及打印的位置。错误信息主要用于辅助开发,但是在线上环境却非常危险,因为这样将会把服务端的WebServer、数据库、PHP代码部署路径,甚至是数据库连接、数据表等关键信息暴露出去,为攻击者带来极大便利。所以建议产品上线时修改为Off。

    6、error_reporting = E_ALL& ~E_NOTICE

    此配置项控制PHP打印哪些错误日志(errors,warnings,notices)。默认情况下会打印所有的错误日志,线上环境我们应该不显示具体的E_NOTICE日志信息。

    导致E_NOTICE错误的最普遍场景是——使用未经初始化的变量,以下述代码为例:

     // 假如用户请求中无username 参数,则会打印notice错误

    <?php

           // 假如用户请求中无username 参数,则会打印notice错误

           $username = $_GET[‘username’];

           // 引用一个未初始化的变量var2

           //  则会打印notice错误

           $var1   = $var2;

    ?>

    如果用户访问的url中没有指定username参数,则代码中$_GET[‘username’]就是一个未经初始化的变量,直接访问就会抛出一个NOTICE错误。上述代码执行会报如下错误,这样即泄漏了代码目录。

    PHP Notice: Undefined index: username in /somepath/test.php on line 3

    PHP Notice: Undefined variable: var2 in /somepath/test.php on line 6

    攻击者会利用这些信息,猜测代码逻辑,使得攻击变得更方便。

    7、display_startup_errors =Off  

    php启动时产生的错误由此选项进行控制,这个和display_errors是分开的。为了避免PHP进城启动时产生的错误被打印到页面上而造成信息泄漏,此选项在线上服务也应该被配置为Off。

    为了方便开发和调试,开发环境可以将其设置为On。

    以下根据自己需求该即可,没必要个人感觉:
    max_execution_time = 300 脚本超时时间
    max_input_time = 300 接收数据时间
    memory_limit = 128M 这个内存根据需求改
    post_max_size = 32M
    date.timezone = Asia/Shanghai
    mbstring.func_overload=2
    extension = ldap
    "/usr/local/php/lib/php/extensions/no-debug-zts-20160303/ldap.so"

    设置 OPcache 缓存:

    /usr/local/php/lib/php/extensions/no-debug-zts-20160303/opcache.so
    [opcache]
    extension=opcache
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=4000 最大缓存文件数目,推荐4000
    opcache.revalidate_freq=60
    

    设置php安全函数:

    $ vim /usr/local/php/etc/php.ini

    默认值:

    disable_functions =

    修改为:

    disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname

    或通配:

    disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru

    * 配置www.conf:

    取消以下注释并修改优化其参数:

    listen = /var/run/www/php-cgi.sock
    listen.owner = www
    listen.group = www
    listen.mode = 0660
    listen.allowed_clients = 127.0.0.1

    以下的值根据需要配置 pm = dynamic listen.backlog = -1 pm.max_children = 40 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 40 request_terminate_timeout = 120 request_slowlog_timeout = 50 slowlog = var/log/slow.log

    * 创建php-cgi.sock存放目录

    $ mkdir /var/run/www/
    $ chown -R www:www /var/run/www

    * 配置php-fpm.conf

    取下以下注释并填写完整路径:

    pid = /usr/local/php/var/run/php-fpm.pid

    至此php7已经安装完成。

    说明:禁用php函数,如果程序需要这些函数,可以取消禁止,新手建议忽略此步骤。

    说明2:php.ini和php-fpm.conf和www.conf的关系:

    https://www.cnblogs.com/kenshinobiy/p/7119346.html

    创建system系统单元文件php-fpm启动脚本:

    $ vim /usr/lib/systemd/system/php-fpm.service

    添加如下变量内容:

    [Unit]
    Description=The PHP FastCGI Process Manager
    After=syslog.target network.target
    
    [Service]
    Type=simple
    PIDFile=/usr/local/php/var/run/php-fpm.pid
    ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
    ExecReload=/bin/kill -USR2 $MAINPID
    
    [Install]
    WantedBy=multi-user.target

    启动php-fpm服务并加入开机自启动:

    $ systemctl enable php-fpm.service
    $ systemctl restart php-fpm.service

    PHP整个安装过程已经完成。

     

    将php命令软链接到/usr/local/bin/以便于在命令行使用。

    ln -sv /usr/local/php/bin/php /usr/local/bin/

     

    ========================================================

    配置nginx支持php
    配置nginx.conf如下:

    其中:fastcgi_pass的.sock路径在/usr/local/php/etc/php-fpm.d/www.conf中搜索listen
     # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            location ~ .php$ {
                root           html;
                #fastcgi_pass   127.0.0.1:9000;
                fastcgi_pass   unix:/var/run/www/php-cgi.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
            }

     

    ===============================================

    nginx配置时fastcgi_pass 参数问题:

    http://www.cnblogs.com/manzb/p/8875406.html

  • 相关阅读:
    还有更简单的不重复随机数生成方法吗?
    SqlServer数据插入性能小记
    html页面滚动时元素错位解决方案
    为Web页中的Table对象创建一个映射表
    js实现的快速排序
    webkit内核的浏览器为什么removeAttribute('style')会失效?
    setAttribute第三个参数
    Windows转到linux中,文件乱码,文件编码转换
    查看端口的占用
    sndfile
  • 原文地址:https://www.cnblogs.com/deverz/p/8529626.html
Copyright © 2020-2023  润新知