LINUX环境下NGINX链接不上FPM,TP支持pathinfo

本文记录了在Linux环境下,Nginx无法连接到PHP-FPM的问题及其解决方案。包括如何查看PHP-FPM是否开启、启动PHP-FPM,以及解决Nginx配置中fastcgi_pass的错误,特别是针对ThinkPHP框架的PathInfo支持。此外,还涉及到Nginx和PHP-FPM的用户权限问题,通过设置用户和权限确保能正确访问PHP文件。
https://www.cnblogs.com/qk2014/p/8683493.html
https://www.cnblogs.com/ly912790844/p/10399679.html
https://www.cnblogs.com/pzk7788/p/10341113.html
https://www.cnblogs.com/two-bees/p/10819876.html

linux下查看php-fpm是否开启以及如何开启

对于linux接触很少,对于命令很不熟,今天发现之前部署的站点无法访问了,就想可能是nginx或者php-fpm没有开启。

所以这里记录linux下查看php-fpm是否开启以及如何开启(nginx也是同理)的命令,以备以后快速查看。

 

1、查看php-fpm是否开启

命令:ps -ef|grep php

结果如下:

这应该是没有开启。

2、查看php-fpm的位置

命令:whereis php-fpm

3、开启php-fpm

命令:/usr/local/bin/php-fpm      

4、再次输入命令ps -ef|grep php,查看是否已经开启

这是已经开启了。


背景:

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

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

一、访问php文件无法识别

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

<?php
phpinfo();
?>

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

解决办法:

找到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的之间的关系可以参考更详细的解释    https://www.cnblogs.com/zrp2013/p/4183546.html

查看思路:

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

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

 

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

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

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

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

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

 

 

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

 

 以上都是将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页面

 


php-fpm 配置进程池

什么是 php-fpm :php 是作为一个独立服务存在的,这个服务叫做 php-fpm
什么是 php-fpm pool :也就是 php-fpm 的进程池,这个进程池中运行了多个子进程,用来并发处理所有连接的动态请求
为什么要配置多个 pool :Nginx 接收到 php 动态请求会传给 php-fpm 处理,php-fpm 调用 pool 中的子进程来处理动态请求,如果这个 pool 资源耗尽,会导致其他站点无法访问资源,报 502 错误,因此有必要设置多个 php-fpm pool

默认只配置了一个 php-fpm pool :

[root@localhost ~]$ cat /usr/local/php/etc/php-fpm.conf

[global]                                          # 全局配置 
pid = /usr/local/php/var/run/php-fpm.pid          # php-fpm pid 文件
error_log = /usr/local/php/var/log/php-fpm.log    # php-fpm 错误日志路径

[www]                           # 进程池名称
listen = /tmp/php-fcgi.sock     # The address on which to accept FastCGI requests
listen.mode = 666               # Set permissions for unix socket, read/write permissions must be set in order to allow connections from a web server
user = php                      # Set the user who can accept FastCGI
group = php                     # Set the group who can accept FastCGI
pm = dynamic                    # 设置进程池中子进程的数目为动态的,它的数目基于下面的指令的值,关于 pm 的设置可以参考:https://gist.github.com/sotarok/2767859
pm.max_children = 50            # 同一时刻能够存在的最大子进程的数量
pm.start_servers = 20           # 在启动 php-fpm 时,要启动的子进程数量
pm.min_spare_servers = 5        # 处于空闲状态的最小子进程数量
pm.max_spare_servers = 35       # 处于空闲状态的最大子进程数量
pm.max_requests = 500           # 每个子进程最多能处理多少个请求,达到数量后就自动退出进程池
rlimit_files = 1024             # 限制打开的文件描述符数量,这个一般是通过 ulimit 设置

配置多个 php-fpm pool :

[root@localhost ~]$ cat /usr/local/php/etc/php-fpm.conf

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log

[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php
group = php
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

[www2]
listen = /tmp/php-fcgi2.sock
listen.mode = 666
user = php
group = php
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
[root@localhost ~]$ /usr/local/php/sbin/php-fpm -t
[root@localhost ~]$ /etc/init.d/php-fpm reload
[root@localhost ~]$ ps aux | grep php-fpm

Nginx 如何使用不同的 php-fpm pool :

[root@localhost ~]$ cat /usr/local/nginx/conf/vhost/test.com.conf 
server {
    listen 80;
    server_name www.test.com;
    index index.html index.html index.php;
    root /data/www;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;    # 在这里指定使用哪个进程池
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
    }
} 

 


以前是在本地windows开发,现在将个人项目在虚拟机的linux下开发,但是就遇到了访问其他模块总是index的问题。

这个项目在阿里云服务器运行良好,但是现在却出问题,一样的代码、配置,就只能出在环境问题上。

上网查看了下,也有人遇到这种问题。

原因:thinkphp的url访问:http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...],这个需要支持pathinfo,Apache默认支持,而Nginx不支持。

解决:

1.php.ini中的配置参数cgi.fix_pathinfo = 1
2.修改nginx.conf文件。

location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
#下面两句是给fastcgi权限,可以支持 ?s=/module/controller/action的url访问模式
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
#下面两句才能真正支持 index.php/index/index/index的pathinfo模式
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }

3. 去掉/index.php/

修改nginx.conf文件

location / {
	index index.html index.htm index.php;
	#autoindex on;
	if (!-e $request_filename) {
		rewrite ^(.*)$ /index.php?s=/$1 last;
		break;
	}
}

最终nginx的vhost.conf文件配置:

server {
        listen       80;
        server_name  vbox-lh.cn;
        root   "/media/sf_Project/self/rbz_tp5/public";
        location / {
            index  index.php index.html index.htm;
            if (!-e $request_filename){
		rewrite  ^(.*)$  /index.php?s=/$1  last;
            break;
                                        }
            #autoindex  on;
        }
        location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
			#下面两句是给fastcgi权限,可以支持 ?s=/module/controller/action的url访问模式
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
			#下面两句才能真正支持 index.php/index/index/index的pathinfo模式
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whaxkl

该打赏续费了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值