CentOS 7 安裝php7

CentOS 7源碼編譯安裝 php7.2

介紹:php

先安裝php依賴包,不然在編譯安裝php7的過程中會出現各類報錯,安裝完成後便可進入下一個環節。html

安裝php依賴組件(包含Nginx依賴):mysql

$ 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安裝包解壓:nginx

$ 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

設置變量並開始源碼編譯【如下項目基本夠用了】:c++

$ 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 \

若無報錯執行下一步安裝,若是編譯過程當中出現錯誤,根據報錯安裝依賴包,一般不會出現這種問題。sql

開始安裝:shell

$ 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

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

一、expose_php = Off 
咱們常常會在一個http頭裏發現這樣的信息:X-Powered-By:PHP/5.2.11,將其設置爲 Off 就隱藏php版本了。

二、register_globals = Off
PHP在進程啓動時,會根據register_globals的設置,判斷是否將$_GET、$_POST、$_COOKIE、$_ENV、$_SERVER、$REQUEST等數組變量裏的內容自動註冊爲全局變量。

三、allow_url_include =Off

PHP經過此選項控制是否容許經過include/require來執行一個遠程文件(如http://evil.com/evil.php或ftp://evil.com/evil.php)。數組

四、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時,有如下缺點:

 
 

一、php此時會對全部GPC參數作addslashes處理,會有比較大的性能損耗。

 
 

二、當GPC參數被用於其餘操做如邏輯關係判斷以前就必須先作strislashes處理,不然結果必然是不正確的。

 
 

考慮到開啓此選項帶來的性能損耗和代碼的複雜化,能夠在使用時靈活設置,對於一些不規範或者無人維護的代碼,能夠開啓此選項;更好的作法是將此值設置爲Off,由開發者嚴格過濾來自用戶的輸入。

 
 

五、display_errors = Off

此控制項控制PHP是否將error、notice、warning日誌打印出來,以及打印的位置。錯誤信息主要用於輔助開發,可是在線上環境卻很是危險,由於這樣將會把服務端的WebServer、數據庫、PHP代碼部署路徑,甚至是數據庫鏈接、數據表等關鍵信息暴露出去,爲攻擊者帶來極大便利。因此建議產品上線時修改成Off。

六、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

攻擊者會利用這些信息,猜想代碼邏輯,使得攻擊變得更方便。

 

七、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的關係:

http://www.javashuo.com/article/p-cpuaaglx-bq.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

相關文章
相關標籤/搜索