2016-12-01 1 min read
PHP 7 极大地改进了性能,在一些WordPress基准测试当中,性能可以达到PHP 5.6的3倍。为了体验到更好的性能,尝试在自己的VPS使用最新的PHP 7,以下为整理的安装方法,期望对需要安装的小伙伴们有所帮助。
php 7.0有两个源可以选择,一个是webtatic提供的,也就是php70w,那个w指得就是webtatic,另一个可以使用remi源。这里主要以webtatic进行展开讲解。
1 2 3 4 |
yum install epel-release rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum update yum list | grep php7 |
查看具体的包信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
[root@localhost ~]# yum list | grep php7 php70w-cli.x86_64 7.0.13-1.w7 @webtatic php70w-common.x86_64 7.0.13-1.w7 @webtatic php70w-fpm.x86_64 7.0.13-1.w7 @webtatic php70w-gd.x86_64 7.0.13-1.w7 @webtatic php70w-mcrypt.x86_64 7.0.13-1.w7 @webtatic php70w-mysqlnd.x86_64 7.0.13-1.w7 @webtatic php70w-opcache.x86_64 7.0.13-1.w7 @webtatic php70w-pdo.x86_64 7.0.13-1.w7 @webtatic php70w-pear.noarch 1:1.10.1-1.w7 @webtatic php70w-pecl-imagick.x86_64 3.4.2-0.1.w7 @webtatic php70w-pecl-redis.x86_64 3.0.0-1.w7 @webtatic php70w-pgsql.x86_64 7.0.13-1.w7 @webtatic php70w-process.x86_64 7.0.13-1.w7 @webtatic php70w-xml.x86_64 7.0.13-1.w7 @webtatic php70w.x86_64 7.0.13-1.w7 webtatic php70w-bcmath.x86_64 7.0.13-1.w7 webtatic php70w-dba.x86_64 7.0.13-1.w7 webtatic php70w-devel.x86_64 7.0.13-1.w7 webtatic php70w-embedded.x86_64 7.0.13-1.w7 webtatic php70w-enchant.x86_64 7.0.13-1.w7 webtatic php70w-imap.x86_64 7.0.13-1.w7 webtatic php70w-interbase.x86_64 7.0.13-1.w7 webtatic php70w-intl.x86_64 7.0.13-1.w7 webtatic php70w-ldap.x86_64 7.0.13-1.w7 webtatic php70w-mbstring.x86_64 7.0.13-1.w7 webtatic php70w-mysql.x86_64 7.0.13-1.w7 webtatic php70w-odbc.x86_64 7.0.13-1.w7 webtatic php70w-pdo_dblib.x86_64 7.0.13-1.w7 webtatic php70w-pecl-apcu.x86_64 5.1.7-1.w7 webtatic php70w-pecl-apcu-devel.x86_64 5.1.7-1.w7 webtatic php70w-pecl-imagick-devel.x86_64 3.4.2-0.1.w7 webtatic php70w-pecl-mongodb.x86_64 1.1.8-2.w7 webtatic php70w-pecl-xdebug.x86_64 2.4.1-1.w7 webtatic php70w-phpdbg.x86_64 7.0.13-1.w7 webtatic php70w-pspell.x86_64 7.0.13-1.w7 webtatic php70w-recode.x86_64 7.0.13-1.w7 webtatic php70w-snmp.x86_64 7.0.13-1.w7 webtatic php70w-soap.x86_64 7.0.13-1.w7 webtatic php70w-tidy.x86_64 7.0.13-1.w7 webtatic php70w-xmlrpc.x86_64 7.0.13-1.w7 webtatic |
安装之前我们先学习下每个包的含义:
包名 | 包含内容 | 解释 |
php70w | mod_php, php70w-zts | mod_php模式运行PHP,服务器使用Apache的使用 |
php70w-bcmath | 支持大整数计算的扩展 | |
php70w-cli | php-cgi, php-pcntl, php-readline | CLI SAPI,命令行接口,该 CLI SAPI 模块主要用作 PHP 的开发外壳应用。 |
php70w-common | php-api, php-bz2, php-calendar, php-ctype, php-curl, php-date, php-exif, php-fileinfo, php-filter, php-ftp, php-gettext, php-gmp, php-hash, php-iconv, php-json, php-libxml, php-openssl, php-pcre, php-pecl-Fileinfo, php-pecl-phar, php-pecl-zip, php-reflection, php-session, php-shmop, php-simplexml, php-sockets, php-spl, php-tokenizer, php-zend-abi, php-zip, php-zlib | 常用包合集 |
php70w-dba | dba数据库支持 | |
php70w-devel | 同php70w,包含头文件和链接库,供开发用 | |
php70w-embedded | php-embedded-devel | Embed SAPI,容许你在C/C++语言中调用PHP/ZE提供的函数。 |
php70w-enchant | 各种拼写库的抽象层 | |
php70w-fpm | fastcgi模式运行PHP,使用Nginx的推荐使用 | |
php70w-gd | 图形扩展GD库 | |
php70w-imap | 收取邮件类 | |
php70w-interbase | php_database, php-firebird | InterBase数据库支持 |
php70w-intl | 国际化扩展,是ICU库的一个包装器。 | |
php70w-ldap | ldap验证支持 | |
php70w-mbstring | 国际化与字符编码支持 | |
php70w-mcrypt | 常用加密算法的封装 | |
php70w-mysql | php-mysqli, php_database | 同最新的mysqldnd |
php70w-mysqlnd | php-mysqli, php_database | mysqldnd即mysql native driver简写,即是由PHP源码提供的mysql驱动连接代码.它的目的是代替旧的libmysql驱动. |
php70w-odbc | php-pdo_odbc, php_database | 支持ODBC方式连接数据库 |
php70w-opcache | php70w-pecl-zendopcache | 脚本加速扩展 |
php70w-pdo | php70w-pdo_sqlite, php70w-sqlite3 | SQLite数据库支持 |
php70w-pdo_dblib | php70w-mssql | SQL Server数据库支持 |
php70w-pear | PHP扩展与应用库,pecl 是通过pear包安装的 | |
php70w-pecl-apcu | APC 是将要被遗弃的脚本加速扩展 | |
php70w-pecl-imagick | ImageMagick支持 | |
php70w-pecl-redis | 让PHP支持Redis | |
php70w-pecl-xdebug | Xdebug作为PHP调试工具,提供了丰富的调试函数,也可将Xdebug安装配置为zend studio、editplus调试PHP的第三方插件,通过开启自动跟踪(auto_trace)和分析器功能,可以直观的看到PHP源代码的性能数据,以便优化PHP代码。 | |
php70w-pgsql | php-pdo_pgsql, php_database | PostgreSQL数据库支持 |
php70w-phpdbg | PHPDBG是一个PHP的SAPI模块,可以在不用修改代码和不影响性能的情况下控制PHP的运行环境。 | |
php70w-process | php-posix, php-sysvmsg, php-sysvsem, php-sysvshm | 进程控制扩展 |
php70w-pspell | 拼写检查扩展 | |
php70w-recode | ||
php70w-snmp | SNMP协议,供监控使用 | |
php70w-soap | SOAP 协议扩展 | |
php70w-tidy | 网页代码分析和纠错的工具 | |
php70w-xml | php-dom, php-domxml, php-wddx, php-xsl | 方便解析XML的扩展 |
php70w-xmlrpc | XML-RPC 协议扩展 |
比较容易混淆的概念:mod_php与FastCGI
任何一种Web服务器(Apache、Nginx等)都是被设计成向用户发送html、图片等静态资源的,Web服务器自身并不能解释任何动态脚本(PHP、Python等)。
mod_php
以Apache模块方式运行PHP。当PHP以模块的方式运行在Apache中时,PHP解释器被“内嵌”在Apache的进程里。Apache不会调用任何外部的PHP进程,因此这种方式使Apache与PHP能更好的通信。但是,当以这种方式运行PHP的时候,哪怕Apache提供的仅仅是静态的资源(如HTML),Apache的每个子进程也都会载入 mod_php,导致了比正常情况下更多的内存开销。以这种方式运行的另一个缺点是,它仅能与Apache一起配合工作。
优点:
缺点:
FastCGI
FastCGI是交互程序与Web服务器通用的协议接口,是早期CGI(Common Gateway Interface)的一个变种。相对于CGI来说,FastCGI减少了和Web服务器交互的开销,同时一次可以处理更多的请求。Apache可以以mod_fcgid的形式使用FastCGI。其他Web服务器,如lighttpd, nginx, Cherokee,甚至微软的IIS也都能使用FastCGI。使用FastCGI,可以同时设置多个版本的PHP,这在某些情况下非常有用。FastCGI还利用suexec来支持不同的用户用自己的PHP的实例。这个特性对于在共享环境下提高安全性尤其重要。FastCGI在保证性能的同时,也减少了Web服务器的内存开销。
优点:
缺点
核心内容的安装:
扩展安装:(按需扩展)
1 |
yum install php70w-common php70w-pear php70w-pecl-imagick php70w-gd php70w-process php70w-mcrypt php70w-intl php70w-mbstring php70w-recode php70w-tidy php70w-xml php70w-soap php70w-xmlrpc php70w-mysqlnd php70w-pdo php70w-pecl-redis php70w-pgsql |
至此,安装PHP的工作就简单的完成了,可以使用systemd管理相关服务:
1 2 |
systemctl enable php-fpm systemctl start php-fpm |
当然,这还没要,要能够使PHP正常运行还需要进一步的配置。
1、修复可能存在的漏洞
为了避免遭受恶意脚本注入的攻击,在没有文件存在的情况下,阻止 Nginx 将请求发送到后端的 PHP-FPM 模块。
将 php.ini 文件中的配置项 cgi.fix_pathinfo 设置为 0 。PHP 配置文件路径:/etc/php.ini。
2、修改为socket方式通信提升性能
PHP 默认配置文件使用的是监听 9000 端口进行通信,针对小型单一、没有做负债均衡的服务器,可以使用 unix socket 方式通信。
编辑/etc/php-fpm.d/www.conf 文件:
将 listen = 127.0.0.1:9000,修改为 listen = /var/run/php-fpm/php-fpm.sock
将
1 2 |
;listen.owner = nobody ;listen.group = nobody |
修改为(nginx执行的用户,可在 /etc/nginx/nginx.conf 中查看)
1 2 |
listen.owner = nginx listen.group = nginx |
如果与nginx.conf中的用户不一致,则会导致无法访问/var/run/php-fpm/php-fpm.sock。
3、设定php-fpm的执行用户及规划网站目录
添加用户:
1 2 |
groupadd www useradd -s /sbin/nologin -g www www |
将/etc/php-fpm.d/www.conf 中:
1 2 |
user = apache group = apache |
修改为:
1 2 |
user = www group = www |
即代表使用这个用户来运行php。
4、配置Nginx。
Nginx的默认配置文件为:/etc/nginx/nginx.conf,文件中自动include了/etc/nginx/conf.d/及/etc/nginx/conf.d/default.d/ 目录下所有的.conf结尾的文件,所以如需新增修改Nginx的配置只需要在这两个文件夹下新增和修改文件即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf;
events { worker_connections 1024; }
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048;
include /etc/nginx/mime.types; default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf;
server { listen 80 default_server; listen [::]:80 default_server; server_name _; root /usr/share/nginx/html;
# Load configuration files for the default server block. include /etc/nginx/default.d/*.conf;
location / { }
error_page 404 /404.html; location = /40x.html { }
error_page 500 502 503 504 /50x.html; location = /50x.html { } }
# Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # }
} |
其中/etc/nginx/conf.d/在http层级下,/etc/nginx/default.d/在server层级。
a.在/etc/nginx/conf.d/下新建php-fpm.conf文件,内容为:
1 2 3 4 5 6 |
# PHP-FPM FastCGI server # network or unix domain socket configuration
upstream php-fpm { server unix:/var/run/php-fpm/php-fpm.sock; } |
b./etc/nginx/default.d/下新建nginx-php.conf文件,内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# pass the PHP scripts to FastCGI server # # See conf.d/php-fpm.conf for socket configuration # index index.php index.html index.htm;
location ~ \.php$ { try_files $uri =404; fastcgi_intercept_errors on; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass php-fpm; } |
这样,默认的/usr/nginx/html目录就可以执行PHP程序了,先创建info.php文件:
1 |
echo ' /usr/share/nginx/html/info.php |
然后访问http://IP/info.php进行访问就可看到正常的PHP信息。
如果需要绑定一个或多个域名,则需要先创建对应的文件夹:
1 |
mkdir /home/www/www.biaodianfu.com |
然后在/etc/nginx/conf.d/目录下新增www.biaodianfu.com.conf文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
server { listen 80; server_name biaodainfu.com www.biaodianfu.com; index index.html index.htm index.php; charset utf-8;
root /home/www/www.biaodianfu.com;
location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; }
location ~ \.php$ { try_files $uri =404; fastcgi_pass php-fpm; #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
location ~ .*.(gif|jpg|jpeg|png|bmp|swf|flv|mp3|wma)$ { expires 30d; }
location ~ .*.(js|css)$ { expires 12h; } } |
这样一个新的站点就建立完成了。
1 2 3 4 5 6 7 8 9 10 11 12 |
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm rpm -Uvh remi-release-7.rpm epel-release-latest-7.noarch.rpm
yum --enablerepo=remi update remi-release yum --enablerepo=remi-php70
# 搜索PHP yum search php70
# 各取所需 yum install php70 php70-php-devel php70-php-fpm php70-php-mbstring php70-php-mcrypt php70-php-mysqlnd php70-php-gd php70-php-opcache php70-php-pdo php70-php-json php70-php-xml php70-php-pecl-xdebug php70-php-pecl-zip |
相应的服务:
1 2 |
systemctl start php70-php-fpm.service systemctl enable php70-php-fpm.service |
其他配置同上。
参考资料:
Uptdate:2016-12-13
安装完毕后,比如需要安装WordPress的时候可能会存在一些问题:
1 2 3 4 5 6 |
wget http://cn.wordpress.org/latest-zh_CN.tar.gz tar -xzvf latest.tar.gz mv wordpress/* ./ chown www:www -R * find . -type d -exec chmod 755 {} \; find . -type f -exec chmod 644 {} \; |
按照上述方案,然后在输入www.biaodianfu.com进行站点访问,发现返回的是404页面。在这种情况下,可以去/var/log/nginx/目录下查看nginx的日志,查询到如下信息:
1 |
2016/12/02 10:08:10 [crit] 11508#0: *87 stat() "/home/www/www.biaodianfu.com/404.html" failed (13: Permission denied), client: 58.211.111.34, server: www.biaodianfu.com, request: "GET / HTTP/1.1", host: "www.biaodianfu.com" |
通过报错信息,可初步判断是文件权限设置原因导致的。一步步测试看权限问题到底在哪里:
1 |
sudo -u nginx stat /home/www |
返回内容为:
1 2 3 4 5 |
Access: (0774/drwxrwxr--) Uid: ( 1000/ www) Gid: ( 1000/ www) Access: 2016-12-02 09:58:45.703817049 +0800 Modify: 2016-12-02 09:58:12.286814092 +0800 Change: 2016-12-02 10:07:57.727864002 +0800 Birth: - |
1 |
sudo -u nginx stat /home/www/www.biaodianfu.com |
返回内容为:
1 |
stat: cannot stat ?.home/www/www.biaodianfu.com?. Permission denied |
问题已经找到,接下来就是修改文件夹权限了,推荐的权限设置为:
1 2 |
chmod 755 /home/www/www.biaodianfu.com chmod 755 /home/www |