在我的系统更新后,我遇到了在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
Run Code Online (Sandbox Code Playgroud)
但它没有解决问题,当我重新启动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
Run Code Online (Sandbox Code Playgroud)
如果我在每个条目中添加这些字符串:
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
Run Code Online (Sandbox Code Playgroud)
一切正常.
所以看起来不包括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
Run Code Online (Sandbox Code Playgroud)
Jas*_*wer 27
/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
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
示例/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
Run Code Online (Sandbox Code Playgroud)
每个池应该使用不同的套接字.如果您有多个池使用相同的套接字,您将遇到问题.
指令user和group控制该池的FPM进程将运行的用户/组.这些不指定套接字的用户/组.
指令listen.owner并listen.group控制套接字用于该池的用户/组.
池指令(如listen.*)仅适用于池.因此,您不能在全局部分中使用它们,您必须为每个池指定它们.
权限0660完全没问题,listen.owner并且listen.group与网络服务器相同.您甚至可以使用0600,但有人可能会争辩说,任何可以在与Web服务器相同的组下运行的用户也可以使用套接字,所以我会使用0660.
小智 7
只需在此处添加该listen.acl_users指令应该被注释,否则,它将覆盖listen.owner和listen.group值:
; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
; mode is set to 0660
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored
;listen.acl_users = apache,nginx
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54058 次 |
| 最近记录: |