一直用惯 CentOS 系统的我,之前一直都是耍 PHP 5.4 这样老的版本。

所以之前的“重装之路”教大家的是安装 PHP 5.4 这样的版本。

但是,其实现在这个 PHP 的版本 PHP 官方也不维护了。

如果不是老网站,我可能会尝试新的 PHP 7

不过我没有探索过 PHP 7,手痒想研究一下,那当然要先安装这玩意啦。

这篇文章就是我摸索安装 PHP 7 的经验。

选择怎样的安装方式

我们知道,CentOS 支持 yum 的安装方式,懒人都喜欢它。

不过,yum 的官方源是不提供 PHP 7 的,因此还要搞别的源,很是烦闷。

因此,我打算采取 编译安装 的方式。

虽然折腾了一点、又浪费时间,但是至少我可以灵活调整安装些啥。

下载 PHP 7 源代码

直奔 PHP 的官方网站: php.net

直接就可以看到 Downloads 的栏目,点进去(我知道你们想要直通车,点我就可以进去了)。

截至2017年1月24日,最新的稳定版本是 PHP 7.1.1,那我们就用它吧。

在下面,我们可以看到:

  • php-7.1.1.tar.bz2 (sig) [15,405Kb] 19 Jan 2017
  • php-7.1.1.tar.gz (sig) [19,800Kb] 19 Jan 2017
  • php-7.1.1.tar.xz (sig) [12,467Kb] 19 Jan 2017

这样的东西。

其实就是 PHP 的源码被三种不同的压缩方式压缩成压缩包。

反正随便选,都可以用 tar 解压的。

选好你想下载的文件,点开它,就可以看到有很多镜像下载地址。

如果你是国内的主机,找到 China,复制 cn2.php.net 链接下的地址就可以了。

就像这样:http://cn2.php.net/get/php-7.1.1.tar.bz2/from/this/mirror

然后用你的 wget 或者 curl 去下载吧。任选一个命令:

1
2
wget http://cn2.php.net/get/php-7.1.1.tar.bz2/from/this/mirror
curl http://cn2.php.net/get/php-7.1.1.tar.bz2/from/this/mirror -o php-7.1.1.tar.bz2

准备安装 PHP 7 源代码

安装必要的库

熟悉编译安装软件的老司机肯定记得,在 ./configure 之前一定要装些什么。

不然有可能会碰到下面的话:

1
configure: error: xml2-config not found. Please check your libxml2 installation.

下面,我很贴心的给了万能 yum 命令,供君运行:

1
yum -y install gcc g++ 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

因为怕了大家可能没安装一些必要的软件,好比说 GCC 之类的,所以都给加上了。

反正多了也不怕,yum 会看你有没有装的。

configure

装好了必要的东西,就可以编译配置啦~

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
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/etc \
--enable-fpm \
--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

安装 PHP 7

一行搞定:

1
make && make install

编译安装完毕,就看到类似的话:

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
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/
Installing PHP CLI binary: /usr/local/php/bin/
Installing PHP CLI man page: /usr/local/php/php/man/man1/
Installing PHP FPM binary: /usr/local/php/sbin/
Installing PHP FPM config: /usr/local/php/etc/
Installing PHP FPM man page: /usr/local/php/php/man/man8/
Installing PHP FPM status page: /usr/local/php/php/php/fpm/
Installing phpdbg binary: /usr/local/php/bin/
Installing phpdbg man page: /usr/local/php/php/man/man1/
Installing PHP CGI binary: /usr/local/php/bin/
Installing PHP CGI man page: /usr/local/php/php/man/man1/
Installing build environment: /usr/local/php/lib/php/build/
Installing header files: /usr/local/php/include/php/
Installing helper programs: /usr/local/php/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/php/lib/php/
[PEAR] Archive_Tar - installed: 1.4.0
[PEAR] Console_Getopt - installed: 1.4.1
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util - installed: 1.3.0
[PEAR] PEAR - installed: 1.10.1
Wrote PEAR system config file at: /usr/local/php/etc/pear.conf
You may want to add: /usr/local/php/lib/php to your php.ini include_path
/root/php-7.1.1/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin
ln -s -f phar.phar /usr/local/php/bin/phar
Installing PDO headers: /usr/local/php/include/php/ext/pdo/

配置 PHP

配置环境变量

1
vi /etc/profile

在文件的最末尾填上:

1
2
PATH=$PATH:/usr/local/php/bin
export PATH

保存修改,然后执行 source /etc/profile 使环境变量配置生效。

安装 PHP-FPM

1
2
cp sapi/fpm/init.d.php-fpm /usr/local/bin/php-fpm
chmod +x /usr/local/bin/php-fpm

初始化 PHPPHP-FPM 的配置

1
2
3
cp php.ini-production /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 不会访问到一些奇奇怪怪的敏感目录,所以 PHP-FPM 的用户和用户组一定要严格管控权限。

只能让我们自己的网站访问到自己的网站目录,其他地方都不行。

这样就需要改一下 PHP-FPM 的用户和用户组啦。

本文不教怎么管理 *inx 系统的文件权限,有机会再说

假设我们用 website 用户组管控网站,那就先用 groupadd website 创建好这个用户组。

假设我们要做主页 wwwPHP, 那么就创建用户 site-wwwadduser -g website site-www

还有一步,就是 vi /etc/passwdsite-wwwbash 改回 /sbin/nologin 来防止这个用户被登录。

然后回去 /usr/local/php/etc/php-fpm.d/www.conf,改一下下面的东西:

1
2
3
4
5
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
user = nginx
group = nginx
  • user 改成 site-www
  • group 改成 website

保存好 www.conf 就可以啦。

搞完这些,就运行 php-fpm start,这就是见证奇迹的时刻!

开机自启动 PHP-FPM

先添加服务:

1
vim /etc/systemd/system/php-fpm.service

内容加上:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/php-fpm start
ExecReload=/usr/local/bin/php-fpm reload
ExecStop=/usr/local/bin/php-fpm stop

[Install]
WantedBy=multi-user.target

保存服务配置之后,设置开机自启动:

1
systemctl enable php-fpm.service

配置 NGINX

这一步很关键。我们需要对要用 PHP 的网站配上 PHP 的配置。

假设原来的网站的配置是下面这样的:

1
2
3
4
5
6
server {
listen 80;
server_name sloth.com;

root /var/www/sloth;
}

配置默认 index 文件

我们需要在 NGINXhttp 或者 server 这两个层加上:

1
index  index.html index.htm index.php;

不然的话,NGINX 是不知道 index.php 是首页文件的。

这样有可能访问 http://sloth.com 会出现 404 Not Found 的情况。

加上 php 文件解析

在你要开启 PHP 的网站的 server 配置项下,补充上:

1
2
3
4
5
6
7
8
9
location ~ \.php$ {
try_files $uri = 404;

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_hide_header X-Powered-By;
include fastcgi_params;
}
  • try_files 那行: URI上的文件不存在就直接返回NGINX404错误,而不是交给 PHP-FPM 再判定文件不存在;
  • fastcgi_pass: 套路来的。PHP-FPM 默认端口是 :9000,当然你用套接字的办法就用 unix: 吧;
  • fastcgi_index: 套路来的。在CGI上的默认 index
  • fastcgi_fastcgi_param: 套路来的。传给 PHP-FPM 让它老人家知道 php 文件在哪里;
  • fastcgi_hide_header 那行:隐藏 PHP 的版本号,防止黑客试图揣测;
  • include fastcgi_params;: 套路。调用 FASTCGI 的指令集。

所以,折腾完了就长这个样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
server {
listen 80;
server_name sloth.com;

root /var/www/sloth;

index index.html index.htm index.php;
log_not_found off;

location ~ \.php$ {
try_files $uri = 404;

fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_hide_header X-Powered-By;
include fastcgi_params;
}

}

保存到 nginx.conf 里面或者单独建一个文件,自己在 nginx.conf 里面 include 都可以。

重启 NGINX 看效果

nginx -s reload 就可以热重启(重新加载配置)

做了这个动作就可以看到新的网站部署上去啦~

是不是很简单?

(有没有发现上面的话有点熟悉)

反正,按这个步骤走,PHP 7 就稳稳地装在了你的小服务器上啦。

除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文地址:https://blog.micblo.com/2017/01/24/CentOS7%E9%87%8D%E8%A3%85%E4%B9%8B%E8%B7%AF-PHP7%E5%AE%89%E8%A3%85%E4%BD%BF%E7%94%A8%E7%AF%87/