第十七章:第39节Linux(ubuntu)配置nginx支持php

更新于:2021-05-22 14:58:44

开始配置Nginx支持PHP。


建议:PHP与nginx运行设置一样的用户、用户组。为了安全起见把php安装目录设置为root用户(755)。

nginx的临时文件目录介绍

总感觉使用nobody、nogroup不好,因为有可能其他的服务进程也会用到。更换哪一个呢?楠神发现ubuntu中有www-data用户、www-data用户组,Apache默认的就是使用的这个,我就把Nginx、PHP也改成www-data用户、用户组吧。如果你的Linux系统中没有www-data用户、用户组,可以自己动手建一个,名称不限。


①修改php-fpm配置


vi修改/usr/local/php/etc/php-fpm.d/www.conf


我们重启下php-fpm,怎么重启呢?


php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/php-fpm (start|stop|reload)等命令,所以我们需要用kill(信号)控制。


#php-fpm 关闭:
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

#php-fpm 重启:
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

#注意是反引号,不是单引号。


php-fpm启动,重启,终止操作


1.png


php-fpm子进程已变成www-data用户启动。


②修改Nginx配置

vi nginx目录/conf/nginx.conf


第一处:

1.png

因为楠神的服务器是2核的,设置两个工作进程。


第二处:

1.png

多加index.php作为默认首页。


第三处:

1.png

去掉注释,改成:

        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            try_files $uri = /404.html;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }


保存好Nginx配置文件


nginx目录/nginx -s reload 重启nginx


1.png


查看下Nginx能不能执行PHP文件。


③执行PHP文件


1.png


打开浏览器:

1.png


OK,成功了!nginx可以执行PHP文件了。


扩展阅读《nginx中try_files》、《Nginx配置禁止IP直接HTTP/HTTPS访问》、《nginx日志按天数进行保存》、《nginx安全设置——限定PHP脚本运行


不通过Nginx在命令行直接用解释器执行PHP脚本文件(cli模式):


我们安装完PHP,有两个常用的执行文件:/usr/local/php/sbin/php-fpm、/usr/local/php/bin/php


/usr/local/php/sbin/php-fpm 启动PHP进程的可执行文件

/usr/local/php/bin/php 是PHP解释器


1.png


执行/usr/local/php/bin/php,把PHP脚本文件当成参数


1.png


PHP脚本文件可以正常执行。


使用别名简化:

1.png


alias php='/usr/local/php/bin/php'
php test.php


当前Linux用户使用的命令解释器是/bin/bash,也可以在/bin目录中添加一个软连接

1.png

ln -s /usr/local/php/bin/php /bin


先去掉PHP命令别名:


1.png


PHP脚本文件可以执行,这样“php”可以当成一个命令来使用了。哈哈。


用PHP命令执行PHP脚本文件,脚本文件中可以使用类似“require_once”文件加载控制语句,唯一与在Nginx中执行PHP脚本文件不一样的地方:


给PHP脚本文件传参,无法模拟http中以post、get方式传参。


1.png


但可以使用$_SERVER['argv']接收参数


1.png


备注:$_SERVER['argv']、$_SERVER['argc']在命令行下可以使用如下代码替代:

global $argv;//先用global关键字声明,$argv的值 == $_SERVER['argv']
global $argc;//先用global关键字声明,$argc的值 == $_SERVER['argc']


有个地方需要说明白,php解释器执行PHP脚本文件,PHP脚本文件需要有读权限即可,不需要给它分配执行权限。此处,两个“执行”所表达的意思不一样。

第一个“执行”是翻译、解释的意思【PHP脚本文件要有可读权限】,第二个“执行”是运行的意思【PHP解释器文件(/usr/local/php/bin/php)要有可执行权限】。


其他注意的地方:


1)php脚本文件的名称有没有“.php”后缀无所谓,只要求文件的内容符合PHP语法。


2)脚本运行时间默认是0,它不受php.ini配置文件限制。这个可以写个PHP脚本,用phpinfo函数打印下即可验证:

通过Nginx执行PHP脚本的phpinfo函数

1.png

直接使用PHP解释器执行phpinfo函数

1.png


3)注意当前执行PHP解释器用户的权限问题

1.png


扩展阅读《简述PHP的标准输入与输出