Nginx 和 PHP 是两个独立的程序,它们之间在正常的情况系是没有任何关系的,但是我们又希望 Nginx 在收到 PHP 的动态请求时,可以将请求发送到 PHP的解析器并将结果返回给用户的浏览器。那么就需要有一个通用的交互协议来处理它们间的交互流程,这个协议就叫 FastCGI协议。
当 Nginx 碰到需要 PHP 处理的请求后,都会通过 FastCGI 协议传递到 PHP 的 FastCGI 解析器上,然后会由这个解析器来执行这个请求,并将结果返回给 Nginx,再由 Nginx 将结果返回给用户的浏览器。那么在执行这个 FastCGI 协议的时候,就需要一个进程来解析这个协议并且调用 PHP FastCGI 解析器 ,这个进程就叫 php-fpm(php-fastcgi process manager) 。
HP-FPM 与 Nginx 通信方式有两种,一种是基于TCP的 Internet domain socket 方式,一种是 UNIX domain socket 方式。
UNIX domain socket 可以使同一台操作系统上的两个或多个进程进行数据通信。UNIX domain socket 的接口和 Internet domain socket 很像,但它不使用网络底层协议来通信。
服务器压力不大的情况下,这两种方式性能差别不大,但在压力比较满的时候,用UNIX domain socket方式,效果确实比较好。
安装php与php-fpm
直接运行 sudo apt-get命令安装 PHP 会报错误
E: Unable to locate package php7.1 E: Couldn't find any package by regex 'php7.1'
原因是 PHP7 等并不在 Ubuntu的软件库中,因此要使用 PPA ppa:ondrej/php 库
使用下列命令:
sudo apt-add-repository ppa:ondrej/php sudo apt update sudo apt install php7.1 php7.1-fpm
PHP7.1-FPM以及与Nginx集成
修改Nginx配置
vim /etc/nginx/sites-available/default
打开后是这样的:
我们需要做如下修改:
1.添加index.php作为我们的起始页面;
2.修改server_name来指向我们的域名或者是公网IP;
改后是这样的
验证配置文件有没有错误:
nginx -t
如果提示OK则说明配置搞定:
重启Nginx:
/etc/init.d/nginx restart
测试PHP与Nginx有没有集成成功
添加一个info.php:
vim /var/www/html/info.php
内容为:
<?php phpinfo(); ?>
访问http://xx.xx.xx.xx/info.php(或者是你的域名),如下图所示则说明全部安装成功
配置好后重启服务:
/etc/init.d/nginx restart /etc/init.d/php7.1-fpm restart
PS:/etc/nginx/sites-available/default与/etc/php/7.1/fpm/pool.d/www.conf中监听同一个 sock。也就是如图所示的要一致。
如果不一致就会出现如图所示的问题