背景:

nginx是通过源码安装,php环境和php-fpm是通过apt-get自动安装。

以下记录下出现的几个问题及方法

一、访问php文件无法识别

安装nginx和fpm完成之后,通过在nginx的容器中添加一个php的测试页面为test.php,代码只写

<?php
phpinfo();
?>

其中通过页面访问方式如图所示

freebsd nginx都有啥服务 nginx fpm_unix

解决办法:

找到nginx的安装路径,找到nginx.conf,每个人的nginx安装目录位置不一样,我的nginx.conf在/usr/local/nginx/conf/下面。将已经注释掉对php的解析记录启用

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

但是因为我安装php-fpm是默认安装的,有进程,但是并无监听端口9000,此时如果nginx要这样子设置,页面是会报502错误。

所以正确方法最好是修改nginx.conf为下面的代码,通过soker的方式进行访问。

 

location ~ \.php$ {

fastcgi_pass unix:/run/php/php7.0-fpm.sock;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

 

解释:fastcgi_pass unix的值并不是固定的,要根据自己的按照路径来。

需要与/etc/php/7.0/fpm/pool.d/www.conf  中listen的值保持一致。

 二、nginx日志提示Permission denied

按照一的操作之后,本以为就算可以了,可是访问页面还是502错误。于是通过查看nginx的日志提示下面的错误

2019/02/18 17:23:36 [crit] 1745#0: *1 connect() to unix:/run/php/php7.0-fpm.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.83.1, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", host: "192.168.83.130:8090"

 

从错误中可以看出Permission denied,意思是权限拒绝,意思是要访问run/php/php7.0-fpm.sock,但是权限不够被拒绝。

nginx和fpm的关系:

Nginx下php解释器使用最多的就是fastcgi。一般情况nginx把php请求转发给fastcgi管理进程处理,fastcgi管理进程选择cgi子进程进行处理,然后把处理结果返回给nginx。

在这个过程中就牵涉到两个用户,一个是nginx运行的用户,一个是php-fpm运行的用户。如果访问的是一个静态文件的话,则只需要nginx运行的用户对文件具有读权限或者读写权限。

而如果访问的是一个php文件的话,则首先需要nginx运行的用户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm用户对文件具有有读权限或者读写权限。

nginx和fpm的之间的关系可以参考更详细的解释    

查看思路:

1、用命令:ps -ef| grep nginx查看nginx的拥有者

freebsd nginx都有啥服务 nginx fpm_nginx_02

2、用命令;ps -ef| grep fpm查看php-fpm的拥有者

 

freebsd nginx都有啥服务 nginx fpm_unix_03

此时发现nginx的拥有者为nobody,php-fpm的拥有者为www-data,如遇到了nginx用户要访问php文件,则此时却是就没有了权限。

解决办法:将nginx的拥有者和fpm的拥有者保持一致,并添加权限可以访问

1、nginx的拥有者在/usr/local/nginx/conf下的开头查看,默认是注释掉,切用户为nobody

freebsd nginx都有啥服务 nginx fpm_nginx_04

2、查看fpm的用户,在/etc/php/7.0/fpm/pool.d/www.conf查看

user和group的值即是用户fpm的值

 

freebsd nginx都有啥服务 nginx fpm_php_05

 

 listen.owner的值默认是注释的,也可以去掉注释,与上面保持一致、

 

freebsd nginx都有啥服务 nginx fpm_nginx_06

 以上都是将nginx和fpm的用户设置成了www-data。

3、给www-data赋予访问run/php/php7.0-fpm.sock 权限

 

chmod 0660 /run/php/php7.0-fpm.sock

chown www-data:www-data /run/php/php7.0-fpm.sock

最后把nginx和fpm都重启一遍,此时再访问,成功访问php页面

freebsd nginx都有啥服务 nginx fpm_nginx_07