第十七章:第38节Linux(ubuntu)编译方式安装php

更新于:2020-12-28 11:56:43

Nginx服务器安装好了,但它现在还不能执行PHP脚本文件,我们需要安装PHP解释器软件。


说下Apache与Nginx两个服务器软件与PHP解释器的搭配是不一样的。


Apache能够执行PHP脚本文件,需要把PHP解释器当做Apache的一个模块(mod_php)来运行,意思是PHP没有独立的进程,PHP是Apache进程的一部分。


Nginx就与Apache不一样,PHP是独立进程存在,有PHP动态脚本请求,Nginx就按照fastcgi协议格式交由PHP进程来处理。


Apache这种方式的弊端就是内存占用大,不论是否用到 PHP 解释器都会将其加载到内存中,典型的就是处理CSS、JS之类的静态文件是完全没有必要加载解释器。


接下来我们开始安装PHP解释器:


PHP的安装:


①进入官网(www.php.net)获取下载地址


1.png

当前稳定版本是7.3.0


1.png


选择中国镜像下载。


②下载解压安装


cd /usr/local/src
wget http://120.52.51.14/cn2.php.net/distributions/php-7.3.0.tar.gz


tar zxvf php-7.3.0.tar.gz 解压目录
cd php-7.3.0 进入目录


./configure   --help 查看安装帮助(英文)
./configure --prefix=/usr/local/php \
 --with-config-file-path=/etc \
 --with-openssl \
 --with-curl \
 --with-freetype-dir \
 --with-gd \
 --with-gettext \
 --with-iconv-dir \
 --with-kerberos \
 --with-libdir=lib \
 --with-libxml-dir \
 --with-mysqli \
 --with-pcre-regex \
 --with-pdo-mysql \
 --with-pdo-sqlite \
 --with-pear \
 --with-png-dir \
 --with-jpeg-dir \
 --with-xmlrpc \
 --with-xsl \
 --with-zlib \
 --enable-fpm \
 --enable-bcmath \
 --enable-libxml \
 --enable-inline-optimization \
 --enable-mbregex \
 --enable-mbstring \
 --enable-opcache \
 --enable-pcntl \
 --enable-shmop \
 --enable-soap \
 --enable-sockets \
 --enable-sysvsem \
 --enable-xml \
 --enable-zip


备注:上面每一行代表一个参数,无值使用缺省值。


如果出现这样的错误:

WARNING: unrecognized options: --xxx

就把--xxx从选项中去掉。

楠神为两个参数赋值:

--prefix=/usr/local/php 安装路径

--with-config-file-path=/etc php.ini存放位置,缺省值放在/usr/local/lib上面

--with-libdir=lib,指定/usr下的库目录,有些系统/usr下会有lib64目录(centos)


上面的编译参数是7.3版本的,7.4版本会有所不同,有些参数要把--with改成--enable

./configure \
 --prefix=/usr/local/php \
 --with-fpm-user=jsf-manager \
 --with-fpm-group=jsf-group \
 --with-config-file-path=/etc \
 --with-openssl \
 --with-curl \
 --with-freetype \
 --enable-gd \
 --with-gettext \
 --with-iconv-dir \
 --with-kerberos \
 --with-libdir=lib \
 --with-libxml \
 --with-mysqli \
 --with-pdo-mysql \
 --with-pdo-sqlite \
 --with-pear \
 --with-external-gd \
 --with-webp \
 --with-jpeg \
 --with-xpm  \
 --with-xmlrpc \
 --with-xsl \
 --with-zlib \
 --enable-fpm \
 --enable-bcmath \
 --enable-inline-optimization \
 --enable-mbregex \
 --enable-mbstring \
 --enable-opcache \
 --enable-pcntl \
 --enable-shmop \
 --enable-soap \
 --enable-sockets \
 --enable-sysvsem \
 --enable-xml \
 --with-zip


编译php ./configure命令enable和with有什么区别


在检查编译环境时,出现错误了。


1.png


error: libxml2 not found. Please check your libxml2 installation.

错误:未找到libxml2。请检查libxml2的安装。


意思就是我们服务器没有安装libxml2,这个也好解决,我们直接用apt-get方式安装。


apt-cache pkgnames | grep libxml2 查找安装包
apt-get install libxml2-dev 安装

1.png


重新检查编译环境,然后还会陆续出现其他问题,基本上都是缺少各种库,缺什么我们就装什么。实在搞不定的,就多去百度搜索下解决问题的方法。


可能需要用到安装的库有:


apt-get install openssl

apt-get install libssl

apt-get install libcurl4-openssl-dev

apt-get install libpng-dev

apt-get install libfreetype6-dev

apt-get install libxslt1-dev

apt-get install libzip-dev


这些库安装到了/usr/lib/x86_64-linux-gnu/目录(或者centos是/usr/lib64


1.png


ubuntu源码编译安装php常见错误解决办法

PHP在编译时报错error unsupported size of off_t


make && make install 编译安装


安装的过程需要等一定的时间。


友情提示:

在以后的使用中,可能会因某些拓展没有编译进去,PHP需要重新编译,如果之前有make编译后的文件没清理,需要先执行make clean再执行配置和编译


③拷贝PHP配置文件


1.png

#复制php生成环境下的配置文件到安装目录
cp php.ini-production /usr/local/php/etc/php.ini
#添加软链接到 /etc目录
ln -s /usr/local/php/etc/php.ini  /etc/php.ini
#复制一份php-fpm配置文件模板
cp /usr/local/php/etc/php-fpm.conf.default  /usr/local/php/etc/php-fpm.conf
#添加软链接到 /etc目录
ln -s /usr/local/php/etc/php-fpm.conf  /etc/php-fpm.conf


说明:


上面的操作为PHP正式添加两个配置文件。

一个是php.ini,这个我们很熟悉了,PHP的配置文件。如果配置文件的路径是/usr/local/php/lib,就把它放到lib目录里。(PHP安装成功后,是可以通过phpinfo()函数查看配置文件路径的或者命令行:php --ini)

另一个是php-fpm.conf,这个配置文件是用来配置PHP进程的一个文件,也就是说我们用Apache做web服务器,PHP就不需要配置这个文件了。


④修改配置文件


在启动PHP进程之前,看下php-fpm.conf文件。


1.png

pid = run/php-fpm.pid           

打开这个配置,注意:如果不存在可以忽略,请勿手动添加,否则PHP启动会报错。

当我们启动php-fpm以后,会生成/usr/local/php/var/run/php-fpm.pid文件,文件里记录的是php-fpm master进程id。


在php-fpm.conf最后面有一行代码:

include=/usr/local/php/etc/php-fpm.d/*.conf

1.png


php-fpm.conf可以细分很多子配置文件,放到/usr/local/php/etc/php-fpm.d目录下,以“.conf”结尾。


1.png

/usr/local/php/etc/php-fpm.d目录下有一个配置文件模板,我们复制一份

cp www.conf.default www.conf


看下www.conf的内容:


1.png


可以更改启动PHP进程的用户和用户组。

建议:PHP与nginx设置一样的用户、用户组

nginx的临时文件目录介绍


1.png


PHP进程监听的端口默认是9000。


php-fpm 启动参数及重要配置详解


查看下PHP版本:

/usr/local/php/bin/php -v

1.png

用file命令看下PHP的位数:是64位的

file /usr/local/php/bin/php

1.png


⑤启动php-fpm:

/usr/local/php/sbin/php-fpm

1.png


出现错误了,错误的原因获取不到nobody组的id

这是因为系统中没有nobody组,现在修改配置文件,用户组暂时改为系统自带的组 nogroup。


再次启动成功了。


1.png


到这一步PHP就算是安装成功了。


PHP安装好了,但Nginx还不能处理PHP文件,我们还需要去Nginx做下配置。下节,我们继续讲解如何配置Nginx支持PHP。


拓展知识:


1.png


新增了一个监听端口:9000端口。


处于监听(LISTEN)状态的记录行Local Address (本地地址)这一项,

如果Local Address ip是0.0.0.0,表示端口完全对外开放;

如果Local Address ip是127.0.0.1,说明只对本机访问,其他主机都访问不了此端口。

::: 这三个英文冒号,前两个是“0:0:0:0:0:0:0:0”的缩写,相当于IPv6的“0.0.0.0”,就是本机的所有IPv6地址,第三个是IP和端口的分隔符。


解释:


0.0.0.0 包括了当前服务器可被请求的所有ip,有公网ip、内网ip、127.0.0.1(回送地址,本地机)。

外网的主机请求当前服务器的端口,使用的是外网ip。

同一局域网的主机请求当前服务器的端口,既可以使用外网ip,又可以使用内网ip(都是使用内网ip,内网ip宽带足,稳定)。

同一服务器进程之间的端口请求三种ip都可以请求,当然我们都是使用本地机ip(127.0.0.1)。


所以说,

Local Address ip是0.0.0.0 没有任何限制,任何主机都可以请求;

Local Address ip是127.0.0.1,公网、内网的其他主机都无法用127.0.0.1访问当前服务器,所以只能是本机进程之间做请求。

Local Address ip是内网ip,外网(公网)的主机无法访问当前服务器,但内网是可以访问的。本机使用内网ip也可以访问,使用127.0.0.1应该不能访问(暂时没有做过测试)。


楠神用☆标注的这两句话有特殊情况出现,详情解释在教程末尾。


内网ip常用ip段:

A类:10.0.0.0-10.255.255.255
B类:172.16.0.0-172.31.255.255
C类:192.168.0.0-192.168.255.255


php解释器进程的端口号是9000,我们这个端口号不对外开放,只对处于同一服务器的Nginx开放,所以监听IP地址设成127.0.0.1。

如果PHP解释器需要对内网的其他服务器开放端口,可以在配置文件中把“127.0.0.1:9000”改成“内网ip:9000”。


如果PHP解释器需要对外网主机开放端口,需要在配置文件中把ip地址设成0.0.0.0。又处于安全的考虑,怎么只限定特定的几个主机访问呢?


其实这个也很简单:


1.png


在配置文件www.conf中打开这个参数(允许连接的客户端ip)

;listen.allowed_clients = 127.0.0.1

多个ip用“,”隔开。


处于安全的考虑,好多软件程序都可以设置ip限制,比如Nginx、mysql、memcache都有。可阻挡恶意ip入侵,起到一定安全作用。


☆详解


外网的主机请求当前服务器的端口,使用的是外网ip。

Local Address ip是内网ip,外网(公网)的主机无法访问当前服务器,但内网是可以访问的。本机使用内网ip也可以访问,使用127.0.0.1应该不能访问(暂时没有做过测试)。 


上面这两句话有个前提,服务器网卡必须有配置外网IP。这也是楠神刚注意的一个问题,我在腾讯云上买的服务器:

其实只有一个网卡“eth0”,显示配置的是内网IP,那互联网用户是怎么通过访问我服务器外网IP请求我服务器的呢?


是这样的原因:


腾讯云说:“主网卡配置请不要随意调整,安装系统时腾讯云会自动将网卡的 IPADDR 配置为内网 IP。腾讯云的基础设施能够自动实现内外网地址的转换。”


也就是说现在大多云服务器是没有直接配置外网IP的网卡的,都是通过NAT转换的,所以互联网用户访问我服务器应用端口,显示的Local Address ip都是内网ip。


浅谈网络地址转换(NAT)技术与内网、外网