nginx和php-fpm套接字所有者

 LEE渡 发布于 2023-01-08 13:20

在我的系统更新后,我遇到了在Nginx上运行的PHP应用程序的错误网关错误.

1 connect()到unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock连接到上游时失败(13:权限被拒绝),客户端:xx.xxx.xx.xx,server:localhost ,请求:"GET/HTTP/1.1",上游:"fastcgi:// unix:/var/run/php-fcgi-vhostname-php-fcgi-0.sock:",主持人:"xx.xx.xx. XX"

这个问题是由于使用的php-fpm套接字的权限不好引起的,实际上我认为这/var/run/php-fcgi.sock是由root:rootnginx和php-fpm用作用户所拥有的www-data.

我已经编辑了php-fpm配置/etc/php-fpm.d/www.conf:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

但它没有解决问题,当我重新启动nginx和php-fpm时,套接字是用root:root用户/组创建的.

我发现修复它的唯一方法是将套接字的所有者手动更改为www-data:www-data.但这不是一个真正的解决方案,因为每次重新启动我的服务时,我都要再次应用它.

我该如何解决这个问题?我在CentOS 6.5上

编辑:

我使用Ajenti-V配置我的虚拟主机和我的PHP-FPM.它为每个网站/虚拟主机创建一个新的套接字,并设置它们/etc/php-fpm.conf

他们有这种结构:

[vhostname-php-fcgi-0]
user = www-data
group = www-data

listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 5

如果我在每个条目中添加这些字符串:

listen.owner = www-data
listen.group = www-data
listen.mode = 0666

一切正常.

所以看起来不包括www.conf(也许?).这是我的php-fpm.conf:

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


[global-pool]
user = www-data
group = www-data
listen = /var/run/php-fcgi.sock

pm = dynamic
pm.start_servers = 1
pm.max_children = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 5


[vhostname-php-fcgi-0]
user = www-data
group = www-data

listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 5

Jasper N. Br.. 27

配置文件FPM将读取

/etc/php-fpm.conf是FPM将读取的配置文件(在CentOS上).如果您希望FPM也读取其他配置文件,您需要告诉它.

您可以通过将行include=/etc/php-fpm.d/*.conf放在底部来完成此操作/etc/php-fpm.conf.然后它将读取目录中的所有内容/etc/php-fpm.d(以...结尾.conf).

然后将全局指令和include行放入/etc/php-fpm.conf.这看起来像这样:

[global]

pid = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php5-fpm.log

include=/etc/php-fpm.d/*.conf

/etc/php-fpm.d每个池都有一个单独的文件.

示例/etc/php-fpm.d/global.conf:

[global-pool]

user = www-data
group = www-data

listen = /var/run/php-fcgi.sock

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.start_servers = 1
pm.max_children = 5
pm.min_spare_servers = 1
pm.max_spare_servers = 5

示例/etc/php-fpm.d/vhostname-0.conf:

[vhostname-php-fcgi-0]

user = www-data
group = www-data

listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 5

指令要注意

每个池应该使用不同的套接字.如果您有多个池使用相同的套接字,您将遇到问题.

指令usergroup控制该池的FPM进程将运行的用户/组.这些指定套接字的用户/组.

指令listen.ownerlisten.group控制套接字用于该池的用户/组.

池指令(如listen.*)仅适用于池.因此,您不能在全局部分中使用它们,您必须为每个池指定它们.

套接字权限

权限0660完全没问题,listen.owner并且listen.group与网络服务器相同.您甚至可以使用0600,但有人可能会争辩说,任何可以在与Web服务器相同的组下运行的用户也可以使用套接字,所以我会使用0660.

2 个回答
  • 配置文件FPM将读取

    /etc/php-fpm.conf是FPM将读取的配置文件(在CentOS上).如果您希望FPM也读取其他配置文件,您需要告诉它.

    您可以通过将行include=/etc/php-fpm.d/*.conf放在底部来完成此操作/etc/php-fpm.conf.然后它将读取目录中的所有内容/etc/php-fpm.d(以...结尾.conf).

    然后将全局指令和include行放入/etc/php-fpm.conf.这看起来像这样:

    [global]
    
    pid = /var/run/php-fpm/php-fpm.pid
    error_log = /var/log/php5-fpm.log
    
    include=/etc/php-fpm.d/*.conf
    

    /etc/php-fpm.d每个池都有一个单独的文件.

    示例/etc/php-fpm.d/global.conf:

    [global-pool]
    
    user = www-data
    group = www-data
    
    listen = /var/run/php-fcgi.sock
    
    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660
    
    pm = dynamic
    pm.start_servers = 1
    pm.max_children = 5
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    

    示例/etc/php-fpm.d/vhostname-0.conf:

    [vhostname-php-fcgi-0]
    
    user = www-data
    group = www-data
    
    listen = /var/run/php-fcgi-vhostname-php-fcgi-0.sock
    
    listen.owner = www-data
    listen.group = www-data
    listen.mode = 0660
    
    pm = dynamic
    pm.max_children = 5
    pm.start_servers = 1
    pm.min_spare_servers = 1
    pm.max_spare_servers = 5
    

    指令要注意

    每个池应该使用不同的套接字.如果您有多个池使用相同的套接字,您将遇到问题.

    指令usergroup控制该池的FPM进程将运行的用户/组.这些指定套接字的用户/组.

    指令listen.ownerlisten.group控制套接字用于该池的用户/组.

    池指令(如listen.*)仅适用于池.因此,您不能在全局部分中使用它们,您必须为每个池指定它们.

    套接字权限

    权限0660完全没问题,listen.owner并且listen.group与网络服务器相同.您甚至可以使用0600,但有人可能会争辩说,任何可以在与Web服务器相同的组下运行的用户也可以使用套接字,所以我会使用0660.

    2023-01-08 13:24 回答
  • NGINX以用户身份运行nginx,php5-fpm以用户身份运行www-data.只需添加nginx到组www-data,问题就解决了,nginx可以访问/var/run/php5-fpm.sock.适用于Ubuntu 14.04,nginx 1.7.10,PHP 5.5.9-1ubuntu4.6(fpm-fcgi):

    $ sudo usermod -aG www-data nginx
    

    2023-01-08 13:24 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有