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)获取下载地址
当前稳定版本是7.3.0
选择中国镜像下载。
②下载解压安装
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有什么区别》
在检查编译环境时,出现错误了。
error: libxml2 not found. Please check your libxml2 installation.
错误:未找到libxml2。请检查libxml2的安装。
意思就是我们服务器没有安装libxml2,这个也好解决,我们直接用apt-get方式安装。
apt-cache pkgnames | grep libxml2 查找安装包 apt-get install libxml2-dev 安装
重新检查编译环境,然后还会陆续出现其他问题,基本上都是缺少各种库,缺什么我们就装什么。实在搞不定的,就多去百度搜索下解决问题的方法。
可能需要用到安装的库有:
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)
《PHP在编译时报错error unsupported size of off_t》
make && make install 编译安装
安装的过程需要等一定的时间。
友情提示:
在以后的使用中,可能会因某些拓展没有编译进去,PHP需要重新编译,如果之前有make编译后的文件没清理,需要先执行make clean再执行配置和编译。
③拷贝PHP配置文件
#复制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文件。
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
php-fpm.conf可以细分很多子配置文件,放到/usr/local/php/etc/php-fpm.d目录下,以“.conf”结尾。
/usr/local/php/etc/php-fpm.d目录下有一个配置文件模板,我们复制一份
cp www.conf.default www.conf
看下www.conf的内容:
可以更改启动PHP进程的用户和用户组。
建议:PHP与nginx设置一样的用户、用户组。
PHP进程监听的端口默认是9000。
查看下PHP版本:
/usr/local/php/bin/php -v
用file命令看下PHP的位数:是64位的
file /usr/local/php/bin/php
⑤启动php-fpm:
/usr/local/php/sbin/php-fpm
出现错误了,错误的原因获取不到nobody组的id
这是因为系统中没有nobody组,现在修改配置文件,用户组暂时改为系统自带的组 nogroup。
再次启动成功了。
到这一步PHP就算是安装成功了。
PHP安装好了,但Nginx还不能处理PHP文件,我们还需要去Nginx做下配置。下节,我们继续讲解如何配置Nginx支持PHP。
拓展知识:
新增了一个监听端口: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。又处于安全的考虑,怎么只限定特定的几个主机访问呢?
其实这个也很简单:
在配置文件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。